数据库事务的ACID和隔离级别

数据库事务的ACID四个基本特性

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

通俗解释:原子性就是一个事物,要么就全部都执行,要么到就全部都不执行;一致性是指执行事务前后数据库都要保持一致性状态(满足主键约束、业务逻辑约束等);隔离性是指数据库一个事务的执行不受=其他事务的影响, 持久性是指事务一旦提交所做的更改是永久的。

数据库事务并发的三种问题:

脏读:一个事务在执行的过程中读到了另一个事务还未提交的修改。

不可重复读:事务A读到了一个输入,然后事务B对这个数据进行修改并提交,事务A1重新读取这个数据的时候发现不一致(针对update)

幻度:事务A通过一定的条件读到了一批数据,在这期间事务B对符合这个条件的数据进行了删除或者插入,那么数据A重新读到某条件下的一批数据时,数据的条数变化了(针对delete和insert)

数据库事务的四种隔离级别

  • 读未提交(Read Uncommitted)
  • 读提交(Read Committed)
  • 可重复读(Repeated Read)
  • 串行化(Serializable)

读未提交:可以读到未提交的内容;会产生“脏读”、“不可重复读”、“幻读”。如无特殊情况,基本是不会使用这种隔离级别的。

读提交:只能读到已经提交的内容。是SQL Server和Oracle的默认隔离级别。这种隔离级别能够有效的避免脏读,无法避免“不可重复读”和“幻读”。

可重复读:专门针对“不可重复读”这种情况而制定的隔离级别,它就可以有效的避免“不可重复读”(加update锁)(是MySql的默认隔离级别),不能避免“幻读”,因为幻读是由于“插入或者删除操作(Insert or Delete)”而产生的。

串行化:这是数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,“脏读”、“不可重复读”、“幻读”都可以被避免,执行效率差,开销大。

总结下面内容摘自: https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc

为什么会出现“脏读”?因为没有“select”操作没有规矩。

为什么会出现“不可重复读”?因为“update”操作没有规矩。

为什么会出现“幻读”?因为“insert”和“delete”操作没有规矩。

“读未提(Read Uncommitted)”能预防啥?啥都预防不了。

“读提交(Read Committed)”能预防啥?使用“快照读(Snapshot Read)”,避免“脏读”,但是可能出现“不可重复读”和“幻读”。

“可重复读(Repeated Red)”能预防啥?使用“快照读(Snapshot Read)”,锁住被读取记录,避免出现“脏读”、“不可重复读”,但是可能出现“幻读”。

“串行化(Serializable)”能预防啥?排排坐,吃果果,有效避免“脏读”、“不可重复读”、“幻读”,不过效果谁用谁知道。

参考资料:

https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc

发表评论

电子邮件地址不会被公开。 必填项已用*标注