MySQL基礎(chǔ)入門教程之事務(wù)
引言
事務(wù)是一組操作的集合,它是一個(gè)不可分割的工作單位,事務(wù)會(huì)把所有的操作作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐ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ù)庫(kù)腳本:
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、測(cè)試正常情況
-- 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 = '李四';
測(cè)試完畢之后檢查數(shù)據(jù)的狀態(tài), 可以看到數(shù)據(jù)操作前后是一致的
2、 測(cè)試異常情況
-- 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ù)庫(kù)系統(tǒng)提供的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的獨(dú)立環(huán)境下運(yùn)行。
持久性(Durability):事務(wù)一旦提交或回滾,它對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久的。
上述就是事務(wù)的四大特性,簡(jiǎn)稱ACID。
3、并發(fā)事務(wù)問題
1、贓讀:一個(gè)事務(wù)讀到另外一個(gè)事務(wù)還沒有提交的數(shù)據(jù)。
2、不可重復(fù)讀:一個(gè)事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱之為不可重復(fù)讀。
3、幻讀:一個(gè)事務(wù)按照條件查詢數(shù)據(jù)時(shí),沒有對(duì)應(yīng)的數(shù)據(jù)行,但是在插入數(shù)據(jù)時(shí),又發(fā)現(xiàn)這行數(shù)據(jù)已經(jīng)存在,好像出現(xiàn)了 "幻影“。
4、事務(wù)隔離級(jí)別
為了解決并發(fā)事務(wù)所引發(fā)的問題,在數(shù)據(jù)庫(kù)中引入了事務(wù)隔離級(jí)別。主要有以下幾種:
1、查看事務(wù)隔離級(jí)別
SELECT @@TRANSACTION_ISOLATION; 1
2、設(shè)置事務(wù)隔離級(jí)別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
注意:事務(wù)隔離級(jí)別越高,數(shù)據(jù)越安全,但是性能越低
總結(jié)
到此這篇關(guān)于MySQL基礎(chǔ)入門教程之事務(wù)的文章就介紹到這了,更多相關(guān)MySQL基礎(chǔ)事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過mysqladmin遠(yuǎn)程管理mysql的方法
在一些特殊場(chǎng)景下,想要遠(yuǎn)程重啟mysql,以便讓某些修改能及時(shí)的生效,但是mysql并沒有提供遠(yuǎn)程重啟的功能,唯一能做的就是遠(yuǎn)程關(guān)閉mysql服務(wù)2013-03-03阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程
這篇文章主要介紹了阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程,需要的朋友可以參考下2017-06-06Mysql查詢數(shù)據(jù)庫(kù)連接狀態(tài)以及連接信息詳解
這篇文章主要給大家介紹了關(guān)于Mysql查詢數(shù)據(jù)庫(kù)連接狀態(tài)以及連接信息的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04MySQL數(shù)據(jù)類型之淺談字符串(string)
這篇文章主要介紹了MySQL數(shù)據(jù)類型之字符串(string)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10mysql如何將表結(jié)構(gòu)導(dǎo)出到excel
這篇文章主要介紹了mysql如何將表結(jié)構(gòu)導(dǎo)出到excel,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09MySQL命令行導(dǎo)出導(dǎo)入數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了MySQL命令行導(dǎo)出導(dǎo)入數(shù)據(jù)庫(kù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10