資料庫的事務就是保證資料的acid,原子性、一致性、隔離性、永續性,那麼沒有事務的話,會出現哪些問題呢?
第一部分:資料庫事務存在的必要性
1、丟失更新(lost update)
兩個事務同時都更新一行資料,但是第二個事務卻中途失敗退出,導致對兩個修改都失效了。
2、髒讀(dirty reads)
乙個事務開始讀取了某行資料,但是另外乙個事務已經更新了此資料但是沒有及時提交,這是相當危險的,因為可能所有資料都被回滾
3、不可重複讀(none-repeatable reads)
乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果,同一查詢在同一事務中多次進行,由於其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重複讀。
4、二類丟失更新(second lost updates problem)
無法重複讀的特例,有兩個併發事務同時讀取同一行資料,然後其中乙個對他進行修改提交,而另外乙個也進行修改提交,這就造成第一次寫操作失敗
5、幻讀(phantom reads)
事務在操作過程中出現兩次查詢,第二次查詢結果包含了第一次查詢中未出現的資料,這是因為在兩次查詢過程中有另外乙個事務插入資料造成的。
於是為了解決問題,資料庫在設計的時候就考慮到這些問題,並進行了解決。
第二部分 事務隔離級別
1、未提交讀(read uncommitted)
直譯就是「讀未提交」,乙個更新語句沒有提交,但是別的事務可以讀到這個改變,這是很不安全的,允許任務讀取資料庫中未提交的資料更改,也稱為「髒讀」
2、提交讀(read committed)
直譯就是「讀提交的」,可以防止髒讀,就是事務在執行commit以後,別的事務才能讀到這個資料的更改,只能讀到已經提交的資料,oracle等許多資料庫都是預設該級別。該級別消除了髒讀,存在不可重複讀。
3、可重複讀(repeatable read)
直譯就是「可重複讀」,就是說在同乙個事務裡面先後執行同乙個查詢語句的時候得到的結果是一致的,同乙個事務內查詢都是事務開始時刻一致的。該級別消除了不可重複讀但是存在幻讀。
4、序列讀(serializable)
直譯就是「序列化」,意思就是說這個事務執行的時候不能讓別的事務併發執行,完全序列化度,每次事務都要獲取表級共享鎖,讀寫都會相互阻塞。
第三部分:資料庫事務的級別的設定
mysql:
修改事務隔離級別:
mysql> set global transaction isolation level read committed;
mysql> set session transaction isolation level read committed;
postgres:
官方介紹
set transaction serializable
設定序列化級別,最高
set transaction read committed
設定讀提交級別,level2
注意:資料庫預設級別一般都是read committed級別
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...