在Delphi XE2或更高版本中替换TSQLQuery.TransactionLevel

时间:2013-04-11 06:47:01

标签: delphi transactions delphi-xe2 firebird dbexpress

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

该程序使用TSQLQuery.TransactionLevel来允许它具有重叠的事务 它取决于这些重叠交易。

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

TSQLQuery在Delphi XE2和XE3中不再具有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,并将查询与特定事务关联。

0 个答案:

没有答案