首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring管理Bean、Hibernate事务,造成死锁有关问题的解决办法【探索篇】

2012-08-28 
Spring管理Bean、Hibernate事务,造成死锁问题的解决方法【探索篇】一、先介绍一下手头的项目情况:????? 1、同时

Spring管理Bean、Hibernate事务,造成死锁问题的解决方法【探索篇】

一、先介绍一下手头的项目情况:

????? 1、同时操作4个表,分别是25w、55W(CRUD操作),以及另外另个副表也是25w、55w(只写)。

????? 2、应该也是50-100人左右同时操作。

?

二、这几天遇到的问题,就是数据死锁,以下附上错误部分错误提示:

????? 事务(进程 ID? 62)与另一个进程已被死锁在? lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

????? 事务(进程 ID? 63)与另一个进程已被死锁在? lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

????? 事务(进程 ID? 64)与另一个进程已被死锁在? lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

????? [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]事务(进程 ID? 62)与另一个进程已被死锁在? lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

?

三、这几天解决问题的过程中解决的各种思路以及各种经历(没有兴趣者可以略过,直接看后面的解决部分):

????? 1、怀疑Hibernate的findByProperty方法访问有问题。查找死锁的位置,发现只要是有以下获取list对象集的地方都会出错。

?????????

??????????

public List findByProperty(String propertyName, Object value) {log.debug("finding Persinfo instance with property: " + propertyName+ ", value: " + value);try {String queryString = "from Persinfo as model where model."+ propertyName + "= ?";return getHibernateTemplate().find(queryString, value);} catch (RuntimeException re) {log.error("find by property name failed", re);throw re;}}

?????????? 而且以下我们的写法很常用:

??????????

List list = persinfoDAO.findByPerscode(perscode);if(!list.isEmpty()){Persinfo persinfo = (Persinfo)list.get(0);。。。

?

?????????? 所以如果要改写非常繁琐,但是怎么看都觉得没有问题,放弃,继续查找原因。

?

??????2、怀疑是数据库连接太小,已经查到了出现死锁的位置。

?????????? (此处略去N个字)

????? 3、怀疑Spring管理了所有的数据,改写配置文件:?

?????????? (此处略去N个字)

????? 4、怀疑某一个用户锁住了表,另外的用户读取失败。(比较靠谱了)?

?????????? (此处略去N个字)

????? 5、对Hibernate以及C3P0的设置进行优化。?

?????????? (此处略去N个字)

????? 6、最后发现,是一个用户对表进行操作,操作之前事务会把表锁住,然后事务没有及时提交(解锁),就对表进行读取,造成了自己(的读取)对自己(提交写等操作的缓冲)进行等待,造成死锁。

?

四、解决方法:

????? 1、在业务层的一个方法里面:

??????????

Persinfo persinfo = (Persinfo)list.get(0);                        ...persinfoDAO.update(persinfo);                        ...if(...){                                ...t402DAO.update(t402);        }if(...){                                ...familyDAO.merge(family);if(...){                                        ...t403DAO.update(t403);}                                ...famifundDAO.update(famifund);                                ...//硬性提交事务familyDAO.getHibernateTemplate().flush();t403DAO.getHibernateTemplate().flush();famifundDAO.getHibernateTemplate().flush();

?????????? 注意点:多个操作完成之后,一次性进行flush进行事务提交。

?????????? 其他思路:可以用AOP对业务层的某一个业务的所有方法进行定义,比如只读,或者整体事务,然后在Spring的配置文件进行配置。

?

五、附上我查阅资料之后发现的几个需要掌握的知识点:

????? 1、Spring集成Hibernate,C3P0的设置参数。

????? 2、事务隔离级别。

????? 3、Spring对于事务管理的几种方式。

????? 4、AOP的作用。

?

后记:

??????因为时间仓促,加之自己的理解还不够透彻,稍后有空了,再整理一下,把Spring管理Bean、Hibernate事务的一些原理解剖清楚,再发表给大家。

?

?

1 楼 ppgunjack 2011-03-25   数据库不一样,机制不一样
一个事务自己锁自己应该不太可能吧,锁都是自己拿了,自然就不会申请锁,所以也不会wati自己放锁,那就不可能死锁 2 楼 Samter 2011-03-29   ppgunjack 写道数据库不一样,机制不一样
一个事务自己锁自己应该不太可能吧,锁都是自己拿了,自然就不会申请锁,所以也不会wati自己放锁,那就不可能死锁
它是这样子的,Spring管理下的Hibernate自动加了事务,一开始先把表给锁住,然后进行操作,但是事务的设置或者别的一些问题,导致没有自动提交事务,但是还没有提交的事务的时候又立刻对数据进行读操作。

热点排行