首页 > 其他分享 >【学习笔记】事务

【学习笔记】事务

时间:2022-10-04 17:22:44浏览次数:76  
标签:转账 autocommit 事务 SET -- 笔记 学习 提交

事务

什么是事务?

要么都成功,要么都失败


以转账为例:

有两条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还为转账时的状态

 

 

不可重复读:

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

页面统计查询值 这里写图片描述

 

 

虚读(幻读)

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

这里写图片描述

参考博客:(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
​
-- 回滚
ROLLBACK
​
SET autocommit = 1 -- 恢复默认值

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

标签:转账,autocommit,事务,SET,--,笔记,学习,提交
From: https://www.cnblogs.com/wztblogs/p/16754083.html

相关文章

  • gcc学习
    GCC在第二章学习gcc时,感觉还是有比较多的东西没有理解完全,在此写下博客,来接续总结归纳以下~编写模式-E:仅执行编译预处理
-S:将C代码转换为汇编代码
-c:仅执行编译操......
  • 初学C语言笔记221004动态内存管理
    constint*consta=&b;//3intconst*consta=&b;//4第三个a是静态的指针(第二个const修饰),指向int,这个int是静态的(第一个const修饰)第四个a是静态的......
  • SAS - Macro 笔记
    SASMacro由两部分组成:MacrovariablesandMacro.Macrovariable:命名规范:需要遵循SAS变量命名规范(不超过32characters,以下划线或字母开始,只包含数字、字母或......
  • 学习笔记——Django项目中请求与响应(json数据)
    2022-10-04测试json数据与Django项目与pycharm连接,在“postman”软件中。“postman”是一个接口测试软件。下载方式问度娘。(1)在“postman”中设置“json”连接请求 ......
  • 机器学习简介
    1.人工智能发展必备三要素数据、算法、计算力(CPU\GPU\TPU)CPU、GPU对比:CPU适合IO密集型任务;GPU适合计算密集型任务。2.人工智能、机器学习、深度学习关系人工智能机器......
  • 观看尚硅谷redis6的学习笔记
     文章目录笔记,资料下载建议先补一下数据结构2.redis介绍3.常用的五大基本数据类型1.对key的基本操作Redis字符串(String)Redis列表(List)Redis集合(Set)Redi......
  • Java基础笔记
    Java程序运行机制编译型由编译器直接编译成能给计算机可以执行的东西速度快操作系统C/C++解释性一步步解释最终达成解释的全部的目的网页java程序运行机制......
  • 对for循环打印三角形的学习理解
    1.for循环这个嵌套其实就是一个套娃形式,一开始无法理解一列一行的样式怎么呈现,后来想通了,其实代码不管怎么敲,想让它呈现出什么样式,它的本质就是一行一行的去输出,只不过可......
  • redis一些关于SessionCallback和事务要注意的地方
     文章目录1.redisTemplate2.StringRedisTemplate3.测试SessionCallBack4.redis相关的同样适用lambda5.RedisSessionCallback和redis事务的区别......
  • [补档]高斯消元做题记录/或曰 学习笔记
    早就退役啦!乍一看挺水的。P2455[SDOI2006]线性方程组板子题。codeP4035[JSOI2008]球形空间产生器给定一个\(n\)维的球体上\(n+1\)个点的坐标\(a_{i,j}\)。求......