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 课:使用快照隔离避免幻像行

可以使用快照隔离级别维护与隔离级别 3 相同的一致性,而且不会造成任何种类的阻塞。销售经理的语句不会被阻塞,会计也不会看到幻像行。

前提条件

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

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

 任务
  1. 会计执行以下语句来启用快照隔离:

    SET OPTION PUBLIC. allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  2. 执行以下语句来列出所有部门:

    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
  3. 销售经理决定设立一个新部门,专门管理国外市场。Philip Chin(EmployeeID 为 129)将作为这个新部门的经理。销售经理执行以下语句为新部门创建一个新条目,该条目作为一个新行出现在销售经理窗口的表底部:

    INSERT INTO GROUPO.Departments
       ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 600, 'Foreign Sales', 129 );
    COMMIT;
  4. 销售经理执行以下语句,列出所有部门:

    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129
  5. 会计可以再次执行他的查询,并且不会看到新行,这是因为事务尚未提交。

    SELECT * FROM GROUPO.Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
  6. 而销售经理想要再增加一个部门来处理针对大型企业合作伙伴的销售业务。销售经理执行以下语句:

    INSERT INTO GROUPO.Departments
     ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 700, 'Major Account Sales', 902 );

    销售经理的更改未被阻塞,因为会计在使用快照隔离。

  7. 会计必须结束他的快照事务,以查看销售经理提交到数据库的更改。

    COMMIT;
       SELECT * FROM GROUPO.Departments
       ORDER BY DepartmentID;

    现在会计看到了 Foreign Sales 部门,但没有看到 Major Account Sales 部门。

    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129
  8. 为了避免更改 SQL Anywhere 示例数据,您应该回退未完成的插入 Major Account Sales 部门行的事务,并使用另一个事务删除 Foreign Sales 部门。

    1. 销售经理执行以下语句来回退当前事务、删除之前插入的行并提交该操作:

      ROLLBACK;
      DELETE FROM GROUPO.Departments
      WHERE DepartmentID = 600;
      COMMIT;

结果

已使用快照隔离成功避免了幻像行。