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 用法 » 性能提高、诊断和监控 » 应用程序分析教程 » 教程:诊断死锁

 

第 1 课:建立数据库

设置应用程序分析测试数据库 app_profiling.db,创建两个表和两个过程以生成死锁。

前提条件

本课假定您拥有在本教程开头的特权部分中列出的角色和特权: 教程:诊断死锁

本教程假定已创建测试数据库 app_profiling.db。请参见教程:为应用程序分析教程创建测试数据库

上下文和注释

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

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

 任务
  1. 启动 Interactive SQL。单击 [开始] » [程序] » [SQL Anywhere 16] » [管理工具] » [Sybase Central]。

  2. 在 Interactive SQL 中,按以下操作连接到 app_profiling.db

    1. 在 [连接] 窗口中,完成以下字段以连接到测试数据库 app_profiling.db

      1. 在 [验证] 字段中,键入 [数据库]。

      2. 在 [用户 ID] 字段中键入 DBA

      3. 在 [口令] 字段中键入 sql

      4. 在 [操作] 下拉列表中,选择 [启动并连接到此计算机上的数据库]。

      5. 在 [数据库文件] 字段中,键入 C:\AppProfilingTutorial\app_profiling.db

      6. 在 [启动行] 字段中键入 dbeng16 -x tcpip

    2. 单击 [连接]。

  3. 在 Interactive SQL 中,执行以下 SQL 语句:

    1. 创建两个表:

      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. 在每个表中插入值:

      INSERT INTO "deadlock1"("val") VALUES('x');
      INSERT INTO "deadlock2"("val") VALUES('x');
    3. 创建两个过程:



      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. 提交对数据库所做的更改:

      COMMIT;
  4. 关闭 Interactive SQL。

结果

已生成可用于创建死锁的两个表和两个过程。

 另请参见