Mysql:事务

事务特性

事务的特性:acid。

原子性(重要)

事务内的一组操作为原子操作,要么全部成功,要么全部失败。在实际业务如转账,就必须保证一方数目多了一方少了,数目平衡。

一致性(面试常问)

事务成功或失败的结果必须符合业务逻辑。还是以转账为例,A转给B100块,成功就A少100,B多100,失败就双方金额该多少就多少。

不能允许出现,成功了B居然没增加,失败了A少了100

隔离性(面试常问)

其实网上对隔离性的定义是这样的:一个事务的执行不能被其他事务所干扰。
这样的定义不够细致和准确,先说举个违反隔离性的例子吧:
image

B的最终结果应该为100,但为50,是因为违反了隔离性。
我来定义一下隔离性:多个事务差不多同时执行,且共同读写包含同一数据源时,最终多个事务的结果必须符合业务,即符合一致性

但实际中为了性能的考虑,是做不到完全的隔离性的

首先大家要明白,根据违反隔离性的程度,可以分为3个:

  1. 脏读。A事务正在执行还未提交,B事务读到了A事务中的数据且做了相关操作,但是A回滚了
  2. 不可重复读。A事务正在执行了查询sqlA的结果为abc,此时B事务更改数据源abc为def,然后A事务再次执行sqlA得到是def,此情况称为不可重复度。有人问,这不正常嘛,其实真正的隔离性应该做到不管多少次sqlA都应该是abc。说白了还是因为读取了未提交的事务导致
  3. 幻读。和不可重复读是一个道理,不一样是不可重复读关注值的修改,幻读是行记录变更。A事务对user表正在执行了查询sqlA的结果有1条记录,此时B事务在user表添加了2条记录,然后A事务再次执行sqlA得到3条记录,此情况称为幻读,还是因为读取了未提交的事务导致

为了解决上述的问题,提出了4个隔离级别:

  1. 读未提交:一个都解决不了(不采取)
  2. 读已提交:解决脏读
  3. 可重复读:解决脏读、不可重复读
  4. 串行化:全部解决(一般也不采取,并发性太低)

在实际生产中,2和3采取的比较多,因为做不到完全的隔离性会损坏性能

持久性(不太重要)

事务提交或回滚的结果是永久性,即保存在硬盘上的。

posted @   爱编程DE文兄  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2020-06-05 eclipse新建工作空间后常用配置
点击右上角即可分享
微信分享提示