0

我正在将程序从 Delphi 2005 转换为 Delphi XE2 或 XE3。
它使用带有 Firebird 数据库的 DbExpress。

该程序使用 TSQLQuery.TransactionLevel 来允许它有重叠的事务。
它依赖于这些重叠的事务。

(实际上有多个程序。它们都使用相同的代码来访问数据库。有几个并行运行并偶尔使用 COM 进行通信。它们每个都有自己的 TSQLConnection 并且数据库访问都来自主线程。其中一个程序运行在具有间歇性 RF 网络连接且能够从网络中断中恢复的设备)。

在 Delphi XE2 和 XE3 中,TSQLQuery 不再具有 TransactionLevel 属性。

在没有多个数据库连接的情况下,如何在 Delphi XE2 中获得重叠事务?如果没有其他选择,我将使用多个连接,但这不会是一个微不足道的改变。

请注意,我指的是重叠事务,而不是嵌套事务。这是一个示例,减去检查和 try-finallys。这适用于 Delphi 6 和 Delphi 2005。

procedure TForm1.Test7;
var SQLConnection: TSQLConnection;
    Transaction1, Transaction2: TTransactionDesc;
    Query1, Query2, Query3: TSQLQuery;
begin
SQLConnection := TSQLConnection.Create(nil);
InitialiseFirebirdConnection(SQLConnection);
SQLConnection.Open;

Transaction1.GlobalID := 0;
Transaction1.IsolationLevel := xilREADCOMMITTED;
Transaction1.CustomIsolation := 0;
Transaction1.TransactionId := 7;

Transaction2.GlobalID := 0;
Transaction2.IsolationLevel := xilREADCOMMITTED;
Transaction2.CustomIsolation := 0;
Transaction2.TransactionId := 8;

SQLConnection.StartTransaction(Transaction1);
SQLConnection.StartTransaction(Transaction2);

Query1 := TSQLQuery.Create(nil);
Query1.SQLConnection := SQLConnection;
Query1.SQL.Add('Update "WIDGET" Set "NAME" = ''AAA'' Where "WIDGETID" = 101');
Query1.TransactionLevel := Transaction1.TransactionId;
Query1.ExecSQL;
Query1.Free;

Query2 := TSQLQuery.Create(nil);
Query2.SQLConnection := SQLConnection;
Query2.SQL.Add('Update "WIDGET" Set "NAME" = ''BBB'' Where "WIDGETID" = 102');
Query2.TransactionLevel := Transaction2.TransactionId;
Query2.ExecSQL;
Query2.Free;

Query3 := TSQLQuery.Create(nil);
Query3.SQLConnection := SQLConnection;
Query3.SQL.Add('Update "WIDGET" Set "NAME" = ''CCC'' Where "WIDGETID" = 103');
Query3.TransactionLevel := Transaction1.TransactionId;
Query3.ExecSQL;
Query3.Free;

if Tran1CheckBox.Checked then
  SQLConnection.Commit(Transaction1)
else
  SQLConnection.Rollback(Transaction1);
if Tran2CheckBox.Checked then
  SQLConnection.Commit(Transaction2)
else
  SQLConnection.Rollback(Transaction2);

SQLConnection.Close;
SQLConnection.Free;
end;

如果您在 XE2 帮助文件中查找“管理事务”,它仍然描述如何“......如果您将 TSQLConnection 与 InterBase 数据库一起使用,您可以通过设置其 TransactionLevel 来识别应用程序中具有特定活动事务的每个数据集属性。也就是说,在开始第二个事务后,您可以继续同时处理两个事务,只需将数据集与您想要的事务相关联即可。”

这是一个大型程序,所以我真的不想改变技术或进行重大的重新设计。我希望可能有其他方式设置事务的事务 ID,并将查询与特定事务相关联。

4

0 回答 0