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';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  2. 会计执行以下语句,列出太阳帽的价格:

    SELECT ID, Name, UnitPrice
    FROM GROUPO.Products
    ORDER BY ID;
    ID Name UnitPrice
    300 Tee Shirt 9.00
    301 Tee Shirt 14.00
    302 Tee Shirt 14.00
    400 Baseball Cap 9.00
    401 Baseball Cap 10.00
    500 Visor 7.00
    501 Visor 7.00
    ... ... ...
  3. 销售经理执行以下语句,为塑料太阳帽定一个新的销售价格:

    UPDATE GROUPO.Products
    SET UnitPrice = 5.95 WHERE ID = 501;
    COMMIT;
    SELECT ID, Name, UnitPrice FROM GROUPO.Products
    WHERE Name = 'Visor';
  4. 会计再次执行他的查询且并未看到价格的变化,这是因为事务使用第一次读取时提交的数据。

    SELECT ID, Name, UnitPrice
    FROM GROUPO.Products;
  5. 销售经理将塑料太阳帽的价格更改回其原来的价格:

    UPDATE GROUPO.Products
    SET UnitPrice = 7.00
    WHERE ID = 501;
    COMMIT;

    数据库服务器不会在 Products 表中会计正在读取的行上放置读锁定,因为会计正在查看销售经理对 Products 表进行任何修改之前获取的已提交数据的快照。

  6. 会计查看完价格后,由于他不希望无意中更改了数据库,因此使用 ROLLBACK 语句完成他的事务。

    ROLLBACK;

结果

通过使用快照隔离成功避免了非可重复读取。