1、原子性:事務中的所有操作要麼不執行,要麼都執行
2、一致性:資料遵循守恆,a向b轉了100,事務結束後必定是a少了100,b多了100
3、隔離性多個事務併發執行的化,必定和穿行執行的效果一樣
4、永續性:事務在執行結束後,對資料庫的影響是永久的
1、髒讀:不同事務,乙個事務讀了另乙個事務沒有提交的資料
2、不可重複讀:多次讀取同乙個資料的結果不一樣。即在連續的倆次讀取之間,有一事務對這一資料做了修改並提交了
3、幻讀:一事務對錶某範圍的資料做修改,另一事務對該錶做插入,插入的資料剛好符合上一事務的範圍,上一事務的使用者發現還有沒有修改的資料。
1、讀未提交:讀到沒有提交的資料。存在髒讀,幻讀,不可重複讀問題
2、讀提交:只能讀到已經提交的資料。存在不可重複讀,幻讀問題
3、可重複度:事務開啟時就不允許對該資料做修改操作,即給第乙個updata操作加行鎖。存在幻讀問題,因為幻讀是對資料刪除或者修改。(mysql預設級別)
4、序列化:乙個事務執行完了另乙個事務才能執行。解決三個問題,但是效率奇差。
1、行鎖:阻塞一行,對其他行沒影響
一、按讀寫分類
1、讀鎖(s鎖):共享鎖,加鎖後,其他事物可以讀,可以加讀鎖但不可以寫,不可以加寫鎖
select。。。lock in share mode
將查詢到的資料加讀鎖,其他事務可以查到該資料,並也可以給這條資料加讀鎖。
應用場景:讀出資料後,其他事務不能修改,但自己也不一定能修改,因為其他事務也可以加讀鎖。
2、寫鎖:排他鎖。加鎖後其他事務不能加讀鎖也不能加寫鎖。但是select可以通過。
select。。。for update
另外,insert,update,delete也加了寫鎖
應用場景:只有自己這個事務可以修改該資料。
事務commit或rollback就可釋放鎖
可重複讀級別下for update解決幻讀:
事務查詢select。。。for update並用到索引,會對查到的字段和間隙加寫鎖。沒用到索引,會對錶中所有記錄及間隙加寫鎖,因為不加鎖你會修改某一行使之滿足查詢條件,再次查詢的時候依然會產生幻讀現象
1.當begin乙個事務,第一次查詢乙個資料,這個資料的值一定是剛剛其他事務提交後的值。也就是說已經開啟了乙個事務,在沒有select的情況下,其他事務修改了a的值並提交,這時執行這個事務第乙個select,查詢這個a,a的值就是剛剛那個事務提交的,而不是事務開啟時a的值。select後會對a建立了乙個快照,緊接著的select會直接找快照中的,而不是資料庫的
紅色的標號表示sql執行順序。
例子中事務開啟時,a的值是4,之後其他事務給a-1;左邊的事務select,值為當前資料庫的值
2.之後再對a updata,updata的對像是資料庫中的a,而不是mvcc建立的快照快取中的a,也就是說,當事務update,mvcc會更新快照。比如快照中a的值時200,其他事務對a減了50並提交,資料庫a的值就是150了,原先的事務在updata a-50,這時就會以資料庫的值150,做操作,select一下時100,然後mvcc有建立了乙個新的對a的快照版本。(有可能錯誤,僅供參考)
接著上乙個例子,開始資料庫的值為3,左邊事務更新並提交,此時資料庫a為2,右邊事務再更新,a的值是當前資料庫中a的值2,而不是3;
其實mvcc會維護乙個儲存了當前活躍事務id的陣列,當事務update的時候,mvcc會增加乙個快照版本,當事務提交之後,就會從活躍事務id的陣列中刪除。
而該事務沒更新,不管其他事務如何更新,該事務的a永遠是當前版本的a。我覺得第一次事務快照的版本是根據事務第一次使用select的值建立的。
資料庫事務隔離級別
資料庫事務隔離,髒讀、幻讀、不可重複讀
資料庫知識點之 悲觀鎖與樂觀鎖
在實際的開發過程中,我們應該經常用到悲觀鎖。以前一直沒關注理論,只是在實踐中,今天搜尋了下,其實就是對這兩個名詞的概念解釋。悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到...
資料庫面試知識點彙總 三
1.什麼是索引?何為索引 資料庫索引,是資料庫管理系統中乙個排序的資料結構,索引的實現通常使用b樹及其變種b 樹。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。2.索引的作用?...
資料庫知識點
1.truncate delete和drop delete delete是一行行刪除資料,不影響表結構,並且會記錄日誌,可以進行回滾。truncate 刪除表中所有資料,不記錄日誌,不可以回滾,truncate之後表空間和索引大小會回到初始值。所以truncate之前最好備份 drop 刪除整個表結...