一.概述 在mysql 里不同存儲引擎有不同的鎖,預設情況下,表鎖和行鎖都是自動獲得的,不需要額外的命令, 有的情況下,用戶需要明確地進行鎖表或者進行事務的控制,以便確保整個事務的完整性。這樣就需要使用事務控制和鎖定語句來完成。 特點 myisam innodb memory merge ndb 事 ...
一.概述
在mysql 里不同存儲引擎有不同的鎖,預設情況下,表鎖和行鎖都是自動獲得的,不需要額外的命令, 有的情況下,用戶需要明確地進行鎖表或者進行事務的控制,以便確保整個事務的完整性。這樣就需要使用事務控制和鎖定語句來完成。
特點 |
myisam |
innodb |
memory |
merge |
ndb |
事務安全 |
|
支持 |
|
|
|
鎖機制 |
表鎖 |
表鎖 行鎖(預設) |
表鎖 |
表鎖 |
行鎖 頁鎖(預設) |
1. lock table 和nolock table
lock table是鎖定當前線程的表。如果當前表被鎖定,其它線程想獲取該表的鎖時,會一直等待,直到獲取到該表鎖為止。
下麵演示一個獲得表鎖和釋放表鎖的簡單例子,演示會話1 獲取city表的read鎖後,會話2更新該表記錄時 會等待,當會話1 city表釋放後, 會話2就會更新完成。
-- 步驟1 會話1獲取city 表鎖
--- 步驟2 會話2更新city表一直在等待
-- 步驟3 會話1 city表釋放表鎖
---步驟4 會話2 city表更新成功
2. 事務控制
mysql 通過set autocommit, start transaction,commit 和rollback等語句支持本地事務
-- 語法如下 START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = {0 | 1}
預設mysql是自動提交事務AUTOCOMMIT的。顯示事務是通過明確的commit和rollback來提交或回滾。
START TRANSACTION 或BEGIN 語句可以開始一項新的事務。
COMMIT 和ROLLBACK 用來提交或者回滾事務。
CHAIN 和RELEASE 子句分別用來定義在事務提交或者回滾之後的操作,CHAIN 會立即啟動一個新事物,並且和剛纔的事務具有相同的隔離級別,RELEASE 則會斷開和客戶端的連接。
SET AUTOCOMMIT 可以修改當前連接的提交方式,如果設置了SET AUTOCOMMIT=0,需要通過明確的命令進行提交或者回滾。
3. start transaction 和 commit and chain
使用START TRANSACTION 開始的事務在commit提交後, 會自動回到 autocommit 自動提交的方式;如果在事務提交的時候使用COMMIT AND CHAIN,那麼會在事務提交後立即開始一個新的事務。
會話1 |
會話2 |
查詢country 表 SELECT * FROM city WHERE country ='法國'; 結果為空 |
查詢country 表 SELECT * FROM city WHERE country ='法國'; 結果為空 |
-- 啟動一個事務 START TRANSACTION; INSERT INTO country(country, last_update) VALUES('法國',NOW()); |
|
|
-- 查詢 仍然為空 SELECT * FROM city WHERE country ='法國'; |
-- 提交事務 COMMIT; |
|
|
再次查詢country 表 SELECT * FROM city WHERE country ='法國'; country_id country last_update 4 法國 2018-07-12 14:16:04 |
-- 重新啟動一個事務 START TRANSACTION; INSERT INTO country(country, last_update) VALUES('德國',NOW()); COMMIT AND CHAIN; -- chain 自動開始一個新事務 INSERT INTO country(country, last_update) VALUES('日本',NOW()); |
|
|
查詢country 表 country_id country last_update 2 中國 2018-07-03 18:06:45 3 美國 2018-07-12 14:15:02 4 法國 2018-07-12 14:16:04 5 德國 2018-07-12 14:21:20 |
-- 提交事務 COMMIT; |
|
|
country_id country last_update 2 中國 2018-07-03 18:06:45 3 美國 2018-07-12 14:15:02 4 法國 2018-07-12 14:16:04 5 德國 2018-07-12 14:21:20 6 日本 2018-07-12 14:21:20 |