【数据库】MySQL 解读事务的意义及原则

news/2025/1/23 21:41:39/

目录

1.事务的概念

2.为什么要用事物 

3.使用 

 4.事务的原则(ACID)

4.1原子性(Atomicity) 

4.2一致性(Consistency)

4.3持久性(Durability) 

4.4隔离性(Isolation) 

隔离性导致的一些问题 


1.事务的概念

事务指逻辑上的一组操作(多个sql语句组成),组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

2.为什么要用事物 

上方的概念有些晦涩难懂,我给大家举个例子来理解一下。

我们现在有一个数据表:

create table accout(id int primary key auto_increment,name varchar(20) comment '账户名称',money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('张三', 5000),
('李四', 1000);

李四觉得这个月1000块不够用,于是向张三借2000块钱。 

-- 张三账户减2000
update  accout set money=money-2000 where name='张三';
-- 李四账户加2000
update  accout set money=money+2000 where name='李四';

当张三刚把钱转给李四时(刚好执行完第一句sql),此时,突然停电了(没来的及运行第二句sql)。这时,张三的账户已经减去了2000块,但是李四账户2000块还没加上(杯具啊)。

这如何是好呢?这时,我们的“事务”站出来了,我们可以把这两句sql写成一个事务,保证这两个数据全部运行成功或者全部运行失败。不会再出现张三把钱扣了,但是李四没有收到钱的情况 。

3.使用 

  1. 开启事务:start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:rollback/commit;

说明:rollback即是全部失败,commit即是全部成功

start transaction;
-- 张三账户减少2000
update accout set money=money-2000 where name = '张三';
-- 李四账户增加2000
update accout set money=money+2000 where name = '李四';
commit;

 4.事务的原则(ACID)

事务ACID原则: 原子性、一致性、隔离性、持久性 。

4.1原子性(Atomicity) 

在化学层面大家都知道,原子是不可再分的。这里的意思与此相似,事务中的语句是不可分的,要么都执行成功,要么都执行失败。就像上方给出的例子,张三给李四转钱,只要把这两句sql放入到事务中,这两句sql就不是在分开执行。

4.2一致性(Consistency

一直性也很好理解,还用上方的例子,李四要向张三接2000块,我们去扣除张三的余额2000块,但是到了给李四打钱的时候,却只打入1000块,这显然不行,我们必须保证扣除的钱和打入的钱保持一致才可以,这就是一致性。

4.3持久性(Durability) 

持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。 相当于李四借完钱了,李四必须承认接了张三的钱,不管什么理由,都没用。

4.4隔离性(Isolation) 

隔离性是指并发(多个用户同时操作)的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。 


隔离性导致的一些问题 

脏读: 

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

不可重复读: 

在一个事务内读取表中的某一行数据,多次读取结果不同.

 幻读:

是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致.  


http://www.ppmy.cn/news/32103.html

相关文章

论文阅读:NeRF Representing Scenes as Neural Radiance Fields for View Synthesis

论文阅读–NeRF Representing Scenes as Neural Radiance Fields for View Synthesis 这是 2020 ECCV 的一篇文章,记得好像还获得了最佳论文奖的提名,这篇文章相当于将自由视点生成这个方向开辟出了一个新的解决思路。 文章的作者们提出了一种可以对复…

AUTOSAR-Fee

Fee模块 全称Flash EEPROM Emulation Module,属于ECU抽象层 Fee模块本身是脱离硬件的,但是Fee模块可能会引用的Fls模块定制API,所以只能算半抽象. FEE模块应从设备特定的寻址方案和分段中抽象出来,并为上层提供虚拟寻址方案和分段(virtual addressing scheme and segment…

伯努利方程示例 Python 计算(汽水流体和喷泉工程)

伯努利原理 在流体的水平流动中,流体速度较高的点比流体速度较慢的点具有更小的压力。 不可压缩流体在到达狭窄的收缩部分时必须加速,以保持恒定的体积流量。 这就是为什么软管上的窄喷嘴会导致水流加速的原因。 但有些事情可能会困扰您这一现象。 如果…

【JavaSE】类和对象(上)

类和对象(上)类和对象1. 面向对象的初步认知1.1 什么是面向对象1.2 面向对象与面向过程2. 类定义和使用2.1 简单认识类2.2 类的定义格式2.3 课堂练习3. 类的实例化3.1 什么是实例化3.2 类和对象的说明类和对象 类和对象需要慢慢的逐步的才能理解&#x…

JS中sort()方法返回值?

参考 https://segmentfault.com/q/1010000043489928 精辟解释 就是说 sort() 会修改原数组项的排序,sort() 结束后会返回一个数组结果,这个结果其实就是原数组。并不是说会返回一个新的数组。 原理讲解 JS 分为栈内存和堆内存,栈内存可以…

【6G 新技术】6G数据面介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Arduino 驱动DS1307时钟模块使用介绍

Arduino 驱动DS1307时钟模块使用介绍 🔖DS1307时钟模块 📍DS1307时钟模块资料 https://pan.baidu.com/s/1mtXruLAktZj7UDhFD54BNw 提取码:d9xh 📋模块简介:DS1307 I2C实时时钟芯片(RTC) 24C32 32K I2C EEPROM存储器 解决DS1307带备用电池不能读写的问题。 充满电后,…

javaSE系列之继承与多态

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 javaSE系列之继承与多态继承关键字extends父类与子类在子类中访问父类的成员变…