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

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 监控和提高数据库性能 » 应用程序分析教程 » 教程:诊断死锁

 

第 1 课:设置创建死锁的步骤

当两个或多个事务互相阻塞时,就会发生死锁。例如,事务 A 需要访问表 B,但表 B 被事务 B 锁定。事务 B 需要访问表 A,但表 A 被事务 A 锁定。这时就发生循环阻塞冲突。

当返回 SQLCODE -306 和 -307 时,就明显表示发生死锁。为解决死锁,SQL Anywhere 会自动回退形成该死锁的最后一条语句。如果不断回退语句,则会出现性能问题。

 ♦  形成死锁
  1. 本教程假定您已创建了测试数据库 app_profiling.db。如果尚未创建测试数据库,请参见为应用程序分析教程创建测试数据库

  2. 按照以下操作连接到 app_profiling.db

    1. 在 Sybase Central 中,于 SQL Anywhere 12 插件内选择 [连接] » [使用 SQL Anywhere 12 连接]。

    2. 在 [连接] 窗口中,完成以下字段以连接到测试数据库 app_profiling.db,然后单击 [连接]:

      • 验证   数据库

      • 用户 ID    DBA

      • 口令    sql

      • 操作   启动此计算机上的数据库

      • 数据库文件   C:\AppProfilingTutorial\app_profiling.db

      • 启动行   dbeng12 -x tcpip

  3. 在左窗格中,单击 app_profiling - DBA,然后选择 [文件] » [打开 Interactive SQL]。

    Interactive SQL 启动并连接到 app_profiling.db 数据库。

  4. 在 Interactive SQL 中:

    1. 执行以下 SQL 语句,创建两个随后将用于创建死锁的表:

      CREATE TABLE "DBA"."deadlock1" (
         "id" UNSIGNED BIGINT NOT NULL DEFAULT AUTOINCREMENT, 
         "val" CHAR(1) ); 
      CREATE TABLE "DBA"."deadlock2" ( 
         "id" UNSIGNED BIGINT NOT NULL DEFAULT AUTOINCREMENT, 
         "val" CHAR(1) );
    2. 执行以下 SQL 语句,在每个表中插入值:

      INSERT INTO "deadlock1"("val") VALUES('x');
      INSERT INTO "deadlock2"("val") VALUES('x');
    3. 执行以下 SQL 语句,创建两个随后将用于引发死锁的过程:



      CREATE PROCEDURE "DBA"."proc_deadlock1"(  ) 
         BEGIN 
            LOCK TABLE "DBA"."deadlock1" IN EXCLUSIVE MODE; 
            WAITFOR DELAY '00:00:20:000'; 
            UPDATE deadlock2 SET val='y'; 
         END; 
      CREATE PROCEDURE "DBA"."proc_deadlock2"(  ) 
         BEGIN 
            LOCK TABLE "DBA"."deadlock2" IN EXCLUSIVE MODE; 
            WAITFOR DELAY '00:00:20:000'; 
            UPDATE deadlock1 SET val='y'; 
         END;
    4. 执行以下 SQL 语句,提交对数据库所做的更改:

      COMMIT;
  5. 关闭 Interactive SQL。

  6. 单击以下链接以继续本教程: 第 2 课:创建死锁并捕获与其相关的信息.

 另请参见