原子性(atomicity)
原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
一致性(consistency)
事務前後資料的完整性必須保持一致。
隔離性(isolation)
事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。
永續性(durability)
永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。
例:
start
transaction
;//開始事務
update a set x=x-
2000
;//實際沒變
update b set y=y+
2000
;//實際沒變
commit
;//事務結束,實際修改
-- rollback-- 回退
start
transaction
;update a set x=x-
2000
;//實際沒變
update b set y=y+
2000
;//實際沒變
rollback
//撤回事務所有操作,事務自動關閉
可以回退的sql:
insert\update\delete,不能回退create和drop操作
使用保留點:
為了支援回退部分事務處理
建立保留點佔位符:
create delete1;
//事務處理完成自動釋放
回退到某個保留點:
rollback
to delete1;
檢視當前事務隔離級別:
5.7版本:(select @@tx_isolation
;)8.0版本: (
select @@transaction_isolation
;)
四種級別:
讀未提交(read uncommit):乙個會話查到另乙個會話的未提交事務所作的修改
也稱為髒讀。
不可重複讀(read commit):乙個事務要等到另乙個事務提交後才能讀到
也稱為提交讀。兩次同樣的查詢,可能有不一樣的結果。
重複讀(repeatable read):mysql預設事務隔離級別
同一事務內多次讀到的資料一致
解決了髒讀,理論無法解決幻讀,但可通過mvcc解決(間隙鎖)。
序列化(serializable):不常用,解決幻讀。最高端別,加行級鎖,消耗資源大。
設定事務隔離級別:
對全域性設定: set
transaction
isolation
level 事務隔離級別名;
僅當前會話: set
session
transaction
isolation
level 級別名;
事務日誌:
儲存引擎再修改表資料時只需要修改其記憶體拷貝,
再將記錄持久到硬碟上的事務日誌中,然後記憶體中被
修改的資料可以在後台慢慢刷回磁碟。稱為預寫式日誌。
中途崩潰,儲存引擎重啟時自動恢復。
檢視是否自動提交:
show variables like
'autocommit'
;
設定不自動提交:
set autocommit=
0;
mysql預設每一條查詢當作乙個事務自動提交。oracle不自動提交
共享鎖(讀鎖): 共享的,相互不阻塞。
排它鎖(寫鎖): 排他的,乙個會阻塞其他的寫鎖和讀鎖
表鎖: 鎖定整張表,寫操作阻塞其他使用者,讀鎖不相互阻塞
行級鎖: 儲存引擎層實現。
死鎖:
兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源。
例:資料衝突:多個事務以不同順序鎖定同一資源時,多個事務同時鎖定同一資源時。
儲存引擎的實現方式也可能導致死鎖。
解決方案:
1.檢測返錯
2.超時放棄(不太好)。
innodb處理死鎖:
將持有最少行級排他鎖的事務進行回滾,然後重新執行。
mvcc://多版本併發控制----此處僅指innodb的mvcc
可以認為是行級鎖的乙個變種,很多情況下避免加鎖操作,使開銷更低。
通過儲存資料在某個時間點的快照來實現的,不管需要執行多長時間,每個事務看到的資料一致。
innodb的mvcc:
通過記錄後面儲存兩個隱藏的列來實現的,乙個儲存行建立時間,乙個儲存行過期時間。
時間指的是系統版本號,每開乙個新事務,此號自動遞增。
預設隔離級別下mvcc的操作過程:
select:
1.innodb只查詢版本早於當前事務的資料行,這樣可以確保事務讀取的行,
要麼是在事務開始前已經存在,要麼是事務自身插入或修改過的。
2.行的刪除版本要麼未定義,要麼大於當前事務版本號,這樣可以確定
事務讀取到的行是在事務開始之前未被刪除。
insert:
innodb為新插入的每一行儲存當前系統版本號作為行版本號。
delete:
innodb為新刪除的每一行儲存當前系統版本號作為行刪除版本號。
update:
innodb為插入一行新紀錄儲存當前版本號作為行版本號,同時儲存當前系統版本號到
原來的行作為行刪除標識。
優點:這樣設計使得大多數讀操作不用加鎖,讀資料操作簡單,效能很好。
不足:需要額外的儲存空間,更多的行檢查,額外的維護工作。
myisam儲存引擎:
不支援事務和行級鎖,崩潰後無法安全修復。
加鎖與併發:對整張表加鎖,讀加共享鎖,寫加排他鎖,讀查詢時可併發插入。
JDBC之事務處理
try catch 首先開啟事務,然後執行dml操作,如果所有的dml操作都正確執行,則使用commit提交事務 如果有的dml操作不能正確執行,則捕獲該異常,跳過commit語句,在catch語句塊中使用rollback回滾事務。public class test catch exception ...
myrocks之事務處理
mysql目前支援的事務引擎有innodb,tokudb.rocksdb加入mysql陣營後,mysql支援的事務引擎增長至3個。myrocks目前支援的事務隔離級別有read committed和repeatable read.同innodb一樣,myrocks也支援mvcc機制。可以說,myro...
MySQL事務處理
start transaction,commit和rollback語法 start transaction begin work commit work and no chain no release rollback work and no chain no release set autocom...