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

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - SQL 用法 » 事务和隔离级别 » 隔离级别教程 » 教程:了解脏读

 

第 2 课:使用快照隔离避免脏读

快照隔离允许其它数据库连接仅查看响应其查询的已提交数据,从而防止脏读的发生。会计可使用快照隔离来确保未提交的数据不会影响其查询。

前提条件

本课假定您已完成前面的所有课程。请参见第 1 课:创建脏读

本课假定您拥有在教程教程:了解脏读开头的特权部分中列出的角色和特权。

 任务
  1. 销售经理执行以下语句来为数据库启用快照隔离:

    SET OPTION PUBLIC.allow_snapshot_isolation = 'ON';
  2. 作为销售经理,将所有 T 恤衫的价格提高 $0.95:

    1. 执行以下语句来更新价格:

      UPDATE GROUPO.Products
      SET UnitPrice = UnitPrice + 0.95
      WHERE Name = 'Tee Shirt';
    2. 使用销售经理制定的新 T 恤衫价格,计算所有库存商品的总零售额:

      SELECT SUM( Quantity * UnitPrice )
       AS Inventory
         FROM GROUPO.Products;

      将返回以下结果集:

      Inventory
      6687.15
  3. 作为会计,执行以下语句计算所有库存商品的总零售额。由于此事务使用快照隔离级别,因此仅计算已提交到数据库的数据的结果。

    SET OPTION isolation_level = 'Snapshot';
    SELECT SUM( Quantity * UnitPrice )
     AS Inventory
       FROM GROUPO.Products;

    将返回以下结果集:

    Inventory
    6538.00
  4. 作为销售经理,执行以下语句将您的更改提交到数据库:

    COMMIT;
  5. 作为会计,执行以下语句查看当前存货的更新后的零售额:

    COMMIT;
    SELECT SUM( Quantity * UnitPrice )
     AS Inventory
       FROM GROUPO.Products;

    将返回以下结果集:

    Inventory
    6687.15

    由于用于会计的事务的快照以第一次读取操作开始,因此您必须执行 COMMIT 以结束事务,并允许会计在快照事务开始后查看对数据所做的更改。

  6. 作为销售经理,执行以下语句撤销对 T 恤衫价格的更改并将 SQL Anywhere 示例数据库恢复到其原始状态:

    UPDATE GROUPO.Products
    SET UnitPrice = UnitPrice - 0.95
    WHERE Name = 'Tee Shirt';
    COMMIT;

结果

会计通过启用快照隔离成功避免了脏读。

下一个

(可选)将示例数据库 (demo.db) 恢复至其初始状态。请参见重新创建示例数据库 (demo.db)