Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere .NET 数据提供程序

 

事务处理

利用 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),这会将正在修改的行写锁定,这样其他任何数据库用户都无法更新该行。

♦  使用 SATransaction 对象发出语句
  1. 声明并初始化一个 SAConnection 对象。

    SAConnection conn = new SAConnection(
        "Data Source=SQL Anywhere 11 Demo" );
  2. 打开该连接。

    conn.Open();
  3. 发出 SQL 语句以更改 T 恤衫的价格。

    string stmt = "UPDATE Products SET UnitPrice =
        2000.00 WHERE name = 'Tee shirt'";
  4. 创建一个 SATransaction 对象,以使用 Command 对象发出 SQL 语句。

    使用事务允许您指定隔离级别。本例中使用了隔离级别 2 (RepeatableRead),以便其他数据库用户无法更新行。

    SATransaction trans = conn.BeginTransaction(
        IsolationLevel.RepeatableRead );
    SACommand cmd = new SACommand( stmt, conn,
        trans );
    int rows = cmd.ExecuteNonQuery();
  5. 回退更改。

    trans.Rollback();

    SATransaction 对象使您可以提交或回退对数据库所做的更改。如果不使用事务,.NET 数据提供程序将在自动提交模式下运行,您将无法回退对数据库所做的任何更改。如果希望这些更改永久保留,可以使用下面的方法:

    trans.Commit();
  6. 关闭 SAConnection 对象。

    conn.Close();
分布式事务处理

.NET 2.0 framework 引入了一个新命名空间 System.Transactions,其中包含用于编写事务性应用程序的类。客户端应用程序可以通过一个或多个参与者创建及参与分布式事务。客户端应用程序可以使用 TransactionScope 类隐式地创建事务。该连接对象可以检测周围存在的由 TransactionScope 创建的事务并且自动征用。客户端应用程序还可以创建一个 CommittableTransaction 并且调用 EnlistTransaction 方法进行征用。SQL Anywhere .NET 2.0 数据提供程序支持此功能。分布式事务具有很高的性能开销。建议对于非分布式事务使用数据库事务。