MySQL中關(guān)于事務(wù)的具體詳解

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

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享