MySQL數(shù)據(jù)庫(kù)之事務(wù)簡(jiǎn)析
事務(wù)簡(jiǎn)介
事務(wù)是一組操作的集合,它是一個(gè)不可分割的工作單位,事務(wù)會(huì)把所有的操作作為一個(gè)整體一起向系統(tǒng)提交或撤銷(xiāo)操作請(qǐng)求,即這些操作要么同時(shí)成功,要么同時(shí)失敗。
例如一個(gè)銀行轉(zhuǎn)賬操作,張三向李四轉(zhuǎn)1000塊錢(qián),那么第一步要判斷張三是否有1000塊,如果沒(méi)有,那么事務(wù)就會(huì)拋出異常,直接結(jié)束,后面的收款等一系列操作也宣告失敗。
操作實(shí)例
我們先創(chuàng)建一個(gè)表格,里面有人物和金額:
create table account(
-> id int auto_increment primary key comment '主鍵ID',
-> name varchar(10) comment '姓名',
-> money int comment '余額'
-> ) comment '賬戶表';之后插入數(shù)據(jù):
insert into account(id, name, money) VALUES (null, '張三', 2000),(null, '李四', 2000);

回憶上面的轉(zhuǎn)賬操作,先查詢張三的余額
select * from account where name ='張三';
之后將張三的錢(qián)轉(zhuǎn)給李四,注意這是兩個(gè)操作
update account set money = money - 1000 where name = '張三'; update account set money = money + 1000 where name = '李四';
執(zhí)行完上述語(yǔ)句后發(fā)現(xiàn),沒(méi)有問(wèn)題,李四的錢(qián)自然變成3000,張三為1000。那么,我們?nèi)绻斎肓艘粋€(gè)錯(cuò)誤語(yǔ)句,但上面兩條轉(zhuǎn)錢(qián)的操作正確,我們知道程序會(huì)報(bào)錯(cuò)。但是,我們希望錢(qián)并沒(méi)有被轉(zhuǎn)走,而是終止這件事務(wù),但MySQL或依然執(zhí)行正確的語(yǔ)句,錢(qián)依然會(huì)被轉(zhuǎn)走。
解決方法一、修改提交方式
MySQL自定義的提交方式就是自動(dòng)提交(autocommit),我們只需要把自動(dòng)提交修改為手動(dòng)提交,即語(yǔ)法:set @@autocommit = 0;
同理,由于我們的提交方式改為手動(dòng)提交,輸入正確的語(yǔ)句會(huì)被執(zhí)行,但不會(huì)提交到數(shù)據(jù)庫(kù)
這時(shí)我們需要加上語(yǔ)句:commit。我們發(fā)現(xiàn)這樣還是不能保證出錯(cuò)時(shí)數(shù)據(jù)不變啊,這時(shí)我還需要另一個(gè)利器:
事務(wù)回滾roolback。執(zhí)行roolback語(yǔ)句程序就會(huì)只報(bào)錯(cuò)而不提交,保證了數(shù)據(jù)安全。
解決方法二、不改變提交方式,利用事務(wù)指令
記得將提交方式改為自動(dòng)提交。首先,執(zhí)行一個(gè)事務(wù)首先要開(kāi)啟,事務(wù)的開(kāi)啟指令為:
start transaction;/begin;
之后,如果錯(cuò)誤的語(yǔ)句報(bào)錯(cuò)正確的語(yǔ)句也不會(huì)提交到數(shù)據(jù)庫(kù)修改數(shù)據(jù)。
事務(wù)的四大特性
- 原子性((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)題

事務(wù)隔離級(jí)別
事務(wù)的隔離級(jí)別就是解決上面的事務(wù)并發(fā)問(wèn)題的。

從上到下,隔離級(jí)別是越來(lái)越高的,但是數(shù)據(jù)庫(kù)的性能是越來(lái)越低的。
下面給出級(jí)別查詢的語(yǔ)句:
查詢事務(wù)隔離級(jí)別:
SELECT @@TRANSACTION_ISOLATION;
設(shè)置事務(wù)隔離級(jí)別:
SET[SESSION|/GLOBAL]TRANSACTION I5SOLATION LEVEL{READUNCOMMITED |READCOMMITED|REPEATABLEREAD |SERALZABLE}到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)之事務(wù)簡(jiǎn)析的文章就介紹到這了,更多相關(guān)MySQL事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql在update,非主鍵索引更新引起死鎖問(wèn)題
這篇文章主要介紹了mysql在update,非主鍵索引更新引起死鎖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
解決mysql的賦權(quán)操作之GRANT ALL PRIVILEGES ON *.*
這篇文章主要介紹了解決mysql的賦權(quán)操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION問(wèn)題,本文給大家分享兩種情況分析分享解決方案,感興趣的朋友一起看看吧2022-11-11
Mysql LONGBLOB 類(lèi)型存儲(chǔ)二進(jìn)制數(shù)據(jù) (修改+調(diào)試+整理)
代碼來(lái)自網(wǎng)絡(luò),我學(xué)習(xí)整理了一下,測(cè)試通過(guò),下面的參數(shù)需要設(shè)置為你自己的2009-07-07
SQL實(shí)現(xiàn)LeetCode(180.連續(xù)的數(shù)字)
這篇文章主要介紹了SQL實(shí)現(xiàn)LeetCode(180.連續(xù)的數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
MySQL?從0到1打開(kāi)數(shù)據(jù)庫(kù)管理操作方法
數(shù)據(jù)庫(kù)管理系統(tǒng)(DataBase?Management?System)是用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)和管理數(shù)據(jù)庫(kù)數(shù)據(jù)的一個(gè)管理軟件,我們口頭說(shuō)的MySQL數(shù)據(jù)庫(kù)就是這個(gè)管理系統(tǒng),這篇文章主要介紹了MySQL從0到1打開(kāi)數(shù)據(jù)庫(kù)管理,需要的朋友可以參考下2023-06-06
MySQL數(shù)據(jù)庫(kù)統(tǒng)計(jì)函數(shù)COUNT的使用及說(shuō)明
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)統(tǒng)計(jì)函數(shù)COUNT的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Windows下mysql 8.0.12 安裝詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Windows下mysql 8.0.12 安裝詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
設(shè)置MySQL中的數(shù)據(jù)類(lèi)型來(lái)優(yōu)化運(yùn)行速度的實(shí)例
這篇文章主要介紹了設(shè)置MySQL中索引的數(shù)據(jù)類(lèi)型來(lái)優(yōu)化運(yùn)行速度的實(shí)例,主要是適當(dāng)使用短字節(jié)的數(shù)據(jù)類(lèi)型來(lái)處理短索引,需要的朋友可以參考下2015-05-05

