数据库死锁是什么?

加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。

 

任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获得写锁(排他锁)

 

当两个事务互相之间需要等待对方释放获得的资源时,如果系统不进行干预则会一直等待下去,也就是进入了死锁(deadlock)状态。-----这就是数据库死锁!!!

本文给大家演示一下死锁产生的场景和解决方法

以下内容适用于各种常见的数据库管理系统,包括 Oracle、MySQL、Microsoft SQL Server 以及 PostgreSQL 等

 

死锁是如何产生的?

演示死锁的产生非常简单,我们只需要创建一个包含两行数据的简单示例表:

 

如果我们在不同事务中以不同的顺序修改数据,就可能引起事务之间的相互等待。一个事务等待另一个事务释放资源不会产生什么问题,

但是如果两个事务互相等待对方的资源,数据库管理系统只有两个选择:无限等待或者中止一个事务并让另一个事务成功执行。

显然无限等待不是解决问题的方法,因此数据库通常是等待一定时间之后中止其中一个事务。

以下是一个死锁的演示案例:

 

 

 

 

如何解决并避免死锁

死锁不是数据库自身的问题,我们无法通过优化数据库配置来解决或者避免死锁,只能通过修改应用程序来解决。

简单来说,我们应该在程序中按照相同的顺序修改数据,避免产生相互等待资源的情况发生。例如

 

 

以上场景不会产生死锁。不过,我们在实际应用中可能无法完全按照相同顺序修改数据。如果出现了不可避免的死锁情况,另一种解决方法就是捕获系统返回的死锁异常并在程序中加入重试机制。

 

 

posted @ 2022-07-07 15:01  lllwy  阅读(573)  评论(0编辑  收藏  举报