一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Mysql基礎篇(四)之事務

 云哥技術yun3k 2023-07-03 發(fā)布于江蘇

一. 事務簡介

事務是一組操作的集合,它是一個不可分隔的工作單位,事務會把所有的操作作為一個整體一起向系統(tǒng)提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

就比如:張三給李四轉賬1000塊錢,張三銀行賬戶的錢減少了1000,而李四銀行賬戶的錢要增加1000。這一組操作就必須在一個事務的范圍內,要么都成功,要么都失敗。

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

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

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

注:默認MySQL的事務時自動提交的,也就是說,當執(zhí)行完一條DML語句時,MySQL會立即隱式的提交事務。

二. 事務操作

數(shù)據(jù)準備:

1drop table if exists account;
2
3create table account
4    id int primary key AUTO_INCREMENT comment 'ID'
5    name varchar(10comment '姓名'
6    money double(10,2comment '余額' 
7comment '賬戶表';
8
9insert into account(name, money) VALUES ('張三',2000), ('李四',2000);

1. 未控制事務

(1). 測試正常情況

1-- 1. 查詢張三余額 
2select * from account where name = '張三'
3
4-- 2. 張三的余額減少1000 
5update account set money = money - 1000 where name = '張三'
6
7-- 3. 李四的余額增加1000 
8update account set money = money + 1000 where name = '李四';

測試完畢之后檢查數(shù)據(jù)的狀態(tài),可以看出數(shù)據(jù)操作前后是一致的。

(2). 測試異常情況

1-- 1. 查詢張三余額 
2select * from account where name = '張三'
3
4-- 2. 張三的余額減少1000 
5update account set money = money - 1000 where name = '張三'
6出錯了.... 
7
8-- 3. 李四的余額增加1000 
9update account set money = money + 1000 where name = '李四';

我們把數(shù)據(jù)都恢復到2000,然后再次一次性執(zhí)行上述的SQL語句(出錯了… 這句話不符合SQL語法,執(zhí)行就會報錯),檢查最終的數(shù)據(jù)情況,發(fā)現(xiàn)數(shù)據(jù)在操作前后不一致了。

2. 控制事務一

(1). 查看/設置事務提交方式

1SELECT @@autocommit;
2
3SET @@autocommit = 0;

(2). 提交事務

1COMMIT;

(3). 回滾事務

1ROLLBACK;

注:上述的這種方式,我們是修改了事務的自動提交行為,把默認的自動提交修改為了手動提交,此時我們執(zhí)行的DML語句都不會提交,需要手動的執(zhí)行commit進行提交。

3. 控制事務二

(1).開啟事務

1START TRANSACTION 或 BEGIN ;

(2).提交事務

1COMMIT;

(3).回滾事務

1ROLLBACK;

轉賬案例:

 1-- 開啟事務 
2start transaction;
3
4-- 1. 查詢張三余額 
5select * from account where name = '張三'
6
7-- 2. 張三的余額減少1000 
8update account set money = money - 1000 where name = '張三'
9
10-- 3. 李四的余額增加1000 
11update account set money = money + 1000 where name = '李四'
12
13-- 如果正常執(zhí)行完畢, 則提交事務 
14commit
15
16-- 如果執(zhí)行過程中報錯, 則回滾事務 
17-- rollback;

三. 事務四大特性

  • 原子性(Atomicity):事務是不可分隔的最小操作單元,要么全部成功,要么全部失敗。

  • 一致性(Consistency):事務完成時,必須使所有的數(shù)據(jù)都保持一致。

  • 隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供的隔離機制,保證事務在不受外部并發(fā)操作影響的獨立環(huán)境下運行。

  • 持久性(Durability):事務一旦提交或回滾,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久的。

上述就是事務的四大特性,簡稱ACID。

四. 并發(fā)事務問題

1. 臟讀:一個事務讀到另一個事務還沒有提交的數(shù)據(jù)

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

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

五. 事務隔離級別

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

隔離級別臟讀(是否解決)不可重復讀(是否解決)幻讀(是否解決)
讀未提交(Read uncommitted)未解決未解決未解決
讀已提交(Read committed)解決未解決未解決
可重復讀(Repeatable Read)(默認)解決解決未解決
串行化(Serializable)解決解決解決

1. 查詢事務隔離級別

1SELECT @@TRANSACTION_ISOLATION;

2. 設置事務隔離級別

1SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL 
2READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

SESSION:session表示當前窗口的隔離級別。

GLOBAL:global表示全局的隔離級別

注:事務隔離級別越高,數(shù)據(jù)越安全,但是性能越低。

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    五月情婷婷综合激情综合狠狠| 黄色三级日本在线观看| 日本加勒比不卡二三四区| 久久精品久久精品中文字幕| 亚洲精选91福利在线观看| 日本少妇三级三级三级| 亚洲国产精品国自产拍社区| 国产又粗又黄又爽又硬的| 国产自拍欧美日韩在线观看| 中文字幕精品一区二区三| 中文字幕佐山爱一区二区免费| 97人妻精品一区二区三区男同 | 亚洲国产成人av毛片国产| 国产99久久精品果冻传媒| 一区二区三区精品人妻| 欧美人与动牲交a精品| 久久人人爽人人爽大片av| 极品熟女一区二区三区| 91欧美亚洲视频在线| 久久精品国产99精品亚洲| 亚洲品质一区二区三区| 夫妻性生活一级黄色录像| 国产熟女一区二区精品视频| 精品人妻一区二区三区免费| 欧美一级内射一色桃子| 免费在线观看欧美喷水黄片| 亚洲一区二区三区一区| 日本高清不卡在线一区| 日韩欧美国产高清在线| 91亚洲精品综合久久| 欧美日韩免费黄片观看| 千仞雪下面好爽好紧好湿全文| 丰满少妇被猛烈撞击在线视频| 美女黄色三级深夜福利| 国产一区二区熟女精品免费| 亚洲欧美日本国产有色| 日韩国产传媒在线精品| 中文字幕在线五月婷婷| 在线欧美精品二区三区| 日韩一区二区三区久久| 欧美黑人在线精品极品|