1.1 事務
所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的單位。例如,在關係型資料庫中,乙個事務可以是一條sql語句、一組sql語句或者整個程式。
在sql中,定義事務的語句一般有三條:
begin transaction
commit
rollback
事務通常是以begin transaction開始,以commit或者rollback結束。commit表示提交,即提交事務的所有操作。具體而言是指將事務中所有對資料庫的更新寫道磁碟上的物理資料庫中去,事務正常結束。rollback表示回滾,即在事務執行的過程中發生故障,十**能繼續執行,系統將事務中對資料庫的所有已完成的操作全部撤銷,回滾到事務開始時的狀態。
事務具有四個特性:原子性、一致性、隔離性和持續性。
第一類丟失更新:對於乙個事務回滾另外乙個事務提交而引起的資料不一致的情況,我們稱為第一類丟失更新
第二類丟失更新:多個事務提交引發的丟失更新稱為第二類丟失更新。 時刻
事務1事務2
備註t0……
商品初始化庫存為2
t1讀取庫存為2
t2扣減庫存
庫存為1
t3扣減庫存
庫存為0,讀取事務1未提交的庫存資料
t4提交事務
庫存儲存為0
t5回滾事務
因為第一類丟失更新已經克服,所以不會回滾為2,庫存為0,結果錯誤 時刻
事務1事務2
備註t0……
商品初始化庫存為2
t1讀取庫存為2
t2扣減庫存
庫存為1
t3扣減庫存
庫存為1,讀取不到事務1未提交的庫存資料
t4提交事務
庫存為1
t5回滾事務
因為第一類丟失更新已經克服,所以不會回滾為2,庫存為1,結果正確
讀寫提交也會產生下面的問題。
時刻事務1
事務2備註t0…
…商品初始化庫存為1
t1讀取庫存為1
t2扣減庫存
事務未提交
t3讀取庫存為1
認為可以扣減
t4提交事務
庫存為0
t5扣減庫存
失敗,因為此時庫存為0,無法扣減
以上的現象稱為不可重複讀,不可重複讀是指事務1讀取事務後,事務2執行更新操作,使得事務1無法再現前一次讀取結果。這就是讀寫提交的不足。為了克服這個不足,資料庫的隔離級別還提出了可重複讀的隔離級別,他能消除不可重讀的問題。 時刻
事務1事務2
備註t0……
商品初始化庫存為1
t1讀取庫存為1
t2扣減庫存
事務未提交
t3嘗試讀取庫存
不允許讀取,等待事務1提交
t4提交事務
庫存為0
t5讀取庫存
庫存為0,無法扣減
此時會引發新的問題出現,這就是幻讀,如下表所示。
時刻事務1
事務2備註
t1讀取庫存為50件
商品庫存初始化為100,現在已經銷售50筆,庫存為50件
t2查詢交易記錄,50筆
t3扣減庫存
t4插入一筆交易記錄
t5提交事務
庫存49件,交易記錄51筆
t6列印交易記錄,51筆
這裡與查詢的不一致,在事務2看來有一筆是虛幻的,與之前查詢不一致
以上便是幻讀現象。
專案型別
髒讀不可重複讀
幻讀未提交讀√√
√讀寫提交×√
√可重複讀××
√序列化××
×對於oracle預設的隔離級別未讀寫提交,mysql則是可重複讀。
《資料庫系統概述》
《深入淺出springboot》
事務的介紹以及事務隔離級別
在資料庫操作中,一項事務 transaction 是由一條或多條運算元據庫的sql語句組成的乙個不可分割的工作單元。當事務中的所有操作都正常完成時,整個事務才能被提交到資料庫中,如果有一項操作沒有完成,則整個事務會被回滾。其實事務總結起來理解為 邏輯上的一組操作,組成這組操作的各個單元,要麼一起成功...
MySQL 事務處理的基本概念 隔離級別與鎖
2.mysql 事務的隔離級別與鎖 show engines 只有 innodb 支援事務 create table software sid int version int engine innodb 預設儲存引擎都是 innodb select from software start trans...
MySQL的基本特性以及事務的隔離級別
原子性 要操作的事務被看作乙個整體單元,要麼全部成功,要麼全部失敗 一致性 事務完成時,必須所有的資料都保持一致狀態 隔離性 併發時,防止多個事務交叉進行,而導致的資料不一致,提交後會導致丟失更新 永續性 保證資料會固化到乙個地方,即永久修改 第一類丟失更新 併發訪問時,將其他事務提交的資料回滾 第...