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