MySQL事务的四种隔离级别总结

一、事务的四个基本要素(ACID)

  1. 原子性:事务开始后所有操作,要么全部不做,要么全部做完;事务执行过程中出错,会回滚到事务开始前的状态,一个事务不可能只执行其中一部分操作。
  2. 一致性:事务开始前和结束后,数据库的完整性约束没有被破坏;比如A想B转钱,A扣了钱,B也一定增加了钱。
  3. 隔离性:同一时间,只允许一个事务请求同一数据,不同事务之间没有干扰;比如A正在从一张银行卡中取钱,这个过程中,B不能对这张银行卡进行操作。
  4. 持久性:事务提交后,对数据库的更新就是永久的。

二、事务的三个并发问题

  1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那A读到的就是脏数据。读未提交会产生这种问题。

例子:
首先——>张三工资为5000,事务A中把他的工资修改为8000,但事务A还没有提交
然后——>事务B正在读取张三工资,读取到8000
接着——>事务A发生异常,事务回滚,张三工资 修改失败,回滚到5000
最后——>B读到的是8000,是脏数据

  1. 不可重复读:事务A多次读取同一数据,而事务B在A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取到的结果不一致。不可重复读(读已提交)会产生这种问题

例子:
首先——>张三工资为5000,事务A读取到5000,此时操作没结束,事务没提交
然后——>事务B将张三的工资改为8000,事务B提交
最后——>事务A又读取张三的工资,此时发现两次读取到的数据不一致,导致了不可重复读

  1. 幻读:可重复读会发生这种问题

首先——>用户B先查询数据,一共有两条,id为1的和id为2的,它准备插入一条新数据然后提交
这时——>用户A插入一条id为3的新数据,并且提交了
此时——>用户B插入id为3的数据,这时发现插入不进去,此时就发生了幻读。

小结:不可重复读(读已提交)侧重于修改,而幻读侧重于新增和删除;而解决幻读一般需要锁住这个表,解决不可重复读只需锁住操作的那一行数据即可。

三、MySQL的事务隔离级别

事务隔离级别(逐渐增高)脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed) 也叫 读已提交
重复读(repeatable-read)
串行读(serializable)

MySQL的默认隔离机制为 可重复读

1、读未提交:所有事务都可以看见其他未提交事务的执行结果
2、不可重复读(读已提交):一个事务只能看见已提交事务的结果
3、可重复读:保证同一事务的多个实例在并发读取数据时,看到同样的数据
4、串行读:通过强制事务排序,使之不可能产生相互冲突,串行读时,会锁掉整张表

补充:
1、隔离级别越高,越能保证数据的一致性,但是对并发性能的影响也越大。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值