-
什么是事務(wù)
事務(wù)是數(shù)據(jù)庫執(zhí)行操作的最小單元
事務(wù)可以有一個(gè)sql組成,也可以由多個(gè)sql組成
組成事務(wù)的sql要么全執(zhí)行成功温兼,要么全執(zhí)行失敗
事務(wù)的語法
START TRANSACTION / BEGIN
SELECT ...
UPDATE ...
INSERT ...
COMMIT / ROLLBACK
用start transaction 或者 begin 開始一個(gè)事務(wù)
中間只能是dml語句栏账,增刪改查
commit:提交1個(gè)事務(wù)
rollback:回滾1個(gè)事務(wù)
- 為什么要有事務(wù)
允許多個(gè)人同時(shí)操作相同得數(shù)據(jù)帖族,是為了增強(qiáng)數(shù)據(jù)庫的并發(fā)性,并發(fā)能帶給更大的吞吐量挡爵,更優(yōu)的資源利用率和更好的性能
但并發(fā)也會(huì)帶來問題竖般,比如多個(gè)用戶同時(shí)修改數(shù)據(jù)時(shí),容易破壞數(shù)據(jù)的一致性茶鹃,為了解決并發(fā)帶來的資源爭用和一致性問題涣雕,mysql提供了事務(wù)功能和基于鎖的多版本控制機(jī)制
persist:修改后對(duì)當(dāng)前的session和所有連接到mysql中的新連接都有效,且在mysql重啟后也不會(huì)丟失
global:修改后只會(huì)對(duì)新的連接到mysql的連接有效闭翩,且mysql重啟后挣郭,做的修改會(huì)丟失
session:(對(duì)開發(fā)人員來說是最常使用的)只會(huì)影響到當(dāng)前的連接,當(dāng)連接斷開后疗韵,所做的修改就會(huì)失效
將事務(wù)設(shè)置為SERIALIZABLE的示例
serializable
如上圖示兑障,在串行化事務(wù)隔離級(jí)別中,只有第一個(gè)事務(wù)提交或回滾后蕉汪,第二個(gè)事務(wù)才能執(zhí)行流译。
事務(wù)2修改后滿足事務(wù)1的查詢條件,只有等待事務(wù)1先執(zhí)行完者疤。
如果事務(wù)2修改后不滿足事務(wù)1的查詢條件福澡,則不會(huì)被卡住(如操作的是不同表)
其他的不一一測試
鎖的類型
共享鎖:其他事務(wù)只能對(duì)他讀取和加共享鎖驹马,而無法修改
排他鎖:只能由加排他鎖的事務(wù)讀取和修改革砸,其他數(shù)據(jù)無法讀取和修改,也無法加鎖
加鎖就有可能造成阻塞和死鎖
-
什么是阻塞
由于不同鎖之間的兼容關(guān)系糯累,造成的一事務(wù)需要等待另一事務(wù)釋放所占資源的現(xiàn)象
'如何發(fā)現(xiàn)阻塞算利,該表記錄了所有innodb所有等待事件'
SELECT waiting_pid AS 'block pid', -- 被阻塞的進(jìn)程,進(jìn)程ID
waiting_query AS 'block SQL', -- 被阻塞的命令
blocking_pid AS 'running pid', -- 誰阻塞了后面寇蚊,在運(yùn)行的進(jìn)程笔时,進(jìn)程ID
blocking_query AS 'running SQL', -- 在運(yùn)行id的sql
wait_age AS 'blocked time', -- 阻塞多久了
sql_kill_blocking_query AS 'info' -- 如何解決阻塞的建議
FROM sys.innodb_lock_waits
WHERE (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(wait_started))>30 -- 單位秒
如何處理阻塞
1.終止占用資源的事務(wù)
2.優(yōu)化占用資源的sql,使其盡快釋放資源什么是死鎖
死鎖:并行執(zhí)行的多個(gè)事務(wù)之間占有了對(duì)方所需要的資源仗岸。
mysql內(nèi)部會(huì)自動(dòng)監(jiān)控死鎖允耿,主動(dòng)回滾某個(gè)事務(wù),回滾的原則是回滾占用資源少的事務(wù)來解死鎖扒怖,這過程不需要人為干預(yù)
死鎖雖然不會(huì)卡住较锡,但有時(shí)會(huì)對(duì)業(yè)務(wù)造成影響,如某個(gè)sql盗痒,有時(shí)執(zhí)行成功蚂蕴,有時(shí)失敗低散,可能就是死鎖造成的
set global innodb_print_all_deadlocks=on;
死鎖信息記錄在mysql的錯(cuò)誤日志中的開關(guān)
如有2個(gè)mysql事務(wù),事務(wù)1要修改 id 為10的title,score骡楼,事務(wù)2要修改 id 為10的 score,title
事務(wù)1執(zhí)行完修改title熔号,score還沒執(zhí)行,此時(shí)title資源被事務(wù)1占用
事務(wù)2執(zhí)行完修改score鸟整,title還沒執(zhí)行引镊,此時(shí)score資源被事務(wù)2占用
下次事務(wù)1和事務(wù)要修改的資源被彼此占用,就會(huì)形成死鎖
如前面的事務(wù)1和事務(wù)2篮条,讓雙方修改數(shù)據(jù)的順序相同弟头,比如都是先修改title,再修改score涉茧,這樣這些事務(wù)都是按相同的順序占有資源赴恨,后面的事務(wù)不會(huì)占有前面事務(wù)后續(xù)要修改的資源,只會(huì)產(chǎn)生阻塞伴栓,不會(huì)產(chǎn)生死鎖伦连,只要前面的事務(wù)執(zhí)行夠快,就只會(huì)阻塞很短的時(shí)間