21箫踩、MySQL事務(wù)

一、(了解)定義

全稱(Transaction Control Language)翻譯成中文 事務(wù)控制語言,事務(wù)是訪問并可能更新數(shù)據(jù)庫各種數(shù)據(jù)項(xiàng)的一個(gè)程序執(zhí)行單元,

是并發(fā)控制的單元,是用戶定義的一個(gè)操作序列鲜戒。這些操作要么都做,要么都不做抹凳,是一個(gè)不可分割的工作單位遏餐。通過事務(wù),sql 能將邏輯相關(guān)的一組操作綁定在一起赢底,以便服務(wù)器 保持?jǐn)?shù)據(jù)的完整性失都。

二、 (了解)為什么要事務(wù)

設(shè)想網(wǎng)上購物的一次交易幸冻,其付款過程至少包括以下幾步數(shù)據(jù)庫操作:

  1. 更新客戶所購商品的庫存信息
  2. 保存客戶付款信息--可能包括與銀行系統(tǒng)的交互
  3. 生成訂單并且保存到數(shù)據(jù)庫中
  4. 更新用戶相關(guān)信息粹庞,例如購物數(shù)量等等

正常的情況下,這些操作將順利進(jìn)行洽损,最終交易成功庞溜,與交易相關(guān)的所有數(shù)據(jù)庫信息也成功地更新。但是碑定,如果在這一系列過程中任何一個(gè)環(huán)節(jié)出了差錯(cuò)流码,例如在更新商品庫存信息時(shí)發(fā)生異常、該顧客銀行帳戶存款不足等延刘,都將導(dǎo)致交易失敗漫试。一旦交易失敗,數(shù)據(jù)庫中所有信息都必須保持交易前的狀態(tài)不變碘赖,比如最后一步更新用戶信息時(shí)失敗而導(dǎo)致交易失敗驾荣,那么必須保證這筆失敗的交易不影響數(shù)據(jù)庫的狀態(tài)--庫存信息沒有被更新、用戶也沒有付款普泡,訂單也沒有生成播掷。否則,數(shù)據(jù)庫的信息將會(huì)一片混亂而不可預(yù)測(cè)劫哼。

  1. 數(shù)據(jù)庫事務(wù)正是用來保證這種情況下交易的平穩(wěn)性和可預(yù)測(cè)性的技術(shù)

  2. 默認(rèn)情況下會(huì)自動(dòng)提交叮趴,也就是說每個(gè)SQL語句都是在其完成時(shí)提交到數(shù)據(jù)庫割笙。

  3. 事務(wù)只針對(duì)DDL操作

三权烧、(熟練掌握)事務(wù)的特性(ACID)

1、案例

A賬戶向B賬號(hào)匯錢的例子來說明如何通過數(shù)據(jù)庫事務(wù)保證數(shù)據(jù)的準(zhǔn)確性和完整性

1伤溉、從A賬號(hào)中把余額讀出來(500)

2般码、對(duì)A賬號(hào)做減法操作(500-100)

3、把結(jié)果寫回A賬號(hào)中(400)

4乱顾、從B賬號(hào)中把余額讀出來(500

5板祝、對(duì)B賬號(hào)做加法操作(500+100)

6、把結(jié)果寫回B賬號(hào)中(600)

2走净、原子性(Atomicity)

  1. 概念
    事務(wù)是數(shù)據(jù)庫的邏輯工作單位券时,而且是必須是原子工作單位孤里,對(duì)于其數(shù)據(jù)修改,要么全部執(zhí)行橘洞,要么全部不執(zhí)行捌袜。
  2. 說明
    保證1-6所有過程要么都執(zhí)行,要么都不執(zhí)行炸枣。一旦在執(zhí)行某一步驟的過程中發(fā)生問題虏等,就需要執(zhí)行回滾操作。 假如執(zhí)行到第五步的時(shí)候适肠,B賬戶突然不可用(比如被注銷)霍衫,那么之前的所有操作都應(yīng)該回滾到執(zhí)行事務(wù)之前的狀態(tài)

3、一致性(Consistency)

  1. 概念
    指在事務(wù)開始之前和事務(wù)結(jié)束以后侯养,數(shù)據(jù)庫的完整性約束沒有被破壞敦跌。也就是說數(shù)據(jù)庫事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性。
    注: **
    業(yè)務(wù)邏輯上的一致性 由開發(fā)人員進(jìn)行保證逛揩。
    數(shù)據(jù)庫層面 在一個(gè)事務(wù)執(zhí)行之前和之后峰髓,數(shù)據(jù)會(huì)符合你設(shè)置的
    約束唯一約束,外鍵約束,check約束**等)和觸發(fā)器設(shè)置,并且同一個(gè)事務(wù)內(nèi)部的一組操作必須全部執(zhí)行成功(原子操作)
    但是息尺,原子性并不能完全保證一致性携兵。在多個(gè)事務(wù)并行進(jìn)行的情況下,即使保證了每一個(gè)事務(wù)的原子性搂誉,仍然可能導(dǎo)致數(shù)據(jù)不一致的結(jié)果徐紧。為了保證并發(fā)情況下的一致性,引入了隔離性
  2. 說明
    在轉(zhuǎn)賬之前炭懊,A和B的賬戶中共有500+500=1000元錢并级。在轉(zhuǎn)賬之后,A和B的賬戶中共有400+600=1000元侮腹。也就是說嘲碧,數(shù)據(jù)的狀態(tài)在執(zhí)行該事務(wù)操作之后從一個(gè)狀態(tài)改變到了另外一個(gè)狀態(tài)。同時(shí)一致性還能保證賬戶余額不會(huì)變成負(fù)數(shù)等

4父阻、隔離性(Isolation)

  1. 概念
    也稱為獨(dú)立性愈涩,是指并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨(dú)立。一個(gè)事務(wù)處理數(shù)據(jù)加矛,要么是其他事務(wù)執(zhí)行之前的狀態(tài)履婉,要么是其他事務(wù)執(zhí)行之后的狀態(tài),但不能處理其他正在處理的數(shù)據(jù)斟览。
    企業(yè)級(jí)的數(shù)據(jù)庫每一秒鐘都可能應(yīng)付成千上萬的并發(fā)訪問毁腿,因而帶來了并發(fā)控制的問題。
  2. 說明
    在A向B轉(zhuǎn)賬的整個(gè)過程中,只要事務(wù)還沒有提交(commit)已烤,查詢A賬戶和B賬戶的時(shí)候鸠窗,兩個(gè)賬戶里面的錢的數(shù)量都不會(huì)有變化。
    如果在A給B轉(zhuǎn)賬的同時(shí)胯究,有另外一個(gè)事務(wù)執(zhí)行了C給B轉(zhuǎn)賬的操作姨丈,那么當(dāng)兩個(gè)事務(wù)都結(jié)束的時(shí)候枯怖,B賬戶里面的錢應(yīng)該是A轉(zhuǎn)給B的錢加上C轉(zhuǎn)給B的錢再加上自己原有的錢

5扰肌、持久性(Durability)

  1. 概念
    一個(gè)事務(wù)一旦提交柠掂,事物的操作便永久性的保存在DB中。即使此時(shí)再執(zhí)行回滾操作也不能撤消所做的更改
  2. 說明
    一旦轉(zhuǎn)賬成功(事務(wù)提交)费韭,兩個(gè)賬戶的里面的錢就會(huì)真的發(fā)生變化(會(huì)把數(shù)據(jù)寫入數(shù)據(jù)庫做持久化保存)

四茧球、(熟練掌握)基本操作

1、事務(wù)常用的語句

語句
BEGIN或START TRANSACTION 顯式地開啟一個(gè)事務(wù)星持;
COMMIT 也可以使用COMMIT WORK抢埋,不過二者是等價(jià)的。COMMIT會(huì)提交事務(wù)督暂,并使已對(duì)數(shù)據(jù)庫進(jìn)行的所有修改成為永久性的揪垄;
ROLLBACK 有可以使用ROLLBACK WORK,回滾會(huì)結(jié)束用戶的事務(wù)逻翁,并撤銷正在進(jìn)行的所有未提交的修改饥努;
SAVEPOINT identifier SAVEPOINT允許在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),一個(gè)事務(wù)中可以有多個(gè)SAVEPOINT八回;
RELEASE SAVEPOINT identifier 刪除一個(gè)事務(wù)的保存點(diǎn)酷愧,當(dāng)沒有指定的保存點(diǎn)時(shí),執(zhí)行該語句會(huì)拋出一個(gè)異常缠诅;
ROLLBACK TO identifier溶浴; 把事務(wù)回滾到標(biāo)記點(diǎn);
SET TRANSACTION 用來設(shè)置事務(wù)的隔離級(jí)別管引。InnoDB存儲(chǔ)引擎提供事務(wù)的隔離級(jí)別有READ UNCOMMITTED士败、READ COMMITTED、REPEATABLE READ和SERIALIZABLE褥伴。

2谅将、MYSQL 事務(wù)處理主要有兩種方法:

  1. 用 BEGIN, ROLLBACK, COMMIT來實(shí)現(xiàn)
    • BEGIN 開始一個(gè)事務(wù)
    • ROLLBACK 事務(wù)回滾
    • COMMIT事務(wù)提交
  2. 直接用 SET 來改變 MySQL 的自動(dòng)提交模式
    • SET AUTOCOMMIT=0 | off 禁止自動(dòng)提交
    • **SET AUTOCOMMIT=1 | on ** 開啟自動(dòng)提交

3 、案例

  1. 前期準(zhǔn)備工作
    -- 創(chuàng)建銀行賬戶表
    create table account(
        aid int primary key auto_increment comment '主鍵',
        card_no varchar(16) not null unique comment '銀行卡號(hào)',
        name varchar(20) not null comment '姓名',
        money decimal(10,2) default 0.0 comment '金額'
    )
    -- 插入數(shù)據(jù)
    insert into account (card_no,name,money) values
    ('1', '小明', 1000),
    ('2', '嬌嬌', 1000);
    
  2. 第一步 開始事務(wù)
    -- 告訴系統(tǒng)以下所有操作噩翠,不要直接寫入數(shù)據(jù)庫戏自,先存到事務(wù)日志邦投。
    BEGIN
    
  3. 第二步 減少賬戶的余額
    update account set money = money - 1000 where cardno =1
    
  4. 第三步 增加賬戶的余額
    update account set money = money + 1000 where cardno = 2;
    
  5. 第四步 提交事務(wù)
    commit;
    
  6. 第五步 或者回滾
    rollback
    

五伤锚、(掌握)事務(wù)隔離 - 并發(fā)控制

數(shù)據(jù)庫事務(wù)處理相關(guān)命令

操作命令 說明
SHOW CREATE TABLE 表名; 查看存儲(chǔ)引擎
SET AUTOCOMMIT=0或1;或者 SET AUTOCOMMIT=off 或 on 設(shè)置是否自動(dòng)提交
SELECT @@AUTOCOMMIT; 或者 show variables like '%commit%'; 查詢自動(dòng)提交功能狀態(tài)
SELECT @@tx_isolation; 查看事務(wù)隔離級(jí)別
SET tx_isolation='READ-UNCOMMITTED'; 設(shè)置事務(wù)的隔離級(jí)別

1、并發(fā)控制

數(shù)據(jù)庫管理系統(tǒng)(DBMS)中的并發(fā)控制的任務(wù)是確保在多個(gè)事務(wù)同時(shí)存取數(shù)據(jù)庫中同一數(shù)據(jù)時(shí)不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫的統(tǒng)一性

2屯援、不考慮事務(wù)的隔離性猛们,會(huì)出現(xiàn)什么問題?

  1. 臟讀:一個(gè)事務(wù)讀取到另一個(gè)事務(wù)的未提交數(shù)據(jù)
  2. 不可重復(fù)讀:兩次讀取的數(shù)據(jù)不一致(強(qiáng)調(diào)update 針對(duì)單行)
  3. 虛讀(幻讀):兩次讀取的數(shù)據(jù)不一致(強(qiáng)調(diào)insert或delete,范圍查詢)
  4. 丟失更新:撤銷一個(gè)事務(wù)時(shí)狞洋,把其他事務(wù)已提交的更新數(shù)據(jù)覆蓋(事務(wù)A和B并發(fā)執(zhí)行弯淘,A事務(wù)執(zhí)行更新后,提交吉懊;B事務(wù)在A事務(wù)更新后庐橙,B事務(wù)結(jié)束前也做了對(duì)該行數(shù)據(jù)的更新操作,然后回滾借嗽,則兩次更新操作都丟失了)

3态鳖、四種隔離級(jí)別

  1. Read-uncommitted:最低級(jí)別,以上情況均無法保證恶导。(讀未提交)
  2. Read-committed:可避免臟讀情況發(fā)生(讀已提交)
  3. Repeatable-read:可避免臟讀浆竭、不可重復(fù)讀情況的發(fā)生。(可重復(fù)讀)不可以避免虛讀
  4. Serializable:可避免臟讀惨寿、不可重復(fù)讀邦泄、虛讀情況的發(fā)生。(串行裂垦,不僅有read顺囊、write鎖還有range lock范圍鎖(沒有where鎖全表,有where鎖where范圍)蕉拢;對(duì)一張表的所有增刪改操作必須順序執(zhí)行包蓝,性能最差)
    | 隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
    | ---------------- | ---- | ---------- | ---- |
    | Read uncommitted | √ | √ | √ |
    | Read committed | × | √ | √ |
    | Repeatable read | × | × | √ |
    | Serializable | × | × | × |

六、(掌握)隔離級(jí)別詳解

1企量、Read uncommitted

  1. 作用
    所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果
  2. 舉個(gè)栗子
    又到月底了,小明的老婆要準(zhǔn)備給小明發(fā)生活費(fèi)了,小明的老婆給小明打了500塊,但該事務(wù)并沒有提交,而此時(shí)小明正好在查余額,發(fā)現(xiàn)是550塊,高興的差點(diǎn)蹦了起來.天有不測(cè)風(fēng)云,突然小明的老婆發(fā)現(xiàn)多打了50塊,于是回滾事務(wù),修改金額,然后將事務(wù)提交,最后小明空歡喜異常测萎。
  3. 示例圖


    image
  4. 示例代碼
    -- ****打開兩個(gè)窗口 事務(wù)A窗口****
    -- 1.查看事務(wù)隔離級(jí)別
    SELECT @@TX_ISOLATION;
    +------------------+
    | @@tx_isolation   |
    +------------------+
    | READ-UNCOMMITTED |
    +------------------+
    -- 2.設(shè)置事務(wù)的隔離級(jí)別為讀取未提交
    SET tx_isolation='READ-UNCOMMITTED';
    -- 3.查看自動(dòng)提交狀態(tài)
    SELECT @@AUTOCOMMIT;
    -- 4.如果自動(dòng)提交開啟,關(guān)閉自動(dòng)提交
    SET AUTOCOMMIT = 0;
    --  ****在事務(wù)A中執(zhí)行更新語句,且不提交****
    -- 5. 開啟事務(wù)
    START TRANSACTION;
    -- 6.  將賬戶小明的賬號(hào)的錢減100
    UPDATE account SET  money = money - 100 WHERE aid = 1;
    --  不要提交  切換到事務(wù)B的窗口
    -- 7. 事務(wù)回滾
    ROLLBACK
    
    -- 事務(wù)B窗口
    -- 1. 查看事務(wù)的隔離級(jí)別
    SELECT @@TX_ISOLATION;
    -- 2.設(shè)置事務(wù)的隔離級(jí)別
    SET TX_ISOLATION = 'READ-UNCOMMITTED';
    -- 3.查詢小明的賬號(hào)
    SELECT * from  account WHERE aid = 1
    -- ****顯示的信息****
    +-----+---------+--------+--------+
    | aid | card_no | name   | money  |
    +-----+---------+--------+--------+
    |   1 | 1       | 小明   | 700.00 |
    +-----+---------+--------+--------+
    --  4. 將事務(wù)隔離級(jí)別設(shè)置成讀取已提交或者其他
    SET TX_ISOLATION = 'READ-COMMITTED';
    -- 5. 在次查詢發(fā)現(xiàn)賬號(hào)余額是800
    SELECT * from  account WHERE aid = 1;
    -- ****顯示的信息****
    +-----+---------+--------+--------+
    | aid | card_no | name   | money  |
    +-----+---------+--------+--------+
    |   1 | 1       | 小明   | 800.00 |
    +-----+---------+--------+--------+
    -- 切回事務(wù)B 使用回滾 rollback
    

2届巩、Read committed

  1. 作用
    一個(gè)事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變
  2. 舉個(gè)栗子
    某個(gè)夜黑風(fēng)高的夜晚硅瞧,小明豐富的夜生活開始了,小明拿著工資卡去消費(fèi),pos機(jī)讀取卡的信息的時(shí)候有500,
    而此時(shí)小紅也正好在網(wǎng)上轉(zhuǎn)賬恕汇,把小明工資卡的500元轉(zhuǎn)到另一賬戶腕唧,并小明之前提交了事務(wù),當(dāng)小明扣款時(shí)瘾英,
    系統(tǒng)檢查到小明的工資卡已經(jīng)沒有錢枣接,扣款失敗,小明十分納悶缺谴,明明卡里有錢,為什么會(huì)說余額不足,
    出現(xiàn)上述情況但惶,即我們所說的不可重復(fù)讀,兩個(gè)并發(fā)的事務(wù),“事務(wù)1:小明消費(fèi)”膀曾、“事務(wù)2:小紅網(wǎng)上轉(zhuǎn)賬”县爬,事務(wù)1事先讀取了數(shù)據(jù),
    事務(wù)2緊接了更新了數(shù)據(jù)添谊,并提交了事務(wù)财喳,而事務(wù)1再次讀取該數(shù)據(jù)時(shí),數(shù)據(jù)已經(jīng)發(fā)生了改變,
    當(dāng)隔離級(jí)別設(shè)置為Read committed時(shí)斩狱,避免了臟讀耳高,但是可能會(huì)造成不可重復(fù)讀
  3. 示意圖


    image
  4. 備注
    Sql Server ,Oracle的默認(rèn)級(jí)別
    
  5. 示例代碼
    第一步窗口一(事務(wù)1)
    -- 事務(wù)1
    -- 1. 設(shè)置隔離級(jí)別為讀取已提交
    SET TX_ISOLATION = 'READ-COMMITTED';
    -- 2. 查看當(dāng)前連接的事務(wù)級(jí)別
    SELECT @@TX_ISOLATION;
    +----------------+
    | @@TX_ISOLATION |
    +----------------+
    | READ-COMMITTED |
    -- 3. 關(guān)閉自動(dòng)提交
    SET AUTOCOMMIT = 0;
    -- 4. 關(guān)閉自動(dòng)提交
    SELECT @@AUTOCOMMIT;
    -- 5.開啟事務(wù)
    START TRANSACTION;
    -- 6.賬號(hào)余額-100
    UPDATE account
    SET account.money= money - 100
    WHERE aid = 1;
    
    第二步窗口二(事務(wù)2)
    -- 事務(wù)2
    -- 1. 設(shè)置隔離級(jí)別為讀取已提交
    SET TX_ISOLATION = 'READ-COMMITTED';
    -- 2. 查看當(dāng)前連接的事務(wù)級(jí)別
    SELECT @@TX_ISOLATION;
    -- 3. 關(guān)閉自動(dòng)提交
    SET AUTOCOMMIT = 0;
    -- 4. 關(guān)閉自動(dòng)提交
    SELECT @@AUTOCOMMIT;
     -- 5. 事務(wù)1 ******還沒有提交事務(wù)****
     -- 查詢賬戶信息
    BEGIN;
    SELECT  * FROM account WHERE aid = 1
    +-----+---------+--------+---------+
    | aid | card_no | name   | money   |
    +-----+---------+--------+---------+
    |   1 | 1       | 小明   | 1000.00 |
    +-----+---------+--------+---------+
    
    第三步窗口一(事務(wù)1)
    -- 7.提交事務(wù)
    COMMIT
    
    第四步窗口二(事務(wù)2)
    -- 5. 此時(shí)事務(wù)已經(jīng)提交 兩次查詢的結(jié)果不一致
    SELECT  * FROM account WHERE aid = 1
    COMMIT;
    +-----+---------+--------+--------+
    | aid | card_no | name   | money  |
    +-----+---------+--------+--------+
    |   1 | 1       | 小明   | 900.00 |
    +-----+---------+--------+--------+
    -- 相同的select語句,結(jié)果卻不一樣
    

3所踊、Repeatable read

  1. 說明
    當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí)祝高,另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí)
  2. 舉個(gè)栗子
    小紅最近發(fā)現(xiàn)小明總是很晚回家并且經(jīng)常不接電話,于是小紅開始查小明當(dāng)月信用卡的總消費(fèi)金額污筷,
    消費(fèi)金額為50,而小明此時(shí)正好在收銀臺(tái)買單工闺,消費(fèi)1000元,即新增了一條1000元的消費(fèi)記錄,并提交了事務(wù)瓣蛀,
    隨后小紅將小明當(dāng)月信用卡消費(fèi)的明細(xì)打印了出來陆蟆,卻發(fā)現(xiàn)消費(fèi)總額為1050元,小紅很詫異惋增,以為出現(xiàn)了幻覺
  3. 示例圖


    image
  4. 備注
    MySQL的默認(rèn)隔離級(jí)別
  5. 區(qū)別
    • 不可重復(fù)讀的重點(diǎn)是修改比如多次讀取一條記錄發(fā)現(xiàn)其中某些列的值被修改(但mysql由于MVCC機(jī)制并不會(huì)有)叠殷,
    • 幻讀的重點(diǎn)在于新增或者刪除比如多次范圍讀取發(fā)現(xiàn)記錄增多或減少了。
  6. 示例代碼
    1. 第一步窗口一(事務(wù)1)
      -- 事務(wù)1
      -- 1. 查看當(dāng)前連接的事務(wù)級(jí)別
      SELECT @@TX_ISOLATION;
      +----------------+
      | @@TX_ISOLATION |
      +----------------+
      | READ-COMMITTED |
      -- 2. 關(guān)閉自動(dòng)提交
      SET AUTOCOMMIT = 0;
      -- 3. 關(guān)閉自動(dòng)提交
      SELECT @@AUTOCOMMIT;
      -- 4.開啟事務(wù)
      START TRANSACTION;
      -- 5.賬號(hào)余額-100
      UPDATE account SET account.money= money - 100 WHERE aid = 1;
      
      第二步窗口二(事務(wù)2)
      -- 事務(wù)2
      -- 1. 查看當(dāng)前連接的事務(wù)級(jí)別
      SELECT @@TX_ISOLATION;
      -- 2. 關(guān)閉自動(dòng)提交
      SET AUTOCOMMIT = 0;
      -- 3. 關(guān)閉自動(dòng)提交
      SELECT @@AUTOCOMMIT;
       -- 查詢賬戶信息
      BEGIN;
      SELECT  * FROM account WHERE aid = 1
      +-----+---------+--------+---------+
      | aid | card_no | name   | money   |
      +-----+---------+--------+---------+
      |   1 | 1       | 小明   | 1000.00 |
      +-----+---------+--------+---------+
      
      第三步窗口一(事務(wù)1)
      -- 7.提交事務(wù)
      COMMIT
      
      第四步窗口二(事務(wù)2)
      -- 5. 此時(shí)事務(wù)已經(jīng)提交 兩次查詢的結(jié)果不一致
      SELECT  * FROM account WHERE aid = 1
      COMMIT;
      +-----+---------+--------+--------+
      | aid | card_no | name   | money  |
      +-----+---------+--------+--------+
      |   1 | 1       | 小明   | 1000.00 |
      +-----+---------+--------+--------+
      -- 相同的select語句诈皿,結(jié)果一樣
      
    2. 但幻讀還是問題還是有(演示幻讀)
      第一步窗口一(事務(wù)1)
      -- 事務(wù)1
      --  1 開始事務(wù)
      BEGIN;
      -- 2. 查詢
      SELECT *
      FROM account WHERE aid > 1;
      -- 查詢一條記錄
      
      image

      第二步窗口二(事務(wù)2)
      -- 事務(wù)2
      BEGIN;
        INSERT INTO account(CARD_NO, NAME, MONEY) VALUE ('99999', '老王', 0.00);
        INSERT INTO account(CARD_NO, NAME, MONEY) VALUE ('5555', '櫻櫻是誰', 10.00);
      COMMIT
      -- 并且提交
      
      第三步窗口一(事務(wù)1)
      -- 3.批量更新數(shù)據(jù)
      --  MVCC只對(duì)讀有效林束,對(duì)寫操作無效,由于update是寫操作稽亏,
      UPDATE account
      SET money = 0.00
      WHERE aid > 1;
      -- 4. 再次查詢出現(xiàn)幻讀
      SELECT *
      FROM account
      WHERE aid > 1;
      COMMIT;
      
  7. 說明
    從原理上看壶冒,可重復(fù)讀是靠MVCC(多版本并發(fā)控制)保證的,該模式下截歉,保證事務(wù)只能讀取到當(dāng)前事務(wù)開啟之前已經(jīng)提交的事務(wù)進(jìn)行的修改以及當(dāng)前事務(wù)本身對(duì)數(shù)據(jù)的修改

4胖腾、Serializable(串行)(了解)

  1. 說明
    最高級(jí)別:防止上述3種情況,事務(wù)串行執(zhí)行瘪松,慎用
    這是最高的隔離級(jí)別咸作,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突宵睦,從而解決不讀臟记罚,可重復(fù)讀,不可幻讀壳嚎。
    簡(jiǎn)言之桐智,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖末早。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng),并發(fā)性能最差,在分布式事務(wù)中可能會(huì)被用到
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酵使,一起剝皮案震驚了整個(gè)濱河市荐吉,隨后出現(xiàn)的幾起案子焙糟,更是在濱河造成了極大的恐慌口渔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穿撮,死亡現(xiàn)場(chǎng)離奇詭異缺脉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悦穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門攻礼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栗柒,你說我怎么就攤上這事礁扮。” “怎么了瞬沦?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵太伊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我逛钻,道長(zhǎng)僚焦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任曙痘,我火速辦了婚禮芳悲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘边坤。我一直安慰自己名扛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布茧痒。 她就那樣靜靜地躺著罢洲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪文黎。 梳的紋絲不亂的頭發(fā)上惹苗,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音耸峭,去河邊找鬼桩蓉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛劳闹,可吹牛的內(nèi)容都是我干的院究。 我是一名探鬼主播洽瞬,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼业汰!你這毒婦竟也來了伙窃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤样漆,失蹤者是張志新(化名)和其女友劉穎为障,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體放祟,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳍怨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跪妥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞋喇。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖眉撵,靈堂內(nèi)的尸體忽然破棺而出侦香,到底是詐尸還是另有隱情,我是刑警寧澤纽疟,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布罐韩,位于F島的核電站,受9級(jí)特大地震影響仰挣,放射性物質(zhì)發(fā)生泄漏伴逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一膘壶、第九天 我趴在偏房一處隱蔽的房頂上張望错蝴。 院中可真熱鬧,春花似錦颓芭、人聲如沸顷锰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽官紫。三九已至,卻和暖如春州藕,著一層夾襖步出監(jiān)牢的瞬間束世,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工床玻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毁涉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓锈死,卻偏偏與公主長(zhǎng)得像贫堰,于是被迫代替她去往敵國(guó)和親穆壕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350