mysql事務(wù):
1.MySQL事務(wù)控制語(yǔ)句
(1).開啟事務(wù)
begin;
(2).提交事務(wù)
commit;
(3).回滾事務(wù)
rollback;
(4).設(shè)置事務(wù)是否自動(dòng)提交
set?autocommit?=?{0?|?1};?//?0不自動(dòng)提交,1自動(dòng)提交
例如:
begin;//?開啟事務(wù) insert?into?table_name?values(內(nèi)容); commit;//?提交事務(wù)
這個(gè)就是一個(gè)簡(jiǎn)單的插入數(shù)據(jù)的事務(wù)
begin;//?開啟事務(wù) insert?into?table_name?values(內(nèi)容);//?后悔了,不想插入數(shù)據(jù)了 rollback;//?回滾,取消這次的事務(wù)操作
這個(gè)就是一個(gè)簡(jiǎn)單的插入數(shù)據(jù)的回滾事務(wù)
2.MySQL事務(wù)隔離語(yǔ)句
查看MySQL的隔離級(jí)別
show?variables?like?'tx_isolation';
(1).read-uncommitted(讀取未提交內(nèi)容)
臟讀(帶來的問題);
一個(gè)用戶在兩次查詢結(jié)果中的內(nèi)容不相同.
設(shè)置默認(rèn)隔離級(jí)別(設(shè)置完成后需要重新登錄):
set?global?transaction?isolation?level?read?uncommitted;
兩個(gè)用戶同時(shí)登錄數(shù)據(jù)庫(kù),分別開啟事務(wù),一個(gè)用戶的事務(wù)執(zhí)行增刪改操作,另一個(gè)用戶的事務(wù)只進(jìn)行查詢操作,前者執(zhí)行完操作,不進(jìn)行提交,后者就可以看到操作結(jié)果,但如果這時(shí)候前者進(jìn)行了事務(wù)的回滾,后者這時(shí)候查詢就會(huì)看到不一樣與上次不一樣的結(jié)果(也就是沒有進(jìn)行操作的結(jié)果),這就是臟讀問題.
(2).read committed(讀取提交內(nèi)容)
事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變,同一查詢可能返回不同的結(jié)果,此級(jí)別導(dǎo)致的不可重復(fù)讀問題.
設(shè)置默認(rèn)隔離級(jí)別(設(shè)置完成后需要重新登錄):
set?global?transaction?isolation?level?read?committed;
在一次事務(wù)中,看到了兩次不一樣的查詢結(jié)果(與臟讀類似).
(3).repeatable read(可重復(fù)讀)
能確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行(數(shù)據(jù)庫(kù)的莫爾納隔離級(jí)別).
設(shè)置默認(rèn)隔離級(jí)別(設(shè)置完成后需要重新登錄):
set?global?transaction?isolation?level?repeatable?read;
也就在在一次事務(wù)中,無論另一個(gè)用戶如何修改數(shù)據(jù),在這次事務(wù)中查詢到的結(jié)果總是相同.
***隱式事務(wù)提交***:
alter?table?users?engine?=?innodb;//?會(huì)造成事務(wù)的隱式提交
3.InnoDB鎖機(jī)制
(1).一個(gè)表中沒有任何的主鍵和索引,一個(gè)事務(wù)會(huì)鎖住這個(gè)表的所有記錄,其他的事務(wù)無法進(jìn)行操作這個(gè)表.
(2).一個(gè)表中存在主鍵或者索引,一個(gè)事務(wù)會(huì)鎖住表的他操作的某行數(shù)據(jù),不回鎖住整個(gè)表,如果其他的事務(wù)操作這個(gè)表的其他數(shù)據(jù),這個(gè)時(shí)候是不受影響的.需要注意的是這的行級(jí)鎖是間隙鎖,也就是說如果你修改的某幾行數(shù)據(jù),比如過修改id