MySQL基礎(chǔ)入門教程之事務(wù)
引言
事務(wù)是一組操作的集合,它是一個(gè)不可分割的工作單位,事務(wù)會(huì)把所有的操作作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請求,即這些操作要么同時(shí)成功,要么同時(shí)失敗。
就比如: 張三給李四轉(zhuǎn)賬1000塊錢,張三銀行賬戶的錢減少1000,而李四銀行賬戶的錢要增加1000。
這一組操作就必須在一個(gè)事務(wù)的范圍內(nèi),要么都成功,要么都失敗。

正常情況: 轉(zhuǎn)賬這個(gè)操作, 需要分為以下這么三步來完成 , 三步完成之后, 張三減少1000, 而李四 增加1000, 轉(zhuǎn)賬成功 :

異常情況: 轉(zhuǎn)賬這個(gè)操作, 也是分為以下這么三步來完成 , 在執(zhí)行第三步是報(bào)錯(cuò)了, 這樣就導(dǎo)致張三減少1000塊錢, 而李四的金額沒變, 這樣就造成了數(shù)據(jù)的不一致, 就出現(xiàn)問題了。

為了解決上述的問題,就需要通過數(shù)據(jù)的事務(wù)來完成,我們只需要在業(yè)務(wù)邏輯執(zhí)行之前開啟事務(wù),執(zhí)行完畢后提交事務(wù)。如果執(zhí)行過程中報(bào)錯(cuò),則回滾事務(wù),把數(shù)據(jù)恢復(fù)到事務(wù)開始之前的狀態(tài)。

注意: 默認(rèn)MySQL的事務(wù)是自動(dòng)提交的,也就是說,當(dāng)執(zhí)行完一條DML語句時(shí),MySQL會(huì)立即隱式的提交事務(wù)
1、事務(wù)操作
數(shù)據(jù)庫腳本:
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 '賬戶表';
insert into account(name, money)
VALUES ('張三', 2000),
('李四', 2000);1.1 未控制事務(wù)
1、測試正常情況
-- 1. 查詢張三余額 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 = '李四';
測試完畢之后檢查數(shù)據(jù)的狀態(tài), 可以看到數(shù)據(jù)操作前后是一致的

2、 測試異常情況
-- 1. 查詢張三余額 select * from account where name = '張三'; -- 2. 張三的余額減少1000 update account set money = money - 1000 where name = '張三'; 出錯(cuò)了.... -- 3. 李四的余額增加1000 update account set money = money + 1000 where name = '李四'
我們把數(shù)據(jù)都恢復(fù)到2000, 然后再次一次性執(zhí)行上述的SQL語句(出錯(cuò)了.... 這句話不符合SQL語法,執(zhí)行就會(huì)報(bào)錯(cuò)),檢查最終的數(shù)據(jù)情況, 發(fā)現(xiàn)數(shù)據(jù)在操作前后不一致了

1.2 控制事務(wù)一
1、查看/設(shè)置事務(wù)提交方式
SELECT @@autocommit ; SET @@autocommit = 0 ;
2、 提交事務(wù)
COMMIT;
3、回滾事務(wù)
ROLLBACK;
注意:
上述的這種方式,我們是修改了事務(wù)的自動(dòng)提交行為, 把默認(rèn)的自動(dòng)提交修改為了手動(dòng)提交, 此時(shí)我們執(zhí)行的DML語句都不會(huì)提交, 需要手動(dòng)的執(zhí)行commit進(jìn)行提交。
1.3 控制事務(wù)二
1、開啟事務(wù)
START TRANSACTION 或 BEGIN ;
2、提交事務(wù)
COMMIT;
3、回滾事務(wù)
ROLLBACK;
轉(zhuǎn)賬案例:
-- 開啟事務(wù) start transaction -- 1. 查詢張三余額 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í)行過程中報(bào)錯(cuò), 則回滾事務(wù) -- rollback;
2、事務(wù)的四大特性
原子性(Atomicity):事務(wù)是不可分割的最小操作單元,要么全部成功,要么全部失敗。
一致性(Consistency):事務(wù)完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。
隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的獨(dú)立環(huán)境下運(yùn)行。
持久性(Durability):事務(wù)一旦提交或回滾,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久的。
上述就是事務(wù)的四大特性,簡稱ACID。
3、并發(fā)事務(wù)問題
1、贓讀:一個(gè)事務(wù)讀到另外一個(gè)事務(wù)還沒有提交的數(shù)據(jù)。

2、不可重復(fù)讀:一個(gè)事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱之為不可重復(fù)讀。

3、幻讀:一個(gè)事務(wù)按照條件查詢數(shù)據(jù)時(shí),沒有對應(yīng)的數(shù)據(jù)行,但是在插入數(shù)據(jù)時(shí),又發(fā)現(xiàn)這行數(shù)據(jù)已經(jīng)存在,好像出現(xiàn)了 "幻影“。

4、事務(wù)隔離級別
為了解決并發(fā)事務(wù)所引發(fā)的問題,在數(shù)據(jù)庫中引入了事務(wù)隔離級別。主要有以下幾種:

1、查看事務(wù)隔離級別
SELECT @@TRANSACTION_ISOLATION; 1
2、設(shè)置事務(wù)隔離級別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }注意:事務(wù)隔離級別越高,數(shù)據(jù)越安全,但是性能越低
總結(jié)
到此這篇關(guān)于MySQL基礎(chǔ)入門教程之事務(wù)的文章就介紹到這了,更多相關(guān)MySQL基礎(chǔ)事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在講MySQL的Join語法前還是先回顧一下聯(lián)結(jié)的語法,呵呵,其實(shí)連我自己都忘得差不多了,那就大家一起溫習(xí)吧,這里我有個(gè)比較簡便的記憶方法,內(nèi)外聯(lián)結(jié)的區(qū)別是內(nèi)聯(lián)結(jié)將去除所有不符合條件的記錄,而外聯(lián)結(jié)則保留其中部分。外左聯(lián)結(jié)與外右聯(lián)結(jié)的區(qū)別在于如果用A左聯(lián)結(jié)B則A中所有記錄都會(huì)保留在結(jié)果中,此時(shí)B中只有符合聯(lián)結(jié)條件的記錄,而右聯(lián)結(jié)相反,這樣也就不會(huì)混淆了。2014-05-05
在同一臺(tái)機(jī)器上運(yùn)行多個(gè) MySQL 服務(wù)
在同一臺(tái)機(jī)器上運(yùn)行多個(gè) MySQL 服務(wù)...2006-11-11
MYSQL中有關(guān)SUM字段按條件統(tǒng)計(jì)使用IF函數(shù)(case)問題
MYSQL中SUM字段按條件統(tǒng)計(jì)使用IF函數(shù),具體實(shí)現(xiàn)代碼如下,感興趣的朋友不要錯(cuò)過2014-01-01
Mysql實(shí)現(xiàn)模糊查詢的兩種方式(like子句?、正則表達(dá)式)
通配符是一種特殊語句,主要用來模糊查詢,下面這篇文章主要給大家介紹了關(guān)于給Mysql實(shí)現(xiàn)模糊查詢的兩種方式,分別是like子句?、正則表達(dá)式,需要的朋友可以參考下2022-09-09

