什么事事务
事务是一组命令的合称,在mysql中可以理解为一次性指向一组增删改查命令。事务这个概念本身是没有做数据安全的约束的,所以为了数据安全性增加了AICD这四个属性对事务进行约束,使一个不安全的事务成为一个完美的事务
什么是ACID
A:原子性:简单来说就是事务要不同时成功,要不同时失败
C:一致性:数据库总是从一个一致的状态转到另外一个一致的状态,举个例子就是我在一个事务中多次查询后查询的结果是一致的
I:事务在提交前对其他事务是不可见的,如果不在并发过程中,事务都是具有隔离性的
D:持久性: 一旦事务提交,则其所作的修改就会永久保存到数据库中。即使系统崩溃,修改的数据也不会丢失。
这几个概念有点难理解,我直接把别人的cv过来:
- 只要满足一致性,事务的执行结果才是正确的。
- 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要满足原子性,就一定能满足一致性。
- 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还要满足隔离性,才能满足一致性。
- 事务满足持久化是为了能应对数据库崩溃的情况。
并发中数据读取的问题
- 脏读:简单来说就是有A B两个事务,B的事务还没提交,A就取读B的数据。B出错回滚了,A读的数据就是脏数据
- 不可重复读:简单来说就是A,B都对相同的数据进行操作,A第一次读数据,读完后。恰好B对数据进行了更新或者删除,然后提交了事务,数据更改,A再读就发现前后数据不一样,所以叫不能重复读取
- 幻读:幻读,假设A的事务逻辑是查询某条记录,然后对这条记录进行更新。按照A的事务逻辑来说,如果记录为空,那么事务应该是失败了。但是这时b插入了这条记录,这条记录刚好符合A的搜索条件,然后导致A事务成功了,这不是我们想要的结果。我的理解是不可重复读是读出问题,幻读是写出问题
虽然他们最终结果都是读错,但是造成读错的原因是不相同的
隔离级别
隔离级别是为了解决上面三个问题而提出的规范
- 未提交读(READ UNCOMMITTED)
事务中的修改即使没有提交,对其他事务也都是可见可操作 - 提交读(READ COMMITTED)
一个事务从开始直到提交之前,所做的任何修改对其它事务都是不可见的。 - 可重复读(REPEATABLE READ)
可重复读保证了在同一事物中多次读取同样记录的结果是一致的。 - 可串行化(SERIALIZABLE)
该级别是最高的隔离级别,通过强制事务串行执行避免上面的幻读问题
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 |
---|---|---|---|
READ UNCOMMITTED | 是 | 是 | 是 |
READ COMMITTED | 否 | 是 | 是 |
REPEATABLE READ | 否 | 否 | 是 |
SERIALIZABLE | 否 | 否 | 否 |