今天业务用户发现问题,有一批请求一直在运行状态,
初步判断是由死锁引起的,于是查看一下锁的状态:
发现:
Insert Into Qgl_Docnum
(Ledger_Id,
Legal_Entity,
Period_Name,
Period_Num,
Je_Source,
Je_Category,
Max_Doc_Number)
Values
(:B1, :B7, :B2, :B6 || :B5, :B3, :B4, 0)
(Ledger_Id,
Legal_Entity,
Period_Name,
Period_Num,
Je_Source,
Je_Category,
Max_Doc_Number)
Values
(:B1, :B7, :B2, :B6 || :B5, :B3, :B4, 0)
是由这一段sql引起的,
然后看这张表的表结构,发现主键为:
询问开发人员,发现开发人员动了测试环境该表的表结构,并且主键发生了变动:
LEDGER_ID, LEGAL_ENTITY, PERIOD_NAME,Je_Source,Je_Category
然后解决问题的思路:
将测试环境的表1(测试)备份为表2,将生产环境的表1(生产)复制到测试环境表3(测试),
问题原因:
1 insert不会造成死锁
2 oracle会自动处理死锁
3 大量insert时,建议分批提交
2 oracle会自动处理死锁
3 大量insert时,建议分批提交
insert我看文章说也会发生锁,唯一情况是在有主键的表上,且两条insert语句主键相同时发生
我感觉如果两个session同时插一个主键,应该是不会冲突,因为谁先用谁就可以占用主键。
如果两个session每个都插入一批再提交,也许会主键冲突,比如
比如session a用主键1,2
session b用主键2,1
如果两个session每个都插入一批再提交,也许会主键冲突,比如
比如session a用主键1,2
session b用主键2,1