一史简、定義
事務(wù):一系列要發(fā)生的連續(xù)操作
事務(wù)安全:一種保護(hù)連續(xù)操作同時(shí)滿足實(shí)現(xiàn)的一種機(jī)制
事務(wù)安全的意義:保證數(shù)據(jù)操作的完整性
事務(wù)的原理
事務(wù)在開啟后凑阶,所有的操作都會(huì)臨時(shí)保存到事務(wù)日志中瞳别,事務(wù)日志只有在commit 命令執(zhí)行后吃度,才會(huì)將數(shù)據(jù)同步到數(shù)據(jù)表项阴,其他任何情況都會(huì)被清空(rollback,斷電喊式,斷開連接)
二锌奴、事務(wù)操作
示例:
先創(chuàng)建一張賬戶表
create table my_account(
number char(16) not null unique comment "賬戶",
name varchar(20) not null,
money decimal (10,2) default 0.0 comment '賬戶余額'
) charset utf8;
--插入數(shù)據(jù)
insert into my_account (`number`,`name` ,`money` )values('0000000000000001','張三',1000),
('0000000000000002','李四',2000)
事務(wù)操作分為兩種:自動(dòng)事務(wù)和手動(dòng)事務(wù)
2.1手動(dòng)事務(wù)
操作流程
1.開啟事務(wù):告訴系統(tǒng)以下的操作(寫)兽狭,不要直接寫到數(shù)據(jù)表中,先存放到事務(wù)日志
指令:
start transaction;
2.事務(wù)操作
李四向張三轉(zhuǎn)賬1000鹿蜀,李四賬戶減少1000箕慧,張三賬戶增加1000
(a)李四賬戶減少1000
update my_account set money = money - 1000 where id = 2;
查看數(shù)據(jù)表
select * from my_account
但用其他賬戶登錄,李四賬戶沒有改變
(b)張三賬戶增加1000塊
update my_account set money = money + 1000 where id = 1;
(3)關(guān)閉事務(wù)
選擇性的將日志文件的操作結(jié)果同步到數(shù)據(jù)表茴恰,或者直接清空操作日志(原來的操作全部清空)
(a)提交事務(wù):同步數(shù)據(jù)(操作成功)commit
(b)回滾事務(wù):直接清空日志表(操作失數呓埂)rollback
(4)提交事務(wù)
commit
回滾點(diǎn)
在某個(gè)操作成功完成之后,后續(xù)的操作有可能成功往枣,有可能失敗伐庭,但不管成功,還是失敗分冈,前面的操作都已經(jīng)成功圾另,可以在當(dāng)前成功的位置,設(shè)置一個(gè)點(diǎn)雕沉,可以供后續(xù)失敗操作返回到該位置盯捌,而不是返回所有操作,這個(gè)點(diǎn)就叫做回滾點(diǎn).
- 設(shè)置回滾點(diǎn)語(yǔ)法:
savepoint 回滾點(diǎn)名字
- 回到回滾點(diǎn)語(yǔ)法:
rool back to 回滾點(diǎn)名字
2.2 自動(dòng)事務(wù)
mysql 中默認(rèn)都是自動(dòng)事務(wù)蘑秽,用戶完成操作會(huì)立即同步到數(shù)據(jù)表中
自動(dòng)事務(wù)處理通過 atuocommit 變量控制
show variables like 'atuocommit'
關(guān)閉自動(dòng)提交
set atuocommit= off/0;