MySQL之事務處理

2021-09-29 01:16:59 字數 3263 閱讀 5803

原子性(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...