事务阻塞可能会导致死锁。出现死锁情况时,一组事务将进入一种特殊状态,在该状态下这些事务都不能继续执行。
有两个原因会导致死锁:
循环阻塞冲突 事务 A 被事务 B 阻塞,而事务 B 又被事务 A 阻塞。显然,等待并不能解决这个问题。必须取消其中一个事务,使另一个事务能够继续执行。如果多个(大于二)事务出现循环阻塞,也会导致这种情况。
所有活动数据库线程均被阻塞 事务被阻塞时,不会释放其数据库线程。如果服务器配置了三个线程,而事务 A、B 和 C 在当前未执行请求的事务 D 上受到阻塞,由于没有可用线程,将出现死锁情况。
为消除事务死锁,SQL Anywhere 会从陷入死锁的连接中选择一个连接,回退对该连接上活动事务的更改并返回错误。SQL Anywhere 使用内部启发式算法选择要回退的连接,该算法优先选择剩余阻塞等待时间最少的连接(由 blocking_timeout 选项确定)。如果所有连接均设置为始终等待,那么促使服务器检测到死锁的连接会被选作牺牲品连接。
为消除线程死锁,SQL Anywhere 会选择最后一个线程进行阻塞,回退对该连接上活动事务的更改并返回错误。
服务器使用的数据库线程数取决于各个数据库的设置。
有关设置数据库线程数量的信息,请参见控制线程行为。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |