事务的特性 ACID

1. 事务的ACID

数据库的事务必须具备ACID特性,ACID是指 Atomic(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。

  • 原子性(Atomicity)
    事务包装的一组sql,要么都执行成功,要么都失败。这些操作是不可分割的。
  • 一致性(Consistency)
    数据库的数据状态是一致的。
    事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。
  • 持久性(Consistency)
    事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。
  • 隔离性
    一个事务的成功或者失败对于其他的事务是没有影响。2个事务应该相互独立。
2. 事务的隔离级别

如果不考虑事务的隔离型,由于事务的并发,将会出现以下问题:
1、脏读 – 最严重,杜绝发生
2、不可重复读
3、幻读(虚读)

1.1脏读
指一个事务读取了另外一个事务 未提交的数据。
在这里插入图片描述
一个事务读取了另一个事务没有提交的数据,非常严重。应当尽量避免脏读。

1.2不可重复读
在一个事务内多次读取表中的数据,多次读取的结果不同。

在这里插入图片描述

1.3幻读

在这里插入图片描述

隔离级别:解决问题

  • 数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。
    1.read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。
    存在:3个问题(脏读、不可重复读、虚读)。
    解决:0个问题
    2.read committed 读已提交,一个事务读到另一个事务已经提交的数据。
    存在:2个问题(不可重复读、虚读)。
    解决:1个问题(脏读)
    3.repeatable read
    可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
    存在:1个问题(虚读)。
    解决:2个问题(脏读、不可重复读)
    4.serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
    存在:0个问题。
    解决:3个问题(脏读、不可重复读、虚读)

安全和性能对比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted

常见数据库的默认隔离级别:
MySql:repeatable read
Oracle:read committed

猜你喜欢

转载自blog.csdn.net/qq_24099547/article/details/84928454