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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用事务和隔离级别 » 事务阻塞和死锁 » 事务阻塞

 

死锁

事务阻塞可能会导致死锁。出现死锁情况时,一组事务将进入一种特殊状态,在该状态下这些事务都不能继续执行。

死锁的原因

有两个原因会导致死锁:

  • 循环阻塞冲突   事务 A 被事务 B 阻塞,而事务 B 又被事务 A 阻塞。显然,等待并不能解决这个问题。必须取消其中一个事务,使另一个事务能够继续执行。如果多个(大于二)事务出现循环阻塞,也会导致这种情况。

  • 所有活动数据库线程均被阻塞   事务被阻塞时,不会释放其数据库线程。如果服务器配置了三个线程,而事务 A、B 和 C 在当前未执行请求的事务 D 上受到阻塞,由于没有可用线程,将出现死锁情况。

为消除事务死锁,SQL Anywhere 会从陷入死锁的连接中选择一个连接,回退对该连接上活动事务的更改并返回错误。SQL Anywhere 使用内部启发式算法选择要回退的连接,该算法优先选择剩余阻塞等待时间最少的连接(由 blocking_timeout 选项确定)。如果所有连接均设置为始终等待,那么促使服务器检测到死锁的连接会被选作牺牲品连接。

为消除线程死锁,SQL Anywhere 会选择最后一个线程进行阻塞,回退对该连接上活动事务的更改并返回错误。

服务器使用的数据库线程数取决于各个数据库的设置。

有关设置数据库线程数量的信息,请参见控制线程行为


确定被阻塞的连接
从 Sybase Central 查看死锁