数据库并发控制-死锁

作者:vkvi 来源:ITPOW(原创) 日期:2009-7-27

产生死锁的原因

产生死锁的原因很多,举个例子:事务 T1 对数据 A 上了 X 锁,现在 T1 要读取数据 B;而另一方面,事务 T2 对数据 B 上了 X 锁,现在 T2 要读取数据 A。T1、T2 都需要对方已经锁定了的数据,相互等待对方释放,这就造成了死锁。

死锁的解决与避免

数据库管理系统(比如 SQL Server)识别到死锁后,会选择互锁的事务中的一个来作为牺牲品,回滚并结束该事务,并抛出一条消息。

现在的数据库管理系统都很优秀,死锁很少发生,但很少不代表不会发生,如果我们在事务中注意一下,又可以进一步减少死锁的发生。下面是 SQL Server 中避免死锁发生的建议:

  • 按同一顺序访问对象。比如上述示例中 T1 和 T2 都应先访问数据 A,后访问数据 B,而不是一个先访问数据 A,一个先访问数据 B。
  • 避免事务中的用户交互。比如事务中不要等待用户输入,因为这种交互可能造成事务执行时间变长,增大了与其他事务竞争资源的可能性。
  • 保持事务简短并在一个批处理中。
  • 使用低隔离级别。
  • 使用绑定连接。使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。
相关文章