花店網(wǎng)站建設(shè)畢設(shè)介紹百度快速查詢(xún)
概述
事務(wù) 是一組操作的集合,它是一個(gè)不可分割的工作單位,事務(wù)會(huì)把所有的操作作為一個(gè)整體一起向系統(tǒng)提交或撤銷(xiāo)操作請(qǐng)求,即這些操作要么同時(shí)成功,要么同時(shí)失敗。
注意: 默認(rèn)MySQL的事務(wù)是自動(dòng)提交的,也就是說(shuō),當(dāng)執(zhí)行完一條DML語(yǔ)句時(shí),MySQL會(huì)立即隱式的提交事務(wù)。
控制事務(wù)一
查看/設(shè)置事務(wù)提交方式
SELECT @@autocommit ;
SET @@autocommit = 0 ;# 1:自動(dòng) 0:手動(dòng)
提交事務(wù)
COMMIT;
回滾事務(wù)
ROLLBACK;
注意:上述的這種方式,我們是修改了事務(wù)的自動(dòng)提交行為, 把默認(rèn)的自動(dòng)提交修改為了手動(dòng)提交, 此時(shí)我們執(zhí)行的DML語(yǔ)句都不會(huì)提交, 需要手動(dòng)的執(zhí)行commit進(jìn)行提交。
控制事務(wù)二
開(kāi)啟事務(wù)
START TRANSACTION 或 BEGIN ;
提交事務(wù)
COMMIT;
回滾事務(wù)
ROLLBACK;
轉(zhuǎn)賬案例
drop table if exists account;
create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余額'
) comment '賬戶(hù)表';
insert into account(name, money) VALUES ('張三',2000), ('李四',2000);-- 開(kāi)啟事務(wù)
start transaction
-- 1. 查詢(xún)張三余額
select * from account where name = '張三';
-- 2. 張三的余額減少1000
update account set money = money - 1000 where name = '張三';
-- 3. 李四的余額增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常執(zhí)行完畢, 則提交事務(wù)
commit;
-- 如果執(zhí)行過(guò)程中報(bào)錯(cuò), 則回滾事務(wù)
rollback;
事務(wù)四大特性(ACID)
- 原子性(Atomicity):事務(wù)是不可分割的最小操作單元,要么全部成功,要么全部失敗。
- 一致性(Consistency):事務(wù)完成時(shí),必須使所有的數(shù)據(jù)都保持一致?tīng)顟B(tài)。
- 隔離性(Isolation):數(shù)據(jù)庫(kù)系統(tǒng)提供的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的獨(dú)立環(huán)境下運(yùn)行。
- 持久性(Durability):事務(wù)一旦提交或回滾,它對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久的。
并發(fā)事務(wù)問(wèn)題
臟讀
一個(gè)事務(wù)讀到另外一個(gè)事務(wù)還沒(méi)有提交的數(shù)據(jù)
比如事務(wù)B讀取到了事務(wù)A未提交的數(shù)據(jù)
不可重復(fù)讀
一個(gè)事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱(chēng)之為不可重復(fù)讀
事務(wù)A兩次讀取同一條記錄,但是讀取到的數(shù)據(jù)卻是不一樣的
幻讀
一個(gè)事務(wù)按照條件查詢(xún)數(shù)據(jù)時(shí),沒(méi)有對(duì)應(yīng)的數(shù)據(jù)行,但是在插入數(shù)據(jù)時(shí),又發(fā)現(xiàn)這行數(shù)據(jù)已經(jīng)存在,好像出現(xiàn)了 “幻影”
事務(wù)隔離級(jí)別
為了解決并發(fā)事務(wù)所引發(fā)的問(wèn)題,在數(shù)據(jù)庫(kù)中引入了事務(wù)隔離級(jí)別。主要有以下幾種:
查看事務(wù)隔離級(jí)別
SELECT @@TRANSACTION_ISOLATION;
設(shè)置事務(wù)隔離級(jí)別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
注意:事務(wù)隔離級(jí)別越高,數(shù)據(jù)越安全,但是性能越低。