强大的跨数据库访问组件 UniDAC使用教程:实现事务支持

Universal Data Access Components (UniDAC)是一款通用数据库访问组件,提供了多个数据库的直接访问,如针对Windows的Delphi,C++Builder, Lazarus (以及 Free Pascal), Mac OS X, iOS,Android,Linux和64和32位的FreeBSD等等。我们将长期的经验集于这个小组件,提供统一的数据库连接访问(如oracle、微软SQL等等)。这意味着你可以在你的项目之间轻松地切换不同的数据库,以及创建跨数据库应用程序接口。

本篇文章描述了如何在UniDAC中实现Transaction(事务)支持。所以你应该要十分熟悉事务,才能很好的理解如何使用UniDAC来控制它们。

简单说一下Transaction(事务)是什么。事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务。

本地事务由TUniConnection组件的StartTransaction,Commit,Rollback和其他方法管理。每次当你准备开始一个事务时,你都应该检查它是否处于活动状态。你可以使用InTransaction属性执行此操作。当事务处于活动状态时调用StartTransaction将导致异常。 以下是一个简短的示例,演示了使用本地事务的一般方法:

if not UniConnection.InTransaction then
UniConnection.StartTransaction;
try
// Do some actions with database. For example:
UniSQL1.Execute;
UniSQL2.Execute;

// Commit the current transaction to reflect changes in database if no errors were raised
UniConnection.Commit;
except
// Rollback all changes in database made after StartTransaction if an error was raised
UniConnection.Rollback;
end;

激活事务后,所有操作(包括打开数据集)都将在当前事务的上下文菜单中执行,直到你提交或rollback(回滚)它为止。如果没有启动任何事务,则每个操作执行的更改将在操作完成后立即反映在数据库中(所谓的AutoCommit模式)。 使用InterBase提供程序时,请注意AutoCommit属性。默认情况下,AutoCommit属性具有True值,导致在有任何数据修改时自动执行CommitRetaining或RollbackRetaining。 将属性设置为False后,你可以自己管理事务。TUniConnection.AutoCommit属性的优先级高于数据集的特定选项“AutoCommit”(TUniQuery,TUniTable)。如果TUniConnection.AutoCommit属性设置为False, 则只能提交所有事务(不管数据集的特定选项“AutoCommit”值)。如果你希望大多数数据集自动提交事务,并且其中一些数据集可以手动控制事务,则应将TUniConnection.AutoCommit属性设置为True,并且仅对具有手动事务控制的数据集,将特定选项“AutoCommit”值设置为False。

可以使用传递给重载的StartTransaction方法的参数来自定义每个显式启动的事务的行为。你可以指定事务的隔离级别以及此事务是否可编辑。StartTransaction主题中有关于这些参数的更详细说明。

UniDAC还支持使用Savepoints。Savepoint方法允许你在事务中定义命名保存点。你可以使用RollbackToSavepoint方法中的保存点名称将数据库中的更改rollback(回滚)到保存点创建时的实际状态。调用RollbackToSavepoint可使当前事务保持活动状态。

CommitRetaining和RollbackRetaining方法类似于Commit和Rollback,但它们保持当前事务处于活动状态。这意味着你不需要像使用Commit和Rollback方法那样调用StartTransaction来继续处理事务。CommitRetaining和RollbackRetaining的功能由InterBase/Firebird/Yaffil服务器支持。 对于其他服务器,此功能通过在Commit或Rollback之后调用StartTransaction来模拟。

类似InterBase的服务器在单个连接中支持多个同时活动的事务,并且在打开游标时需要事务处于活动状态。你可以不用管它,因为UniDAC封装了这些特性,让你以类似于与其他数据库服务器一起工作的方式工作。 如果你想让InterBase服务器的功能参与运行并行事务,你应该将几个TUniTransaction组件放在TCustomUniDataSet的表单和设置属性上,例如使用这些组件的Transaction和UpdateTransaction。Transaction和UpdateTransaction属性仅用于InterBase提供程序。对于其他提供者,将忽略这些属性。

UniDAC使用MTS管理Oracle和Microsoft SQL Server连接的分布式事务。分布式事务由TUniTransaction组件控制。您可以使用AddConnection方法将连接添加到分布式事务上下文。MTS分布式事务协调器允许将连接混合到不同的服务器和不同的服务器类型。

begin
UniConnection1.Connect;
UniConnection2.Connect;

UniTransaction.AddConnection(UniConnection1);
UniTransaction.AddConnection(UniConnection2);

UniTransaction.StartTransaction;

UniSQL1.Connection := UniConnection1;

UniSQL2.Connection := UniConnection2;
try
UniSQL1.Execute;
UniSQL2.Execute;
UniTransaction.Commit;
except
UniTransaction.Rollback;
end;
end;

↓↓↓


分享到:


相關文章: