【学习笔记】事务

事务

什么是事务?

要么都成功,要么都失败


以转账为例:

有两条sql,第一条是A给B转账,第二条是B接收A的转账

这两条语句,必须都成功,或都失败,不能一条成功,一条失败

 

事务原则:ACID原则

原子性(Atomicity):事务中的操作要么都发生,要么都不发生。

这里写图片描述

如A给B转账,B收到A的转账,这两个动作必须一起成功,或者一起失败

 

一致性(Consistency):事务前后的数据完整性要保证一致

img

转账前:A + B = 1000

转账后: A + B = 1000

 

隔离性(Isolation):事务的隔离性多个用户并发访问数据库,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

这里写图片描述

事务一:A向B转账200

事务二:C向B转账100

 

持久性(Durability):事务一旦提交则不可逆,被持久化到数据库中

表示事务结束后的数据不随着外界原因导致数据丢失

操作前A:800 B:200

操作后A:600 B:400

如果在操作前(事务还没有提交),服务器宕机或断电,那么重启数据库后,数据状态应该为操作前的状态A:800 B:200

如果在操作后(事务已经提交),服务器宕机或断电,那么重启数据库后,数据状态应该为操作前的状态A:600 B:400

 

隔离所导致的问题

脏读:

指一个事务读取了另外一个事务未提交的数据。

在这里插入图片描述

如图:事务二中读到了事务一中A还为转账时的状态

 

 

不可重复读:

在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

页面统计查询值 这里写图片描述 生成报表的时候,B有人转账进来300(B事务已经提交) 这里写图片描述

 

 

虚读(幻读)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。 (一般是行影响,如下图所示:多了一行)

这里写图片描述

参考博客:(24条消息) 事务ACID理解dengjili的博客-CSDN博客acid

 

执行事务

mysql是自动开启事务提交

-- mysql 默认开启事务自动提交
SET autocommit = 0  -- 关闭
SET autocommit = 1  -- 开启(默认)-- 关闭后需要手动处理事务

流程:

-- 关闭事务自动提交
SET autocommit = 0  -- 关闭
-- 事务开启
START TRANSACTION  -- 标记一个事务的开始,从这个之后的sql都在同一个事务内INSERT xxx
UPDATE xxx
​
-- 提交事务(成功)
COMMIT-- 回滚 (失败)
ROLLBACK-- 事务结束,开启自动提交
SET autocommit = 1  -- 开启(默认)

 

关于保存点:

-- 关于保存点(就像存档一样)SAVEPOINT 保存点名称  -- 设置一个事务的保存点ROLLBACK TO SAVEPOINT 保存点名称   -- 回滚到保存点RELEASE SAVEPOINT 保存点名称   -- 删除保存点

 

模拟事务(转账)

-- 模拟转账-- 创建表
CREATE TABLE `account`(
    `id` INT(3) NOT NULL auto_increment,
    `name` VARCHAR(20) NOT NULL,
    `money` DECIMAL(9,2) NOT NULL,
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
​
-- 插入数据
INSERT INTO `account`(`name`,`money`)
VALUES('A',800.00),('B',200.00)
​
-- 关闭自动提交
SET autocommit = 0-- 开启事务
START TRANSACTION
​
-- A给B转账200
UPDATE `account` SET `money` = `money`-200 WHERE `name` = 'A'-- B接收A的转账
UPDATE `account` SET `money` = `money`+200 WHERE `name` = 'B'-- 提交
COMMIT-- 回滚
ROLLBACKSET autocommit = 1 -- 恢复默认值

必须要一步一步去执行,否则会报错

posted @   GrowthRoad  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示