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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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加行锁来防止其他会话进行修改
参考技术A 因为你在关掉oracle进程相当与做了commit或者rollback操作
你们这种情况问题在于程序做完更新后语句里面没有及时提交操作
严格来这种情况并不是死锁,而是因为更新操作正常的一个表锁。
建议你们更改程序,做任何一条更新完毕后面加一个commit
不要更新2条记录后再提交,因为这样就有可能2个session互相锁住追问

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

参考技术B 操作表的时候 lock table in exclusive mode
更新表记得 提交 COMMIT
结束会话 alter system kill session 'sid,serial#'
希望帮助你 ...........
参考技术C 在数据库层用select for update,把记录锁住

IDEA Maven项目为啥下载不了jar包呢?大神帮忙看一下怎么回事

druid的jar包也是pom文件里面写的呀,可以下载使用但是这个oracle的jar包怎么就不行了呢,我去仓库目录下找,发现也是没有,只有一些没用的1kb文件,例如lastupdated后缀的一个文件,1kb大小。但是Pom.xml又没有提示说找不到依赖项,这是怎么啦

用这个
<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>6</version>
</dependency>
com.oracle下只有一个版本是6的ojdbc
参考技术A 你的下载软件有问题吧!

以上是关于关于oracle数据库死锁,请大神进。为啥用java synchronized 关键字解决不了?怎么解决死锁问题?的主要内容,如果未能解决你的问题,请参考以下文章

设置oracle11g定时自动备份,为啥没有备份?请大神们帮我看看为啥!

为啥oracle ogg monitor jagent进程找不到,请教大神

matlab关于randn函数的应用问题 大神进

如何解决oracle很卡的问题?

用flask连接数据库进行数据可视化时出错,请大神帮忙看看

oracle 11g r2安装到最后为啥会出现问题,求大神解决!