MySQL學習記錄 事務篇

2021-10-22 04:51:00 字數 3061 閱讀 5770

事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,就全部不成功,同乙個事務的操作具備同步優點

start

transaction;|

begin

;···

····

rollback

;commit

;

start transaction | begin:開啟事務(處於事務中,不會影響資料庫資料)

rollback:回滾事務(取消事務,前提是事務未提交前回滾)

commit :事務提交(事務生效後會立即影響資料庫資料)

原子性(atomicity)

指事務是乙個不可分割的工作單位,事務中的操作要麼執行成功,要麼執行失敗

一致性(consistency)

事務前後資料的完整性必須保持一致(資料庫的完整性:如果資料庫在某個時間點下,所有的資料都符合所有的約束,則稱資料庫為符合完整性的狀態)

隔離性(isolation)

指多個使用者併發訪問資料庫時,乙個使用者的事務不能被其它使用者的事務所干擾,多個併發事務之間資料要相互隔離

永續性(durability)

指乙個事務一旦被提交,資料庫中的資料改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響

髒讀:兩事務 某一事務讀取到另乙個事務修改且未提交的資料

不可重複讀:某一事務多次讀取同一條記錄的過程,讀取的結果不相同過程資料有更改,讀取到另乙個事務已經提交的資料

虛讀(幻讀):某一事務多次查詢資料,由於其他事務 新增 或 刪除 記錄造成多次查詢出的記錄條數不同

防止不同隔離性的問題

隔離型別

髒讀不可重複讀

幻讀未提交read uncommitted

允許允許

允許已讀提交read committed

禁止允許

允許可重複讀repeatable read

禁止禁止

可能順序讀serializable

禁止禁止

禁止一般預設可重複讀repeatable read 、已讀提交read committed

修改隔離級別

set [session | global] transaction isolation level 隔離型別;

session:當前會話

global:全域性

查詢隔離級別

select @@tx_isolation; (mysql版本8前)

select @@transaction_isolation; (mysql版本8後)

未提交 (read uncommitted)

讀未提交,該隔離級別允許髒讀取,其隔離級別是最低的

時間(t)

事務a (存)

事務b(取)

t1開始事務

開始事務

t2==

查餘額(500元)

t3==

取300元

t4查餘額(200元)

==t5

==滾動事務

t6存800元

==t7

提交事務

==t8

取100元

t9提提交事務

最後餘額剩1200元。t4 a髒讀b修改的資料,t5 b回滾(撤回t5前的所有操作),最後b只提取100元!

已讀提交 (read committed)

讀已提交是不同的事務執行的時候只能獲取到已經提交的資料

時間(t)

事務a (存)

事務b(取)

t1開始事務

開始事務

t2==

查餘額(500元)

t3查餘額(500元)

==t4

==取500元

t5查餘額(500元)

==t6

==提交事務

t7查餘額(0)

t8提交事務

a只能讀取 事務提交後的資料!!

可重複讀 (repeatable read)

保證在事務處理過程中,多次讀取同乙個資料時,該資料的值和事務開始時刻是一致的

時間(t)

事務a事務b

t1開始事務

t2查所有資料

開始事務

t3==

插入一條資料

t4==

提交事務

t5查所有資料

t6修改範圍資料

t7查所有資料!

t8提交事務

事務a 的 t3 查詢資料 與 t5查詢資料 是一樣的 ,資料無誤後 對整表資料值修改,緊接查詢事務多出了一條資料!!(a 沒有對新增資料進行更改,則不會顯示,除非事務提交)

順序讀 (serializable)

最嚴格的事務隔離級別。事務以排隊形式進行執行。某一事務對資料進行修改必須等另乙個 提交 或 回滾 ,才可以進行資料修改!!

讀未提交(ru):有行級的鎖,沒有間隙鎖。與rc的區別是能夠查詢到未提交的資料

讀已提交(rc):有行級的鎖,沒有間隙鎖,讀不到沒有提交的資料

可重複讀(rr):有行級的鎖,有間隙鎖,每讀取的資料都一樣,且沒有幻讀的情況

序列化(s):有行級鎖,也有間隙鎖,讀表的時候,就已經上鎖了

MYSQL之事務篇

在引入事務之前我們先考慮銀行轉賬的操作 從id 1的賬戶給id 2的賬戶轉賬100元 第一步 將id 1的a賬戶餘額減去100 update accounts set balance balance 100where id 1 第二步 將id 2的b賬戶餘額加上100 update accounts...

mysql事務學習

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!在 mysql 命令列的預設設定下,事務都是自動提交的,即執行 sql 語句後就會馬上執行...

mysql事務學習

mysql 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除乙個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成乙個事務!在 mysql 命令列的預設設定下,事務都是自動提交的,即執行 sql 語句後就會馬上執行...