使用execSQL或COMMIT来结束事务

use*_*689 0 sql delphi

结束交易的正确方法是什么?:

Query.SQL.Add('START TRANSACTION;');
-----
-----
Query.SQL.Add('COMMIT;');
Query.ExecSQL;
Run Code Online (Sandbox Code Playgroud)

要么

Query.SQL.Add('START TRANSACTION;');
-----
-----
Query.ExecSQL; 
Query.SQL.Add('COMMIT;');
Run Code Online (Sandbox Code Playgroud)

编辑:或者这样:

.......
.......
try
if not Database1.InTransaction then
Database1.StartTransaction;
Query.ExecSQL;
Database1.Commit;
except  on E : Exception do begin
Database1.Rollback;
Run Code Online (Sandbox Code Playgroud)

Gia*_*mbo 7

通常你必须在try下控制事务,除了防止插入或更新语句的错误..所以我建议在tConnection上使用start transaction而不是在try下使用tquery

try
  AdoConnection1.BeginTrans;
  ----
  ----
  query1.ExecSql;
  AdoConnection1.CommitTrans;
except
  AdoConnection1.RollbackTrans;
  ----- 
  // manage the exception after rollback
  ----- 
end;
Run Code Online (Sandbox Code Playgroud)

注意:将RollbackTrans放在异常管理的第一行非常重要,因为任何其他代码如showmessage或其他任何代码都可以锁定其他用户的数据库表的一部分