您的当前位置:首页正文

MySQL的ACID和并发事务带来的问题简单总结

2023-08-06 来源:我们爱旅游

拓跋阿秀

ACID

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

脏读

  • 一个事务(用户)读取了另一个事务中没有提交的数据,会在本事务中产生数据不一致的问题。
  • 第一个事务首先读取var变量为50,接着准备更新为100的时,并未提交,第二个事务已经读取var为100,此时第一个事务做了回滚最终第二个事务读取的var和数据库的var不一样。
  • 解决方案:@Transactional(isolation = Isolation.READ_COMMITTED) 读已提交的数据

不可重复读

  • T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
  • 一个事务中,多次读取相同的数据,但是读取结果不一样,会在本事务中产生数据不一致的问题。
  • 解决方案:@Transactional(isolation = Isolation.REPEATABLE_READ)

幻读(幻影读)

  • T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
  • 一个事务中,多次对整表进行查询统计,但是结果不一样,会在本事务中产生数据不一致的问题。

丢失修改

因篇幅问题不能全部显示,请点此查看更多更全内容