關於主外來鍵關係DML父表和DML子表加鎖方式
原創 轉載請註明出處
當存在主外來鍵關係時候不管是更新主表還是子表都會出現對應的LOCK,解釋如下:
實驗
SQL> create table test1
2 (id int);
SQL> alter table TEST1
2 add constraint TEST_PK primary key (ID);
SQL> insert into test1
2 values(10);
1 row inserted
SQL> commit;
Commit complete
SQL> create table test2
2 (id int);
Table created
SQL> alter table TEST2
2 add constraint test_fk foreign key (ID)
3 references test1 (ID);
Table altered
SQL> INSERT INTO TEST2
2 VALUES(10);
1 row inserted
SQL> COMMIT;
Commit complete
然後開一個會話進行刪除TEST2。出現LOCK模式如下
SQL> SELECT LOCK_TYPE,MODE_HELD,LOCK_ID1 FROM DBA_LOCKS WHERE SESSION_ID=150;
LOCK_TYPE MODE_HELD LOCK_ID1
-------------------------- ---------------------------------------- ----------------------------------------
Transaction Exclusive 327689
DML Row-X (SX) 51297
DML Row-S (SS) 51295
這裡LOCK_ID1是對應的OBJECT_ID我的子表是51297父表是51295 ,子表加了表共享行獨佔,父表加了表共享行共享。
為了測試主表這樣的問題,必須引入大量的資料
declare
i number(10);
begin
for i in 11..10000000 loop
insert into test1
values( i);
end loop;
end ;
這樣可以等待很長時間
鎖的模式如下
SQL> select LOCK_TYPE,MODE_HELD,LOCK_ID1 from dba_locks where session_id=148;
LOCK_TYPE MODE_HELD LOCK_ID1
-------------------------- ---------------------------------------- ----------------------------------------
Transaction Exclusive 262169
DML Row-S (SS) 51297
DML Row-X (SX) 51295
51295父表 51297子表
也許要問SS 和SX的區別區別在於行的獨佔和共享,如
DML Row-S (SS) 51297
DML Row-X (SX) 51295
這樣的模式我們隊51295進行FOR UPDATE是不行的行級X和S是不相容的
但是對51297進行FOR update是可以因為S和S相容。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-667534/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 求主外來鍵的關係
- MySQL建立資料表並建立主外來鍵關係MySql
- oracle 主外來鍵關係及實驗Oracle
- 資料庫的主外來鍵關係資料庫
- EntityFramework Core 遷移忽略主外來鍵關係Framework
- [20180423]關於閃回表與主外來鍵約束.txt
- 無索引的外來鍵之主表子表DML操作實驗及結論索引
- Django(15)外來鍵和表關係Django
- DDL、DML、DCL、DQL相關操作
- MySQL:Innodb 關於Handler_commit每次DML增加2的原因MySqlMIT
- EF Code First中的主外來鍵約定和一對一、一對多關係的實現
- 外來鍵沒有索引哪些DML操作會被阻塞索引
- Django中ORM外來鍵和表的關係(Django程式設計-4)DjangoORM程式設計
- Oracle Parallel DMLOracleParallel
- 一個關於wait/notify與鎖關係的探究AI
- DML_The OUTPUT Clause
- MySQL的DDL和DML操作語法MySql
- 表的關聯關係
- 零程式碼實現一對一表關係和無限主子表級聯儲存
- Linux socke server程式設計:父程式和子程式關係LinuxServer程式設計
- 關於外來鍵約束
- OGG 簡單DML同步
- Mysql DML 新增資料MySql
- SQL基礎——DML(插入、修改和刪除)SQL
- ORM建立表關係ORM
- MySQL DML運算元據MySql
- 【集合論】序關係 ( 哈斯圖示例 | 整除關係哈斯圖 | 包含關係哈斯圖 | 加細關係哈斯圖 )
- 在 CSDN 上面看到的一篇關於 Laravel 關聯表模型和多對多關係的文章Laravel模型
- Gil全域性解釋鎖和執行緒互斥鎖的關係執行緒
- RPA和人工智慧:解鎖未來企業制勝的關鍵人工智慧
- 矩陣:橫向關係和縱向關係矩陣
- MySQL表關係的理解MySql
- MySQL教程DML資料操縱語言示例詳解鍵塾MySql
- SQLServer DML操作阻塞SELECT查詢SQLServer
- 入門MySQL——DML語句篇MySql
- MySQL基礎之DML語句MySql
- Sysbench-0.5改成只有DML操作
- SQL學習___03:DML語法SQL
- MyBatis加強(1)~myBatis物件關係對映(多對一關係、一對多關係)、延遲/懶載入MyBatis物件