資料庫事務隔離和鎖的東西,學習了一下,現講解一下自己的理解
事務:把多條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上做實驗。
資料庫的鎖,事務和事務隔離
資料庫中的鎖 鎖的種類 按照鎖的內容上分為 表鎖,頁鎖,行鎖。innodb支援行鎖,myisam支援表鎖,berkeleydba支援頁鎖。不同的粒度 按照鎖的性質分可以分為 共享鎖 讀鎖或s鎖 獨佔鎖 寫鎖,排它鎖 x鎖 更新鎖 u鎖 意向鎖 當執行select時候,加共享鎖,當insert upd...
資料庫鎖和事務隔離級別
建立表account create table account id int not null auto increment,name varchar 255 default null,balance int default null,primary key id engine innodb def...
資料庫事務隔離級別與鎖
四,隔離級別對併發的控制 下表是各隔離級別對各種異常的控制能力。lu丟失更新 dr髒讀 nrr非重複讀 slu二類丟失更新 pr幻像讀 未提交讀 ruyy yyy提交讀 rcnn yyy可重複讀 rrnn nny序列讀 snn nnn 順便舉一小例。ms sql 事務一 set transactio...