一个事务中 可以查询自己未提交的数据吗_来谈谈MySQL事务及事务引发的问题

本文深入探讨了MySQL事务的四大特性:原子性、一致性、隔离性和持久性,并详细阐述了事务可能引发的问题,如脏读、幻读、不重复读和更新丢失。通过分析事务的隔离级别,如Read Uncommitted、Read Committed、Repeatable Read和Serializable,提出了解决这些问题的策略,包括选择合适的事务隔离级别和利用悲观锁、乐观锁防止更新丢失。
摘要由CSDN通过智能技术生成

1acc5b9d047376b62213b90025368be7.png

说起事务,肯定能够想到这样一句话,这个事情要么不做,要么做完;或者是好兄弟不求同年同月同日生,但求同年同月同日死。有点过分,但是是这个理儿。

四大特性

我们都知道,提到事务,就不能不提事务的四大特性,ACID,即原子性,一致性,隔离性,持久性。

  • 原子性(Atom):事务的一组操作是原子的不可再分割的,这组操作要么同时完成要么同时不完成。
  • 一致性(Consistency): 事务在执行前后数据的完整性保持不变。数据库在某个状态下符合所有的完整性约束的状态叫做数据库具有完整性。在解散一个部门时应该同时处理员工表中的员工保证这个事务结束后,仍然保证所有的员工能找到对应的部门,满足外键约束。
  • 隔离性(Isolation):当多个事务同时操作一个数据库时,可能存在并发问题,此时应保证各个事务要进行隔离,事务之间不能互相干扰。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,不能再回滚。

事务有这些特性,但是他又带来了什么样的问题呢?

事务引发的问题

脏读

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

这是非常危险的,假设A向B转帐100元,对应sql语句如下所示
   1.update account set money=money+100 where name='B';
   2.update account set money=money-100 where name='A';
当第1条sql执行完,第2条还没执行(A未提交时),如果此时B查询自己的帐户,就会发现自己多了100元钱。如果A等B完成后后再回滚,B就会损失100元。

幻读

出现幻读的情况,数据可能不是错误的,但是可能不符合实际的业务需求。

幻读出现情况:一个事务的两次不同时间的相同查询返回了不同的的结果集。例如:一个 select 语句执行了两次,但是在第二次返回了第一次没有返回的行,那么这些行就是“phantom” row。

例如&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值