首頁(yè)技術(shù)文章正文

什么是事務(wù)?什么是事務(wù)安全?

更新時(shí)間:2023-02-23 來(lái)源:黑馬程序員 瀏覽量:

事務(wù)

計(jì)算機(jī)中的事務(wù)是指某個(gè)程序執(zhí)行單元(寫操作),事務(wù)安全是當(dāng)事務(wù)執(zhí)行后,保障事務(wù)的執(zhí)行是有效的,而不會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)亂。事務(wù)安全通常針對(duì)的是一連串操作(多個(gè)事務(wù))而產(chǎn)生的統(tǒng)一結(jié)果。事務(wù)安全通常針對(duì)的是一連串操作(多個(gè)事務(wù))而產(chǎn)生的統(tǒng)一結(jié)果。

MySQL中默認(rèn)的寫操作是直接寫入的,可以執(zhí)行寫操作SQL,也可以同步到數(shù)據(jù)表。

例如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)賬到B賬戶,創(chuàng)建數(shù)據(jù)表代碼如下:

create table t_52(
    id int primary key auto_increment,
    name varchar(50) not null,
    account decimal(10,2) default 0.00
)charset utf8;

insert into t_52 values(null,'Tom',10000),(null,'Lucy',100);

Tom向Lucy轉(zhuǎn)賬,一定是分為兩步

# Tom扣錢
update t_52 set account = account - 1000 where id = 1;

# Lucy收錢
update t_52 set account = account + 1000 where id = 2;

以上兩步必須都成功轉(zhuǎn)賬才能叫成功,兩步操作無(wú)法確保哪一步會(huì)出問(wèn)題(尤其是第二步)。為了保障兩步都成功才能叫事務(wù)安全。

事務(wù)安全原理

事務(wù)安全是在操作前告知系統(tǒng),接下來(lái)所有的操作都暫不同步到數(shù)據(jù)表,而是記錄到事務(wù)日志,指導(dǎo)后續(xù)所有操作都成功,再進(jìn)行同步;否則取消所有操作。

以上述轉(zhuǎn)賬為例

graph TB
A(轉(zhuǎn)賬開(kāi)始)-->B[開(kāi)啟事務(wù)]
B-->C{事務(wù)1:Tom轉(zhuǎn)出1000}
C-->|成功|D[記錄到事務(wù)日志]
C-->|失敗|G
D-->E{事務(wù)2:Lucy轉(zhuǎn)入1000}
D-->|失敗|G
E-->|成功|F[記錄到事務(wù)日志]
F-->G[關(guān)閉事務(wù)<br>成功:提交事務(wù) 同步到數(shù)據(jù)表\清除事務(wù)日志<br>失敗:回滾事務(wù) 清除事務(wù)日志]
G-->H((結(jié)束))

事務(wù)安全常見(jiàn)類型

事務(wù)安全是利用自動(dòng)或者手動(dòng)方式實(shí)現(xiàn)事務(wù)管理,事務(wù)安全包括以下幾種類型:

自動(dòng)事務(wù)處理:系統(tǒng)默認(rèn),操作結(jié)束直接同步到數(shù)據(jù)表(事務(wù)關(guān)閉狀態(tài))

系統(tǒng)控制:變量 autocommit(值為ON,自動(dòng)提交)

手動(dòng)事務(wù)處理的常見(jiàn)操作

開(kāi)啟事務(wù): start transaction

關(guān)閉事務(wù)

提交事務(wù):commit(同步到數(shù)據(jù)表同時(shí)清空日志數(shù)據(jù))

回滾事務(wù):rollback(清空日志數(shù)據(jù))

事務(wù)回滾:在長(zhǎng)事務(wù)執(zhí)行中,可以在某個(gè)已經(jīng)成功的節(jié)點(diǎn)處設(shè)置回滾點(diǎn),后續(xù)回滾的話可以回到某個(gè)成功點(diǎn)

設(shè)置回滾點(diǎn):savepoint 回滾點(diǎn)名字

回滾到回滾點(diǎn):rollback to 回滾點(diǎn)名字
仍舊以手動(dòng)事務(wù)中啟用事務(wù)轉(zhuǎn)賬,成功提交事務(wù)為準(zhǔn),演示銀行轉(zhuǎn)賬從A賬戶轉(zhuǎn)賬到B賬戶的過(guò)程。

創(chuàng)建數(shù)據(jù)表

create table t_52(
    id int primary key auto_increment,
    name varchar(50) not null,
    account decimal(10,2) default 0.00
)charset utf8;

insert into t_52 values(null,'Tom',10000),(null,'Lucy',100);

轉(zhuǎn)賬:Tom向Lucy轉(zhuǎn)賬,一定是分為兩步

# Tom扣錢
update t_52 set account = account - 1000 where id = 1;

# Lucy收錢
update t_52 set account = account + 1000 where id = 2;

事務(wù)安全原理

事務(wù)安全是在操作前告知系統(tǒng),接下來(lái)所有的操作都暫不同步到數(shù)據(jù)表,而是記錄到事務(wù)日志,指導(dǎo)后續(xù)所有操作都成功,再進(jìn)行同步;否則取消所有操作

graph TB
A(轉(zhuǎn)賬開(kāi)始)-->B[開(kāi)啟事務(wù)]
B-->C{事務(wù)1:Tom轉(zhuǎn)出1000}
C-->|成功|D[記錄到事務(wù)日志]
C-->|失敗|G
D-->E{事務(wù)2:Lucy轉(zhuǎn)入1000}
D-->|失敗|G
E-->|成功|F[記錄到事務(wù)日志]
F-->G[關(guān)閉事務(wù)<br>成功:提交事務(wù) 同步到數(shù)據(jù)表\清除事務(wù)日志<br>失敗:回滾事務(wù) 清除事務(wù)日志]
G-->H((結(jié)束))

總結(jié):事務(wù)的目的就是為了保障連續(xù)操作的一致性,保證結(jié)果的完整性。事務(wù)的原理是通過(guò)將操作結(jié)果暫時(shí)保存在事務(wù)日志中,等所有操作的結(jié)果都是成功的,然后一并同步到數(shù)據(jù)表。


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!