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 的用法 » 使用事务和隔离级别 » 事务阻塞和死锁 » 事务阻塞 » 死锁

 

确定被阻塞的连接

您可以使用 sa_conn_info 系统过程来确定哪些连接在其它哪些连接上受到阻塞。该过程将返回一个结果集,每个连接对应于该结果集中的一行。该结果集中有一列显示连接是否受到阻塞,如果是,则指出它在其它哪个连接上受到阻塞。

有关详细信息,请参见sa_conn_info 系统过程

您还可以使用 Deadlock 事件在发生死锁时执行操作。事件处理程序可以使用 sa_report_deadlocks 过程以获得有关导致死锁的条件的信息。要从数据库服务器检索有关死锁的更多详细信息,请使用 log_deadlocks 选项并启用 RememberLastStatement 功能。

以下过程说明如何设置在发生死锁时用于获取死锁相关信息的表和系统事件。如果发现应用程序频繁发生死锁,您可以使用应用程序分析功能帮助诊断死锁的原因。请参见教程:诊断死锁

 ♦  发生死锁时执行操作
  1. 创建一个表以存储从 sa_report_deadlocks 系统过程返回的数据:



    CREATE TABLE DeadlockDetails(
      deadlockId INT PRIMARY KEY DEFAULT AUTOINCREMENT,
      snapshotId BIGINT,
      snapshotAt TIMESTAMP,
      waiter INTEGER,
      who VARCHAR(128),
      what LONG VARCHAR,
      object_id UNSIGNED BIGINT,
      record_id BIGINT,
      owner INTEGER,
      is_victim BIT,
      rollback_operation_count UNSIGNED INTEGER );
  2. 创建在发生死锁时触发的事件。

    此事件会将 sa_report_deadlocks 系统过程的结果复制到表中,并且通知管理员有关死锁的情况:



    CREATE EVENT DeadlockNotification
    TYPE Deadlock
    HANDLER
    BEGIN
     INSERT INTO DeadlockDetails WITH AUTO NAME
     SELECT snapshotId, snapshotAt, waiter, who, what, object_id, record_id,
            owner, is_victim, rollback_operation_count
        FROM sa_report_deadlocks ();
     COMMIT;
     CALL xp_startmail ( mail_user ='George Smith',
                         mail_password ='mypwd' );
     CALL xp_sendmail( recipient='DBAdmin',
                       subject='Deadlock details added to the DeadlockDetails table.' );
     CALL xp_stopmail ( );
    END;
  3. 将 log_deadlocks 选项设置为 On:

    SET OPTION PUBLIC.log_deadlocks = 'On';
  4. 启用最近执行的语句的记录:

    CALL sa_server_option( 'RememberLastStatement', 'YES' );
 另请参见