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 的用法 » 事务和隔离级别 » 隔离级别和一致性 » 快照隔离

 

快照隔离示例

以下示例使用两个到 SQL Anywhere 示例数据库的连接,说明如何使用快照隔离无阻塞地维护一致性。

 ♦ 使用快照隔离
  1. 运行以下命令,创建一个到 SQL Anywhere 示例数据库的 Interactive SQL 连接 (Connection1):

    dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection1"
  2. 运行以下命令,创建一个到 SQL Anywhere 示例数据库的 Interactive SQL 连接 (Connection2):

    dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection2"
  3. 在 Connection1 中,执行以下语句将隔离级别设置为 1(读取已提交的),该隔离级别在当前行上获取并保持读锁定。

    SET OPTION isolation_level = 1;
  4. 在 Connection1 中,执行以下语句:

    SELECT * FROM Products;
    ID Name Description Size Color Quantity ...
    300 Tee Shirt Tank Top Small White 28 ...
    301 Tee Shirt V-neck Medium Orange 54 ...
    302 Tee Shirt Crew Neck One size fits all Black 75 ...
    400 Baseball Cap Cotton Cap One size fits all Black 112 ...
    ... ... ... ... ... ... ...
  5. 在 Connection2 中,执行以下语句:

    UPDATE Products
    SET Name = 'New Tee Shirt'
    WHERE ID = 302;
  6. 在 Connection1 中,再次执行 SELECT 语句:

    SELECT * FROM Products;

    该 SELECT 语句被阻塞且无法继续执行,因为 Connection2 中的 UPDATE 语句未提交或回退。必须等到 Connection2 中的事务完成后,SELECT 语句才能继续执行。这确保了 SELECT 语句不会将未提交的数据读入其结果中。

  7. 在 Connection2 中,执行以下语句:

    ROLLBACK;

    Connection2 中的事务完成,Connection1 中的 SELECT 语句继续执行。

  8. 使用语句快照隔离级别可以获得与隔离级别 1 相同的并发,但不造成阻塞。

    在 Connection1 中,执行以下语句允许快照隔离:

    SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
  9. 在 Connection 1 中,执行以下语句将隔离级别更改为语句快照:

    SET TEMPORARY OPTION isolation_level = 'statement-snapshot';
  10. 在 Connection1 中,执行以下语句:

    SELECT * FROM Products;
  11. 在 Connection2 中,执行以下语句:

    UPDATE Products
    SET Name = 'New Tee Shirt'
    WHERE ID = 302;
  12. 在 Connection1 中,再次执行 SELECT 语句:

    SELECT * FROM Products;

    SELECT 语句执行且不被阻塞,但不包括来自 Connection2 执行的 UPDATE 语句的数据。

  13. 在 Connection2 中,通过执行以下语句完成事务:

    COMMIT;
  14. 在 Connection1 中,完成事务(对 Products 表的查询),然后再次执行 SELECT 语句,以查看更新后的数据:

    COMMIT;
    SELECT * FROM Products;
    ID Name Description Size Color Quantity ...
    300 Tee Shirt Tank Top Small White 28 ...
    301 Tee Shirt V-neck Medium Orange 54 ...
    302 New Tee Shirt Crew Neck One size fits all Black 75 ...
    400 Baseball Cap Cotton Cap One size fits all Black 112 ...
    ... ... ... ... ... ... ...
  15. 通过执行以下语句,撤销对 SQL Anywhere 示例数据库所做的更改:

    UPDATE Products
    SET Name = 'Tee Shirt'
    WHERE id = 302;
    COMMIT;
 另请参见