利用 SQL Anywhere .NET 数据提供程序,可以使用 SATransaction 对象将语句组合到一起。每条语句都以 COMMIT 或 ROLLBACK 结尾,前者将使您对数据库的更改具有永久性,后者则取消事务中的所有操作。事务完成后,必须创建一个新的 SATransaction 对象以进行进一步更改。此行为有别于 ODBC 和嵌入式 SQL,使用后两者时,事务在执行 COMMIT 或 ROLLBACK 后继续存在,直到事务被关闭。
如果不创建事务,缺省情况下 SQL Anywhere .NET 数据提供程序将在自动提交模式下运行。每个插入、更新或删除后都有隐式 COMMIT,操作一旦完成,便已对数据库进行更改。在这种情况下,更改无法回退。
有关 SATransaction 对象的详细信息,请参见SATransaction 类。
缺省情况下对事务使用数据库隔离级别。但也可以选择在开始事务时使用 IsolationLevel 属性为事务指定隔离级别。指定的隔离级别适用于事务中执行的所有语句。SQL Anywhere .NET 数据提供程序支持快照隔离。
有关隔离级别的详细信息,请参见隔离级别和一致性。
输入 SELECT 语句时 SQL Anywhere 使用的锁定取决于事务的隔离级别。
有关锁定和隔离级别的详细信息,请参见查询过程中的锁定。
下面的示例使用 SATransaction 对象发出然后回退 SQL 语句。事务使用隔离级别 2 (RepeatableRead),这会将正在修改的行写锁定,这样其他任何数据库用户都无法更新该行。
声明并初始化一个 SAConnection 对象。
SAConnection conn = new SAConnection( "Data Source=SQL Anywhere 11 Demo" ); |
打开该连接。
conn.Open(); |
发出 SQL 语句以更改 T 恤衫的价格。
string stmt = "UPDATE Products SET UnitPrice = 2000.00 WHERE name = 'Tee shirt'"; |
创建一个 SATransaction 对象,以使用 Command 对象发出 SQL 语句。
使用事务允许您指定隔离级别。本例中使用了隔离级别 2 (RepeatableRead),以便其他数据库用户无法更新行。
SATransaction trans = conn.BeginTransaction( IsolationLevel.RepeatableRead ); SACommand cmd = new SACommand( stmt, conn, trans ); int rows = cmd.ExecuteNonQuery(); |
回退更改。
trans.Rollback(); |
SATransaction 对象使您可以提交或回退对数据库所做的更改。如果不使用事务,.NET 数据提供程序将在自动提交模式下运行,您将无法回退对数据库所做的任何更改。如果希望这些更改永久保留,可以使用下面的方法:
trans.Commit(); |
关闭 SAConnection 对象。
conn.Close(); |
.NET 2.0 framework 引入了一个新命名空间 System.Transactions,其中包含用于编写事务性应用程序的类。客户端应用程序可以通过一个或多个参与者创建及参与分布式事务。客户端应用程序可以使用 TransactionScope 类隐式地创建事务。该连接对象可以检测周围存在的由 TransactionScope 创建的事务并且自动征用。客户端应用程序还可以创建一个 CommittableTransaction 并且调用 EnlistTransaction 方法进行征用。SQL Anywhere .NET 2.0 数据提供程序支持此功能。分布式事务具有很高的性能开销。建议对于非分布式事务使用数据库事务。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |