日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

1、MySQL为什么需要事务?

發(fā)布時(shí)間:2025/3/20 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1、MySQL为什么需要事务? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在銀行業(yè)務(wù)中,有一條記賬原則,即有借有貸,借貸相等。為了保證這種原則,每發(fā)生一筆銀行業(yè)務(wù),就必須確保會(huì)計(jì)賬目上借方科目和貸方科目至少各記一筆,并且這兩筆賬要么同時(shí)成功,要么同時(shí)失敗。如果出現(xiàn)只記錄了借方科目,或者只記錄了貸方科目的情況,就違反了記賬原則。會(huì)出現(xiàn)記錯(cuò)賬的情況。

在銀行的日常業(yè)務(wù)中,只要是同一銀行(如都是中國農(nóng)業(yè)銀行,簡稱農(nóng)行),一般都支持賬戶間的直接轉(zhuǎn)賬。因此,銀行轉(zhuǎn)賬操作往往會(huì)涉及兩個(gè)或兩個(gè)以上的賬戶。在轉(zhuǎn)出賬戶的存款減少一定金額的同時(shí),轉(zhuǎn)入賬戶的存款就要增加相應(yīng)的金額。

下面,在 MySQL 數(shù)據(jù)庫中模擬一下上述提及的轉(zhuǎn)賬問題。

假如要從張三的賬戶直接轉(zhuǎn)賬 500 元到李四的賬戶。首先需要?jiǎng)?chuàng)建賬戶表,存放用戶張三和李四的賬戶信息。創(chuàng)建賬戶表和插入數(shù)據(jù)的 SQL 語句和運(yùn)行結(jié)果如下所示:

mysql> CREATE DATABASE mybank; mysql> USE mybank; mysql> CREATE TABLE bank(-> customerName VARCHAR(20), #用戶名-> currentMoney DECIMAL(10,2) #當(dāng)前余額-> )ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> INSERT INTO bank (customerName,currentMoney) VALUES('張三',1000); mysql> INSERT INTO bank (customerName,currentMoney) VALUES('李四',1);

查詢 bank 數(shù)據(jù)表的 SQL 語句和運(yùn)行結(jié)果如下:

mysql> SELECT * FROM bank; +--------------+--------------+ | customerName | currentMoney | +--------------+--------------+ | 張三 | 1000.00 | | 李四 | 1.00 | +--------------+--------------+

結(jié)果顯示,張三和李四兩個(gè)賬戶的余額總和為 1000+1=1001 元。

下面開始模擬實(shí)現(xiàn)轉(zhuǎn)賬功能。從張三的賬戶直接轉(zhuǎn)賬 500 元到李四的賬戶,可以使用 UPDATE 語句分別修改張三的賬戶和李四的賬戶。張三的賬戶減少 500 元,李四的賬戶增加 500 元, SQL 語句如下所示:

/*轉(zhuǎn)賬測試:張三轉(zhuǎn)賬給李四 500 元*/ #張三的賬戶少 500 元,李四的賬戶多 500 元 UPDATE bank SET currentMoney = currentMoney-500 WHERE customerName = '張三'; UPDATE bank SET currentMoney = currentMoney+500 WHERE customerName = '李四';

正常情況下,執(zhí)行以上的轉(zhuǎn)賬操作后,余額總和應(yīng)保持不變,仍為 1001 元。但是,如果在這個(gè)過程的其中一個(gè)環(huán)節(jié)出現(xiàn)差錯(cuò),如在張三的賬戶減少 500 元之后,這時(shí)發(fā)生了服務(wù)器故障,李四的賬戶沒有立即增加 500 元,此時(shí),第三方讀取到兩個(gè)賬戶的余額總和變?yōu)?500+1=501 元,即賬戶總額間少了 500 元。

MySQL 為了解決此類問題,提供了事務(wù)。事務(wù)可以將一系列的數(shù)據(jù)操作捆綁成一個(gè)整體進(jìn)行統(tǒng)一管理,如果某一事務(wù)執(zhí)行成功,則在該事務(wù)中進(jìn)行的所有數(shù)據(jù)更改均會(huì)提交,成為數(shù)據(jù)庫中的永久組成部分

如果事務(wù)執(zhí)行時(shí)遇到錯(cuò)誤,則就必須取消或回滾。取消或回滾后,數(shù)據(jù)將全部恢復(fù)到操作前的狀態(tài),所有數(shù)據(jù)的更改均被清除。

MySQL 通過事務(wù)保證了數(shù)據(jù)的一致性。上述提到的轉(zhuǎn)賬過程就是一個(gè)事務(wù),它需要兩條 UPDATE 語句來完成。這兩條語句是一個(gè)整體,如果其中任何一個(gè)環(huán)節(jié)出現(xiàn)問題,則整個(gè)轉(zhuǎn)賬業(yè)務(wù)也應(yīng)取消,兩個(gè)賬戶中的余額應(yīng)恢復(fù)為原來的數(shù)據(jù),從而確保轉(zhuǎn)賬前和轉(zhuǎn)賬后的余額總和不變,即都是 1001 元。

總結(jié)

以上是生活随笔為你收集整理的1、MySQL为什么需要事务?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。