应用程序什么情况下会造成oracle死锁,如何解决?

hou_guannan 2015-09-11 07:55:53
oracle死锁我理解就是两个用户操作同一张表,一个用户修改了,还没有提交,另一个用户也去修改了,会造成等待。
由于没有高并发经验,还真不太清楚实际环境中,什么情况会出现死锁,出现了,怎么解决,以后怎么避免?
假如一个定时程序批量插入一张表,需要一个小时,这时其他用户来访问这张表了怎么办?
求指点,谢谢!!!
...全文
337 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hou_guannan 2015-09-17
  • 打赏
  • 举报
回复
[/quote]同一时间操作同一张表的同一条记录,同一条记录,同一条记录,重要的事情要说三遍[/quote] 多谢,明白了!
hou_guannan 2015-09-17
  • 打赏
  • 举报
回复
谢谢楼上,明白了一点了
ArayChou 2015-09-15
  • 打赏
  • 举报
回复
引用 8 楼 hou_guannan 的回复:
假如一个定时程序批量插入一张表,需要一个小时,这时其他用户来访问这张表了怎么办?
数据库的锁有表锁,和行锁。插入表,是锁定新插入的行。 其它用户“访问”分集中情况:增加,删除,修改,查询。 增加:如过表上有唯一约束,需要等前面的事务完成好才能提交事务。否则无需等待事务。 删除:无需等待前面事务提交。(但是前面插入的数据还没有提交,读取不到也无法删除) 修改:无需等待前面事务提交。(但是前面插入的数据还没有提交,读取不到也无法修改) 查询:无需等待事务。(查询不到未提交的数据)
DY1201 2015-09-15
  • 打赏
  • 举报
回复
引用 7 楼 Itsjd 的回复:
不同的事务同一时间操作同一张表的同一条记录的时候会造成死锁。 解锁语句 select object_name 对象名称,machine as 主机, s.program 程序,s.sid,s.serial#,p.spid as OS进程号 from v$locked_object l,dba_objects o ,v$session s ,v$process p where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr; ALTER SYSTEM KILL SESSION '1377,4392' --依次填入SID和SERIAL#解锁 1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; (细化处理逻辑,执行一段逻辑后便回滚或者提交,然后再执行其它逻辑,直到事物执行完毕提交) 2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
同一时间操作同一张表的同一条记录,同一条记录,同一条记录,重要的事情要说三遍
hou_guannan 2015-09-14
  • 打赏
  • 举报
回复
引用 7 楼 Itsjd 的回复:
不同的事务同一时间操作同一张表的同一条记录的时候会造成死锁。 解锁语句 select object_name 对象名称,machine as 主机, s.program 程序,s.sid,s.serial#,p.spid as OS进程号 from v$locked_object l,dba_objects o ,v$session s ,v$process p where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr; ALTER SYSTEM KILL SESSION '1377,4392' --依次填入SID和SERIAL#解锁 1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; (细化处理逻辑,执行一段逻辑后便回滚或者提交,然后再执行其它逻辑,直到事物执行完毕提交) 2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
假如一个定时程序批量插入一张表,需要一个小时,这时其他用户来访问这张表了怎么办?
DY1201 2015-09-14
  • 打赏
  • 举报
回复
不同的事务同一时间操作同一张表的同一条记录的时候会造成死锁。 解锁语句 select object_name 对象名称,machine as 主机, s.program 程序,s.sid,s.serial#,p.spid as OS进程号 from v$locked_object l,dba_objects o ,v$session s ,v$process p where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr; ALTER SYSTEM KILL SESSION '1377,4392' --依次填入SID和SERIAL#解锁 1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; (细化处理逻辑,执行一段逻辑后便回滚或者提交,然后再执行其它逻辑,直到事物执行完毕提交) 2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
hou_guannan 2015-09-14
  • 打赏
  • 举报
回复
能不能举例说明,或者有相关的帖子给我推荐一下,万分感谢!!!
mnlin 2015-09-13
  • 打赏
  • 举报
回复
这要看不同数据库采取的隔离级别,oracal中只是避免了脏读,若有另外进程访问数据库插入数据什么的,还是可以的。这种数据库采用的隔离级别很低,发生死锁的概率很小,并且一般来说并行量大的操作,都会有数据库连接池,会规定一定数目的连接数,并且如果连接时间过长会自己断开,并发量过大时会排队等待,这些问题是很复杂的
hou_guannan 2015-09-12
  • 打赏
  • 举报
回复
求详细指点!!
hou_guannan 2015-09-12
  • 打赏
  • 举报
回复
自己顶一个!!!
btbear 2015-09-11
  • 打赏
  • 举报
回复
如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。
等待或是别的 2015-09-11
  • 打赏
  • 举报
回复
这不是死锁,你说的是事务隔离级别

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧