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

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 事务和隔离级别 » 隔离级别教程 » 教程:了解非可重复读取

 

第 2 课:避免非可重复读取

 ♦ 使用快照隔离避免非可重复的读取

您还可以使用快照隔离帮助您避免阻塞。因为使用快照隔离的事务仅查看已提交的数据,所以会计的事务不会阻塞销售经理的事务。

  1. 启动 Interactive SQL。

  2. 在 [连接] 窗口中,以销售经理的身份连接到 SQL Anywhere 示例数据库:

    1. 从 [操作] 下拉列表中单击 [连接到 ODBC 数据源]。

    2. 单击 [ODBC 数据源名称],然后在下方的字段中键入 SQL Anywhere 12 Demo

    3. 如有必要,可单击 [高级] 以显示 [高级选项] 选项卡。

    4. 单击 [高级选项] 选项卡,在 [ConnectionName] 字段中键入 Sales Manager

    5. 单击 [连接]。

  3. 再启动一个 Interactive SQL 的实例。

  4. 在 [连接] 窗口中,以会计的身份连接到 SQL Anywhere 示例数据库:

    1. 在 [操作] 下拉列表中单击 [使用 ODBC 数据源连接]。

    2. 单击 [ODBC 数据源名称],然后在下方的字段中键入 SQL Anywhere 12 Demo

    3. 如有必要,可单击 [高级] 按钮以显示 [高级选项] 选项卡。

    4. 单击 [高级选项] 选项卡,在 [ConnectionName] 字段中键入 Accountant

    5. 单击 [连接]。

  5. 作为会计,执行以下语句为数据库启用快照隔离,并指定使用快照隔离级别:

    SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  6. 会计决定列出太阳帽的价格。作为会计,执行以下语句:

    SELECT ID, Name, UnitPrice
    FROM 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
    ... ... ...
  7. 销售经理决定为塑料太阳帽定一个新的销售价格。作为销售经理,执行以下语句:

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

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

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

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

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

    ROLLBACK;