一、先介绍一下手头的项目情况:
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事务的一些原理解剖清楚,再发表给大家。
分享到:
相关推荐
ORACLE表死锁的解决方法亲测有效!
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。从而进一步加深对于死锁问题的理解。掌握解决死锁问题的几种算法的编程和调试技术。练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。
主要给大家介绍了关于spring容器初始化时候遇到的死锁问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
实测有效的一个c++检测线程死锁的解决方法(实现和测试代码) 原创实测有效的一个c++检测线程死锁的解决方法,已应用于项目,实测有效 原创文章地址:https://blog.csdn.net/liaozhilong88/article/details/80354414...
db2死锁问题分析及解决方案,可以快速解决数据库问题。
一、数据库死锁的现象 ... 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 ...三、死锁的定位方法 通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
本文举例说明SQL Server死锁产生的原因,并提出了解决的办法。
数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...
有关银行家算法的实现,它是用来解决操作系统中的死锁问题的有效方法!
车辆行驶死锁问题,在Linux下用C语言完成下面模型:设有一个T型路口,其中A,B,C,D各处可容纳一辆车,车型方向如图所示。找出死锁并用有序分配法消除之,要求资源编号合理。
主要介绍了java中常见的死锁以及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在SQL Server 2005中解决死锁问题
Java解决死锁问题eclipse代码版
以下是一些解决MySQL中死锁问题的建议和方法: 监控死锁: 使用SHOW ENGINE INNODB STATUS命令来查看InnoDB存储引擎的状态,并查找死锁相关的日志信息。 启用innodb_print_all_deadlocks配置选项,将死锁信息记录到...
Oracle数据库出现死锁的时候可以按照以下处理步骤加以解决: 第一步:尝试在sqlplus中通过sql命令进行删除,如果能够删除成功,则万事大吉!但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有...
编译的存储过程的时候,程序死住,等待一会出现ora-04021错误解决办法。文档中有查询思索的语句,以及杀掉死锁进程的方法。
mysql死锁解决
死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而...先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。
Java 实例 - 死锁及解决方法源代码+详细指导教程.zip