浅谈数据库死锁

浅谈数据库死锁

    最近碰到了一个死锁的问题,查了一天才查出为什么会发生,查的过程中对死锁也有点简单的认识,下面谈谈我对死锁的理解。
    1、死锁是如何产生的呢?
    如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因为T2已经封锁了R2,于是T1只能等待T2释放R2上的锁。接着T2又请求封锁R1,因T1已经封锁了R1,T2也只能等待T1释放R2上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。如下图所示:

    2、如何预防和处理死锁?
    目前在数据库中解决死锁问题主要有两类方法,一类是采取一定的措施来预防死锁,另一类是允许发生死锁,采用一定的手段定期诊断系统中有无死锁,有则解除之。
    防止死锁其实就是要破坏产生死锁的条件,预防死锁通常有两种方法:
    (1)一次封锁法
    一次封锁法要求每个事务必须一次将所有要使用的数据加上锁,否则就不能执行。虽然这样能有效防止死锁,但也存在问题。第一,对全部数据加锁,扩大了封锁的范围,从而降低了系统的并发度。第二,数据库中的数据是不断变化的,原来不要封锁的数据,在执行的过程中可能成为封锁的对象,所以很难事先精确确定每个事务要封锁的数据对象,为此只能扩大封锁范围,进一步降低了并发度。
    (2)顺序封锁发
    顺序封锁法是预先对数据排定一个封锁顺序,所有的事务都按照这个顺序实行封锁。这样也能有效防止死锁,但也存在问题。第一,数据库系统中封锁的数据对象极多,并且随着数据的变化,要维护这样的封锁顺序是很困难的,成本很高。第二,事务的封锁请求可能随着事务的执行而动态的决定,很难事先要确定封锁哪一个对象。
    基于以上的分析,在目前我们采用的预防死锁的策略不是很适合数据库的特点,因此在解决死锁的问题上采用的是诊断并解除死锁的方法。
    3、死锁的诊断
    诊断死锁一般是采用超时法或事务等待图法。超时法是一个事务等待的时间超过规定的时限,就认为发生了死锁,但这样有个明显的缺点是容易产生误判。等待图法是一个有向图 G=(T,U)。T为节点的集合,每个节点表示正在运行的事务;U为边的集合,每条边表示等待的情况,若T1等待T2,则T1到T2间划一条有向边,如果发现有回路,则表示发生了死锁。

    更多数据库死锁的解决可以参见文章:http://tech.ccidnet.com/zt/sisuo/

   


你可能感兴趣的:(浅谈数据库死锁)