1.事物死锁以及解除死锁的方法
事物1锁定了数据库对象a,需要使用对象b;事物2锁定了数据库对象b,需要使用a,两不相让就出现了死锁
一、预防死锁
预防死锁的方法有以下几种:
1.一次锁定法
该方法要求每个事务一次就将要操作的数据库对象全部锁定,否则就不继续执行。在前面的例子中如果事务T1一次就将数据库对象A1和A2全部锁定,事务T1就会执行下去。事务T2开始是等待的,在事务T1执行完毕释放锁之后,就可以锁定对象A1和A2了,也可以执行下去了。这样就不会发生死锁了。
一次锁定法虽然可以防止死锁,但也存在问题。其一,一次就锁定以后才会用到的数据库对象,肯定扩大了当前的锁定范围,从而降低了系统的并发度;其二,数据库中的对象是不断变化的,应用条件或情况也是不断变化的,原来不需要锁定的对象,在执行过程中可能就需要锁定了,所以很难事先就精确的估计出每个事务一次性需要锁定的对象。
2.顺序锁定法
该方法要求预先对数据库对象规定一个锁定的顺序,所有的事务都按照这个顺序来实行锁定。
顺序锁定法虽然可以防止死锁,但也存在问题。其一,要锁定的数据库对象可能比较多,并且随着创建、插入、删除等操作而不断变化,要维护一个严格的锁定顺序非常的困难,算法复杂,成本很高;其二,在执行过程中很可能需要调整需要锁定的对象,但很难调整已经规划好的锁定顺序。
由此可见,在操作系统中广泛采用的预防死锁的方法并不适用于数据库管理系统的特点。因此,数据库管理系统在解决死锁问题时广泛采用的是先诊断后解除的方法。
二、诊断与解除死锁
先诊断后解除的方法如下:
1. 超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
超时法的实现比较简单,但不足之处也很明显。其一,可能误判死锁,如果一个事务因为其他原因(如操作的数据量较大,并不是死锁的等待)而使等待时间超过了时限,就可能被误判为死锁;其二,时限不好决定,如果设置的太长,死锁发生后就不能及时的发现,设置的太短,就会增加误判死锁的可能性。
2. 等待图法
用离散数学的图论来诊断死锁的方法。事务的等待图是一个有向图G=(T,U)。T为正在运行的各个事务的节点的集合,U为有向边。如果事务T1等待事务T2,则在事务T1和事务T2节点之间就有一条从事务T1指向事务T2的有向边。事务等待图动态的反映了当前的各个事务之间的等待情况。
DBMS的并发控制子系统周期性的检测事务等待图。如果发现图中存在回路,则表示系统中出现了死锁,就会给予提示,设法解除该死锁。
2.hibernate 中的session
hibernate中的session是一级缓存,可以理解为进程级的缓存。在进程运行期间一直存在。
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
service