MySQL中的事务问题

事务确保了数据库操作的完整性,包括原子性(操作不可分割)、一致性(保持数据靠谱)、持久性(修改永久保存)和隔离性(并发处理)。并发执行事务可能导致脏读、不可重复读和幻读问题,数据库如MySQL通过不同隔离级别(如读未提交、读已提交、可重复读和串行化)来解决这些问题,平衡效率和准确性。
摘要由CSDN通过智能技术生成

事务的引出

比如我们手机转账的时候, 甲手机里的钱要转到乙手机里, 那么我们就要对甲的钱包实行扣钱操作,然后对乙手机钱包进行加钱操作, 假如操作执行一半,数据崩溃了,导致甲扣了钱,乙没加钱,那这就很尴尬了.(ps: 这种事情以前其实挺常见的)
事务就是为了解决上述问题.

什么是事务

事务的本质就是把多个 sql 语句打包成一个整体, 要么全部执行,要么一个都不执行, 不会出现执行一半这种中间状态.

回滚

其实上面的一个都不执行并不是真的一个语句都不执行, 而是看起来和没执行一样, 这里是因为它把数据恢复了. 这个恢复数据的操作 我们就叫它回滚.
进行回滚的时候,如何知道数据的初始状态呢?
数据库里有个专门记录事务的日志, 也正因如此, 使用事务的时候, 执行 sql 的开销是更大的, 效率更低.

事务的四个关键特性

1. 原子性

过去人们认为原子是事物能够分割的最小单位, 所以原子性就代表事务不可分割的特性.

2. 一致性

即事务执行前后, 数据得是靠谱的.
假如甲给乙转20块钱, 结果甲扣20, 乙收到2000块, 这不是无中生有吗,数据不能离谱, 得靠谱.

3. 持久性

事务修改的内容是写到硬盘上的, 持久存在的, 重启也不会丢失.

4. 隔离性

隔离性是为了解决’‘并发’‘执行事务, 引起的问题.(服务器同时处理多个客户端的请求, 就称为’‘并发’')
如果并发的这些事务是修改不同的表 / 不同的数据, 那没事.
但如果是修改同一个表 / 同一个数据, 那就可能带来一定的问题.
比如多个客户端一起尝试对同一个账户进行转帐, 此时可能就会把这个数据给搞乱了.
事务的隔离性就是为了在数据库并发处理问题的时候, 不会出问题.
下面来说说并发处理事务会有哪些问题, 以及处理方法.

并发执行事务可能出现的问题

1. 脏读问题

一个事务A正在对数据进行修改的过程中, 还没提交之前, 另一个事务B, 也对同一个数据进行读取, 此时B的读操作就称为"脏读", 读到地数据也称为"脏数据"(也就是无效数据).
为什么说是无效数据呢? 因为事务A还没对数据修改完成, B就读了, 所以B读到的数据不一定是事务A修改后并提交的数据.
为了解决脏读问题, mysql中引用了"写操作加锁"这样的机制
“写操作加锁” 其实就是事务A对数据进行操作的时候, B不能对该数据进行读操作, 直到A对数据操作完提交后, 才可操作.

给写操作加锁降低了并发程度(降低了效率), 提高了隔离性(提高了数据的准确性).

2. 不可重复读

事务1 已经提交了数据, 此时事务2 开始读取数据, 在读取过程中, 事务3 又提交了新的数据, 此时意味着同一个事务2 内, 多次读数据, 读出来的数据是不一样的(预期是多次读取结果一样), 这就叫做"不可重复读"(第二次读取结果不能复现第一次的结果).
mysql中通过对读加锁, 来保证在事务2 读取数据的时候, 不会再有新的数据更新(即当事务2 处理完后才能进行事务3)

通过对读加锁, 又进一步降低了事务的并发处理能力(处理效率也降低了), 提高了事务的隔离性(数据的准确性又得到提高)

3. 幻读

在读加锁和写加锁的前提下, 一个事务两次读取同一个数据, 发现读取的数据值一样, 但结果集不一样(Student.java 代码内容不变, 但第一次看到的是只有Student.java 这个文件, 第二次看到的却是Student.java 和 Teacher.java), 这种情况就称为"幻读".

数据库使用"串行化"来解决幻读, 彻底放弃并发处理事务, 一个接一个的串行处理事务.(这样做是并发程度最低的(效率最低), 隔离性是最高的(准确性也是最高的)).

对应上述问题, mysql提供了四种隔离级别:

read uncommitted 没有任何限制, 并行最高(效率最高), 隔离性最低(准确性最低)
read committed 给写加锁, 并发程度低, 隔离性提高了
repeatable read 给写和读都加锁, 并发程度又降低, 隔离性又提高了
serializable 串行化, 并发程度最低,隔离性最高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风的浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值