1.事務:是指一組不可分割的邏輯單位,由acid四大屬性來描述
(1)原子性:是指一組sql要麼全做完commit,要不就rowback。
(2)一致性:是指事務要從乙個一致性狀態變為另乙個一致性行狀態,這裡的一致性是指資料完整性和業務邏輯的一致性。
(3)永續性:是指一旦事務提交後對資料庫的改變是永久性的,即使系統崩潰依然能夠通過日誌進行恢復。
(4)隔離性:在併發運算元據庫時,其它事務不能讀取到當前事務操作過程中的資料。假設a事務正在進行寫操作,那麼b事務只能讀取到a事務修改之前的資料或者是a事務提交之後的資料。
2.由於事務的隔離性的不同可能出現以下幾種問題:
(1).髒讀:a事務讀取到了b事務正在修改的資料(注意此時b事務還沒有進行提交或者回滾)
(2).不可重複讀:主要是針對delete與update這兩個操作,a事務按照某個條件進行查詢,此時b事務修改(delete或update)了某條資料並提交,此時a事務在去按照原來的條件去查詢發現資料改變了。
(3).幻讀:主要是針對insert操作,a事務按照某個條件進行查詢,此時b事務插入了某條資料並提交,此時a事務在去按照原來的條件去查詢發現多了行資料(這些多出來的行為幻影行)。
3.為了解決這些問題,資料庫定義了幾大隔離級別:
(1)讀未提交:可能出現髒讀,不可重複度以及幻讀,這個狀態隔離性最差。
(2)讀已提交:解決了髒讀,依然有不可重複度以及幻讀。
(4)序列化:解決了所有的問題。
4.在mysql中是通過樂觀鎖(mvcc)以及悲觀鎖來實現事務的隔離級別的。
5.在mysql的innodb引擎中預設為可重複讀級別的,在此級別通過間隙鎖(gap鎖)來解決幻影行的插入。
6.可能有人會認為不可重複度與幻讀好像差不多,我說一下我的理解
(1).首先我認為不可重複度與幻讀的區分在於解決方法的不同。
(2).對於update或者delete來說我們只需要將符合條件的記錄加鎖就可以解決了,但是此時依然無法避免其它符合條件的記錄插入進來。這個就是可重複度轉態。
(3).對於insert操作來講,我們還需要將符合條件的行的間隙之間加鎖,才能解決幻影行的插入。
mysql插入 mysql條件插入
新建表 create table t user usernamevarchar 100 gender varchar 2 帶條件插入,如果表中沒有username name1 的記錄,就插入,否則就不插入 insert into t user select name1 m from dual whe...
mysql 動態插入 MySql條件插入動態值
所以在我解釋我的問題之前,這裡有一些 定義,以幫助說明我的問題 holds data about different memberships create table if not exists member types id int unsigned not null auto increment...
mysql的插入語句的條件插入
mysql的建立表語句 create table coordination template share id int 11 not null auto increment,regional id int 11 default null,org id int 11 default null comm...