註意:本教程不適用舊版本,Mysql 8.4.0 和 舊版本,主從複製相關命令有所變化,具體區別請看文末參考 軟體版本 Docker:26.1.3 Mysql:8.4.0 GTID主從複製 1.準備主從兩台伺服器 2.兩台伺服器分別創建 docker-compose.yml 文件 services: ...
鎖是管理共用資源的併發訪問。
1 關於鎖的衍生概念
1.1 悲觀鎖
悲觀鎖是認為數據會被其他會話同時修改。所以在數據修改前,先對數據鎖定,然後再修改數據。例如,先對某一行數據進行for update鎖定,然後再更新這一行的數據。
Select * from table where primary_key = :primary_key And decode( columnl, :old_columnl, 1)=1 And decode( column2, :old_column2, 1)=1 For update;
Update table Set columnl = :new_columnl, column= :new_column2, Where primary_key = :primary_key;
Commit;
1.2 樂觀鎖
樂觀鎖是認為數據不會別其他會話同時修改。所以只有在執行修改數據語句時才對數據進行鎖定。例如,對某一行數據直接進行修改
Update table Set columnl = :new_columnl, column= :new_column2 Where primary_key = :primary_key And decode( columnl, :old_columnl, 1)=1 And decode( column2, :old_column2, 1)=1;
1.3 阻塞
當一個會話持有某個資源,另一個會話訪問這個這個資源時,就會出現阻塞。
1.4 死鎖
兩個會話互相等待對方釋放資源就會出現死鎖。
2 oracle鎖類型
2.1 DML鎖
當執行select,update,insert,delete,merge時對數據的鎖定就屬於DML鎖。DML鎖分為TX鎖和TM鎖。
2.1.1 TX鎖
TX鎖是一個行級鎖。當事務獲取到TX鎖時,會一直持有,直到事務結束。在oracle中,鎖是數據的一個屬性。事務對行數據鎖定時,行會對應一個事務ID,這個事務ID存放在塊中。別的事務訪問同樣的行時,會查看行對應的事務id,檢查事務是否是活動的。如果事務活動,則等待事務結束,要求原來的事務一旦釋放鎖,進行通知。所以會有一個鎖的排隊隊列。如果事務不活動,則對行進行鎖定,獲得TX鎖。
2.1.2 TM鎖
TM鎖是數據進行DML操作時,會對錶進行鎖定,防止其他會話修改表結構。
2.2 DDL鎖
當執行DDL操作時,操作的對象就會產生DDL鎖,防止其他會話修改操作對象的結構
3 閂
閂是對orale記憶體結構保護的一種串列化設備。用於對資料庫高速緩存、共用池等記憶體結構併發訪問的協調管理。例如一個查詢的硬解釋,就會用到閂。一個會話對某個記憶體結構進行修改時,其他會話無法對該記憶體結構進行讀取。當一個會話釋放閂時,閂的分配是隨機,每個請求閂的起他會話都有可能獲取到閂。等待閂的會話不會排隊,只是不斷進行重試。
4 閂和隊列鎖區別
隊列鎖允許會話以隊列的方式等待釋放鎖,會發生堵塞。而對於閂,如果會話不能獲取到閂,不是等待閂的釋放,而是稍後重試,嘗試得到閂。
5 手動鎖定和用戶定義鎖
5.1 手動鎖定
當我們先手動鎖定一些行數據時,可以使用select ...for update的方式進行鎖定。其他會話就無法修改我們select選中的數據
5.2 用戶定義鎖
當我們需要鎖定一些oracle數據外部的資源時,例如外部文件。可以通過DBMS_LOCK包進行鎖定