資料庫事務隔離和鎖,資料庫事務隔離
概述
資料庫事務隔離和鎖的東西,學習了一下,現講解一下自己的理解
資料庫事務隔離 概念
事務:把多條sql語句作為一個整體和資料庫互動。這裡需要注意,一個事務可有多條SQL語句,雖然這些SQL語句最終的結果變成一個整體,要成功都成功,要失敗都失敗,但是,裡面的每條SQL語句卻是單條執行的。
資料庫事務隔離:講的是多個事務(操作同一張表)之間,一個事務內部單條select語句執行的結果在其他事務中的時機。
交易隔離等級
Read Uncommitted:讀未提交,事務中的select語句查詢表的結果是,其他事務未提交的時刻,即,事務1對錶1的select,查到了事務2的Update語句的結果,雖然,事務2中update之後的語句還沒有執行。
Read Committed:讀已提交,事務1對錶1的select,查到的結果是其他對錶1以commit的事務,實機是其他事務執行完成,對於其中途的更新,事務1不會讀到結果。
Repeatable table:可重複讀,事務1中對錶1的select讀到的結果是不變的,注意,如果讀後有更新操作,並且又讀表1,那麼,此時讀到的是已提交的資料,所以,這個隔離等級有可能產生幻讀(後面講這個概念)。
Serializable:序列化,事務的各種問題,都是因為資料庫允許多個事務可以並存執行,但是,如果我們讓資料庫串列執行事務,那麼不就什麼問題都沒有了嘛,Serializable就是這個隔離等級
髒讀、幻讀、可重複讀和不可重複讀取
這些概念的產生也是因為多個事務並發產生的,所以,在理解這些內容的時候,一定要想著多個事務同時執行的這麼一個情況。
髒讀:事務1對錶1的select查詢(一條記錄),讀取的是事務2對錶1(該條記錄)update結果後的內容,此時,事務2復原,此時事務1讀到的資料就是髒資料,稱此為髒讀,即:這條記錄的內容是不真實的。
幻讀:事務1對錶1的select查詢獲得結果(一條記錄)後,事務2對錶1insert一條記錄,然後,事務1又使用該select語句查詢結果(兩條記錄),發現資訊量的變了,稱此為幻讀,即:原資訊內容沒有變,但是量不同了。
重複讀:事務1對錶1的select查詢得到結果後,這個結果是在之後的select查詢是不變的(之前沒有更新語句) ,稱此為重複讀。不可重複讀取與之相反。
資料庫鎖
關於資料庫鎖的內容,只講解共用鎖定,更新鎖定和排它鎖的特性。
共用鎖定、更新鎖定和排它鎖之間的關係
單個資源可以有多個共用鎖定;單個資源有了獨佔鎖定後,不可以加其它的鎖;單個資源上有了其它鎖(共用鎖定或更新鎖定)後,不可以再給這個資源直接加上一個排它鎖;單個資源只能有一個更新鎖定;單個資源可以在有更新鎖定的同時,再給資源加上共用鎖定,並且,之後,這個資源的更新鎖定可以在這個共用鎖定存在的時候進行升級,轉換為排它鎖;
死結
單個SQL語句都具有鎖,預設的select語句執行時,給資源加了共用鎖定,一旦select執行完成,那麼這個共用鎖定也就沒有了,即使預設select語句在事務中,此時易造成一個死結,那就單個select執行的時間太長,並且執行的次數多,這個時候,表內容的更新就會等,等到表中一個共用鎖定都沒有的時候才可以執行,這種情況的執行我們可以使用單條select不加共用鎖定的語句解決。
更新的SQL語句加的為排它鎖,當更新語句在事務中時,就會把鎖的生命週期變成和事務一樣的長,此時需要注意,訪問資源的順序,可能會造成死結的問題。
總結
上面的內容不是很完整,例如:事務的隔離等級對髒讀、幻讀和不可重複讀取的影響。死結的那塊內容下去可以接在SQL Server上做實驗。