對象: pickTicket 出庫  1 : N  pickTicketDetail 出庫明細
數據庫: pickTicket的id作為pickTicketDetail 的外鍵(pickTicket.id)
---------
在對pickTicketDetail 某行數據進行insert/update/delete的事務提交給數據庫進行持久化處理時,數據庫會將
pickTicket整個表給予只讀鎖. 此為避免修改pickTicketDetail 時,pickTicket的數據進行修改而出現
pickTicketDetail中的pickTicket.id對應在pickTicket中不存在.(即確保數據庫的數據完整性)

發生場景: 事件A增刪改某表A時,會對該表的所有外鍵對應的表給予只讀鎖.如此時其他事務B正提交數據庫,類似的需要鎖定事件A中已鎖定的表.
此時2個事務都在等待對方表解鎖.產生死鎖.


可以處理方案:
1盡量縮短事務處理的時間.
2對pickTicketDetail 增加pickTicket.id的索引.
------------
相關參考:
http://it.china-b.com/sjk/oracle/20090826/177376_1.html
測試:

session 1:

SQL> delete from emp where emp.deptno=10;

session 2:

SQL> delete from dept where deptno=40;

現象:在emp的字段deptno沒有索引時session 2等待, 有索引則不等待.

結論:如果沒有索引時,對父表的操作,會級聯加一個TM S鎖(level 4)到子表上;

如果有索引時,對父表的操作,會級聯加一個TM RS鎖(level 2)到子表上;

這時如果子表上本身就有個TM RX鎖(這種鎖很容易產生,insert update delete都會產生這種鎖),

TM S鎖和TM RX鎖是互斥的, TM RS鎖和TM RX鎖是相容的.


-------

最后:其實想記錄的是"外鍵未加索引的問題" .此問題可以google下了解.

本文寫的較亂,只為存疑記錄.有待進一步了解學習.