日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

InnoDB 事務(wù)

作者:Cloaks 更新時間: 2022-08-19 編程語言

文章目錄

  • 概述
  • 隔離級別
  • 實(shí)現(xiàn)
    • redo log
      • 案例
      • undo log

概述

隔離級別

實(shí)現(xiàn)

redo log

redo log 叫做重做日志,是用來實(shí)現(xiàn)事務(wù)的持久性。
該日志有兩部分組成:重做日志緩沖(redo log buffer)和重做日志文件(redo log)。
前者在內(nèi)存中,后者在磁盤中。當(dāng)事務(wù)提交之后會把所有修改信息存到該日志中,用于在刷新臟頁到磁盤時,或者發(fā)生錯誤時,進(jìn)行數(shù)據(jù)恢復(fù)使用。

案例

在銀行轉(zhuǎn)賬操作中使用事務(wù),從銀行賬戶表中轉(zhuǎn)出2000元到理財賬戶表中。

數(shù)據(jù)準(zhǔn)備

select version();
8.0.30

create database if not exists db_test default character set utf8mb4 collate utf8mb4_0900_ai_ci;

use db_test;

create table if not exists tb_bank
(
    id      int primary key auto_increment,
    name    varchar(20) not null comment '賬戶名稱',
    balance int         not null comment '賬單資金'
) engine = innodb
  default charset = utf8mb4
  collate = utf8mb4_0900_ai_ci
    comment '銀行賬戶表';

create table if not exists tb_finance
(
    id      int primary key auto_increment,
    name    varchar(20) not null comment '賬戶名稱',
    account int         not null comment '賬單資金'
) engine = innodb
  default charset = utf8mb4
  collate = utf8mb4_0900_ai_ci
    comment '理財賬戶表';

insert into tb_bank
values (null, 'Tom', 10000);
insert into tb_finance
values (null, 'Tom', 0);

數(shù)據(jù)驗(yàn)證

select * from tb_bank;
1,Tom,10000
select * from tb_finance;
1,Tom,0

執(zhí)行事務(wù)操作

start transaction;

select balance from tb_bank where name = 'Tom';

-- 生成重做日志 balance = 8000
update tb_bank set balance = balance - 2000 where name = 'Tom';

-- 生成重做日志 account = 8000
update tb_finance set account = account + 2000 where name = 'Tom';

commit ;

流程
在這里插入圖片描述
mysql 為了提升性能把每次修改的數(shù)據(jù)同步到磁盤,而是會先存到 Buffer Pool 中,把這個當(dāng)作緩存,然后使用后臺的線程將緩存刷新到磁盤。
當(dāng)在執(zhí)行刷新時,宕機(jī)或者斷電,可能會丟失部分?jǐn)?shù)據(jù)。所以引入 redo log 來記錄已成功提交事務(wù)的修改信息,并且在事務(wù)提交時會把 redo log 持久化到磁盤,系統(tǒng)重啟后再讀取 redo log 恢復(fù)最新數(shù)據(jù)。

redo log 用于恢復(fù)數(shù)據(jù),保障已提交事務(wù)的持久化特性。

undo log

undo log 叫做回滾日志,用戶記錄數(shù)據(jù)被修改前的信息,作用包含兩個:提供回滾和 MVCC(多版本并發(fā)控制)。
redo log 相反,undo log 記錄被修改前的信息。 undo log 主要記錄數(shù)據(jù)的邏輯變化,可以在發(fā)生錯誤時將之前的記錄的邏輯變化進(jìn)行回滾。

原文鏈接:https://blog.csdn.net/weixin_44756627/article/details/126413498

欄目分類
最近更新