关于oracle数据库死锁,请大神进。为什么用java synchronized 关键字解决不了?怎么解决死锁问题?

最近系统运行时碰到一个问题,oracle死锁,有一个事务,要更新a,b记录,在多用户并发的情况下,发生死锁(a,b同时分别被不同用户提交的事务锁住,互相等待),要在linux关掉oracle进程重启才可以。这个问题用程序怎么来解决?我建议老大说,在java 程序事务所在的方法加一个synchronized关键字,锁住该方法,老大说这种做法不可以,照样会发生死锁。我不明白为什么不可以?还有,该怎么解决这个死锁的问题?
事务所在方法的java bean是单例的

我记得如果真的出现相互等待的会话的时候,oracle会自动检测到死锁发生,并报错:ORA-00060.
而一般网上所说的大部分都是锁资源争用问题,并不是真正的死锁.
不行你可以实验一下,开2个会话,一个更新表A的行R1,不提交,然后另外一个会话更新行R2,不提交;
然后再回到第一个会话更新行R2,在第二个会话更新行R1,此时就出现相互等待的状态.也就是死锁的条件成立了.
ORACLE的自动锁管理机制此时会马上检测到死锁发生,并给出错误信息:
ORA-00060: 等待资源时检测到死锁

所以你们程序里的这种并不是真正的死锁.只是锁争用. 这个是设计上的问题,要按照业务逻辑进行事务分解.也就是说业务上连续的操作放在一个事务里.并且某些特殊情况下也需要FOR UPDATE加行锁来防止其他会话进行修改
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-20
因为你在关掉oracle进程相当与做了commit或者rollback操作
你们这种情况问题在于程序做完更新后语句里面没有及时提交操作
严格来这种情况并不是死锁,而是因为更新操作正常的一个表锁。
建议你们更改程序,做任何一条更新完毕后面加一个commit
不要更新2条记录后再提交,因为这样就有可能2个session互相锁住追问

这位兄台我想你未看清问题,我的意思是,现在找不到解决办法,只能去关掉oracle进程了。还有 我想知道加个synchronized关键字为什么不可以?

第2个回答  2013-04-22
操作表的时候 lock table in exclusive mode
更新表记得 提交 COMMIT
结束会话 alter system kill session 'sid,serial#'
希望帮助你 ...........
第3个回答  2013-04-20
在数据库层用select for update,把记录锁住

...为什么用java synchronized 关键字解决不了?怎么解决死锁问题?_百度...
所以你们程序里的这种并不是真正的死锁.只是锁争用. 这个是设计上的问题,要按照业务逻辑进行事务分解.也就是说业务上连续的操作放在一个事务里.并且某些特殊情况下也需要FOR UPDATE加行锁来防止其他会话进行修改

synchronized 加在java方法前面是什么作用
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如: public synchronized void accessVal(int newVal); synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须...

java 如何并发更新数据库同一条数据
一.普通的单应用并发,使用关键字synchronized就可以实现。二.多应用或多台并发,这时在由于2者并非同一应用,使用synchronized并不能满足要求。此时,有下面几种方案:数据库行级锁,优点是简单粗暴,缺点是容易死锁,非数据库专业人事建议不使用。写入请求分离成一个独立项目,这就回到了第一种情况,优点...

大虾请进:oracle数据库超大数据量的处理
synchronized(lock2) { var2++; } } }4.输入和输出(I\/O) 输入和输出包括很多方面,但涉及最多的是对硬盘,网络或数据库的读写操作。对于读写操作,又分为有缓存和没有缓存的;对于数据库的操作,又可以有多种类型的JDBC驱动器可以选择。但无论怎样,都会给程序的性能带来影响。因此,需要注意如下几点: (1) ...

Java多线程:从基本概念到避坑指南
synchronized关键字相对来说比较简单,但同步代码块的时候依然有许多要注意的点。这些经验,在concurrent包所提供的各种API中依然实用。我们还要处理多线程逻辑中遇到的各种异常问题,避免中断,避免死锁。规避了这些坑,基本上多线程代码写起来就算是入门了。 许多java开发,都是刚刚接触多线程开发,在平常的工作中应用也不是...

java去公司工作用到的是哪方面的知识?
第一:先学习Java的核心库(JavaSE)JavaSE的内容包括:环境搭建、基础语法、面向对象、数组、集合、常用类、IO流、反射机制、网络编程……..第二:MySQL数据库 搞定一门数据库相关的课程,例如:MySQL、Oracle,搞定一个就可以了,目前互联网公司,例如:京东、阿里等,他们都在使用MySQL,所以建议大家...

dbcp连接池放回链接后再次拿出来地址为什么不一样,我只初始化一个。怎 ...
代码未在finally释放connection , 不过我们都用sqlmapClientTemplate,底层都有链接释放的过程 遇到数据库死锁。以前遇到过后端存储过程做了锁表操作,导致前台集群中连接池全都被block住,后续的业务处理因为拿不到链接所有都处理失败了。 一份优化过的配置: 基本配置代码 <bean id="dataSource" class="org.apache.comm...

相似回答