定義
保證一組操作要么全部成功恭理,要么全部失敗。
引擎層實(shí)現(xiàn)
ACID特性
ACID(Atomicity郭变、Consistency颜价、Isolation、Durability诉濒,即原子性周伦、一致性、隔離性未荒、持久性)
- 原子性:最小操作單位
- 一致性:事務(wù)操作前后专挪,數(shù)據(jù)總量不變
- 隔離性:多個(gè)事務(wù)間,相互獨(dú)立
- 持久性:提交片排、回滾后寨腔,持久化保存
隔離性 & 隔離級(jí)別
- 讀未提交(read uncommitted):
讀到了其他事務(wù)未提交的數(shù)據(jù),即臟讀(dirty read) - 讀已提交(read committed):
其他事務(wù)提交前率寡、提交后迫卢,當(dāng)前事務(wù)兩次查詢(xún)到的數(shù)據(jù)不一致,即不可重復(fù)讀(non-repeatable read) - 可重復(fù)讀(repeatable read):
保證一個(gè)事務(wù)執(zhí)行過(guò)程中看到數(shù)據(jù)前后一致冶共。但假如其他事務(wù)有insert乾蛤、delete、update操作捅僵,改變了數(shù)據(jù)量家卖,當(dāng)前事務(wù)將無(wú)法通過(guò)select獲得這些改變結(jié)果,即幻讀(phantom read)庙楚。
另外的解釋?zhuān)耗骋淮蔚?select 操作得到的結(jié)果所表征的數(shù)據(jù)狀態(tài)無(wú)法支撐后續(xù)的業(yè)務(wù)操作上荡。 - 串行化(serializable)
將記錄加鎖,鎖沖突時(shí)必須等待當(dāng)前操作事務(wù)的提交或回滾后馒闷,才能操作酪捡。
解決一切問(wèn)題
修改隔離界別:
-- 可選參數(shù)有:
-- READ-UNCOMMITTED,
-- READ-COMMITTED,
-- REPEATABLE-READ,
-- SERIALIZABLE
transaction-isolation = xxx
事務(wù)隔離的實(shí)現(xiàn)
各個(gè)read-view通過(guò)回滾日志,讀取到一個(gè)數(shù)值的不同版本窜司,這是通過(guò)MVCC多版本并發(fā)控制實(shí)現(xiàn)的沛善。
一個(gè)回滾日志,將在系統(tǒng)里沒(méi)有比此日志更早的read-view的時(shí)候被刪除塞祈。
建議:盡量避免使用長(zhǎng)事務(wù)金刁。
- 占用大量存儲(chǔ)空間:
長(zhǎng)事務(wù)中存在許多老舊的任務(wù)視圖,這個(gè)長(zhǎng)事務(wù)提交前,它可能用到的回滾記錄都必須保留尤蛮,導(dǎo)致占用大量存儲(chǔ)空間媳友。 - 占用鎖資源
-- 查詢(xún)持續(xù)時(shí)間超過(guò)60s的長(zhǎng)事務(wù)
select * from information_schema.innodb_trx
where TIME_TO_SEC(timediff(now(),trx_started))>60
事務(wù)啟動(dòng)方式
-- 1、顯示啟動(dòng)事務(wù)-----------------------------
begin transaction
## 或
start transaction
# 具體操作
commit
## 或
rollback
-- 2产捞、關(guān)閉當(dāng)前線程自動(dòng)提交--------------------
set autocommit=0
# 具體操作
# 任何query語(yǔ)句都將啟動(dòng)事務(wù)醇锚,且必須手動(dòng)提交或回滾
# 可能導(dǎo)致意外的長(zhǎng)事務(wù)
commit
## 或
rollback
建議:使用顯示啟動(dòng)事務(wù)的方式
如何避免長(zhǎng)事務(wù)對(duì)業(yè)務(wù)的影響
應(yīng)用開(kāi)發(fā)端:
- 打開(kāi)自動(dòng)提交:set autocommit=1
- 確認(rèn)是否有不必要的只讀業(yè)務(wù),可以去掉坯临。
- set max_execution_time焊唬,控制每個(gè)語(yǔ)句的最長(zhǎng)執(zhí)行時(shí)間。
數(shù)據(jù)庫(kù)端:
- 監(jiān)控information_schema.innodb_trx表看靠,設(shè)置長(zhǎng)事務(wù)閾值赶促,超過(guò)就報(bào)警、KILL
- 業(yè)務(wù)功能測(cè)試階段挟炬,輸出所有g(shù)eneral_log鸥滨,分析日志行為,提前發(fā)現(xiàn)
- 5.6 or higher谤祖,把innodb_undo_tablespaces設(shè)置成2