資料庫的操作無非3種型別
1.如果是兩個執行緒併發修改,一定會相互搗亂,這時必須利用鎖機制防止多執行緒的併發修改(資料庫自己已經幫我們實現)
2.如果兩個執行緒併發查詢,沒有執行緒安全問題
3.如果兩個執行緒乙個修改,乙個查詢.....(對於這種情況有三種情況)
髒讀:乙個事務讀取到另乙個事務未提交的資料。
不可重複讀:乙個事務內多次讀取到的表中某一行的資料是不同的
虛讀(幻讀):是指乙個事務內讀取到了別的事務插入的資料,導致前後讀取
不一致。
不可重複讀和虛讀的區別:
避免不可重複讀需要鎖行就行
避免幻讀則需要鎖表
髒讀也好,不可重複讀也好,虛讀(幻讀)也好,只有
在某些業務場景下才是問題,有些業務場景下是正確的。
資料庫定義了四種隔離級別:
serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(序列化) 相當於資料庫被設計為單執行緒,可以防止上述所有問題。
repeatable read:可避免髒讀、不可重複讀情況的傳送。(可重複讀)不可以避免虛讀
read committed:可避免髒讀情況的傳送(讀已提交)
read uncommitted:最低級別,以上情況均無法保證。(讀未提交)
真正使用資料庫的時候,根據自己使用資料庫的需求,選擇乙個隔離級別使資料庫執行在這個隔離級別上。
mysql 預設下就是repeatable read隔離級別
oracle 預設下就是read committed隔離級別
設定事務的隔離級別
set [global/session] transaction isolation level
中括號中如果不寫,預設是當前客戶端和資料庫互動時的隔離級別,而如果是global,則修改的是資料庫的預設隔離級別。
session就好像一次連線一樣。
設定事務隔離級別
select @@tx_isolation 查詢當前事務隔離級別
資料庫中的鎖機制:
共享鎖:在飛serializable隔離級別做查詢不加任何鎖,而在serializable隔離級別下
做查詢加共享鎖,
共享鎖特點,共享鎖和共享鎖可以共存,但是共享鎖和排它鎖不能共存。
排它鎖的特點:在所有隔離級別下進行增刪改的操作都會加排他鎖,排他所的特點:
和任何其他鎖都不能共存。
因此可以想:它新記錄都插不進去,增刪改無法操作,自然可以防止所有的問題。
事務的隔離級別舉例 事務的隔離級別
乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...
事務的隔離級別舉例 JDBC事務隔離級別
一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...