一致性問題
老師你好。
你這里關(guān)于一致性的定義是"能保證看到系統(tǒng)內(nèi)的所有更改"
假設(shè)我們有兩個事務(wù):
事務(wù)A是一個讀事務(wù):
begin transaction
select * from table1 where id = 1;
commit;
事務(wù)B是一個寫事務(wù):
begin transaction
update table1 set name=newName where id = 1;
commit;
A事務(wù)先開始,B事務(wù)后執(zhí)行。如圖中所示,在事務(wù)A執(zhí)行過程中事務(wù)B已經(jīng)commit。
那么對于事務(wù)A而言在mvcc(mysql innodb)機(jī)制下能看到事務(wù)B更改的數(shù)據(jù)嗎。
2018-04-04
if (在事務(wù)A執(zhí)行過程中事務(wù)B已經(jīng)commit){
????如果你可以確定? 那么是一定可以讀出來的?
}else if(但是基本是我們不能確定事務(wù)A執(zhí)行過程中事務(wù)B是否commit){? ?
????if(如果mvcc設(shè)置的read commit?){
? ? 你說了?A事務(wù)先開始,B事務(wù)后執(zhí)行 因?yàn)閁鎖的原因? 兩個事件是并行的.
????讀提交時,讀事務(wù)每次都讀取undo log中最近的版本,因此兩次對同一字段的讀可能讀到不同的數(shù)據(jù)(不可重復(fù)讀),但能保證每次都讀到最新的數(shù)據(jù)。
??????所以可以讀出來? 即用log實(shí)現(xiàn)視點(diǎn)2(雖然還沒Commit)
????}else if(如果mvcc設(shè)置的Repeatable read ){
? ??????每次都讀取指定的版本,這樣保證不會產(chǎn)生不可重復(fù)讀,但讀不到最新的數(shù)據(jù)
????????所以可以讀不出來? 即視點(diǎn)1
????}
}
當(dāng)然這一切都是假定在txA和txB同時進(jìn)行的前提下?
?
????