什么是事务的ACID原则?
A 指的是 原子性(Atomicity)
原子性: 原子性意味着事务的执行作为原子,并不可再拆分,一旦成功执行,就全部成功,一旦失败就全部回滚;
C 指的是 一致性(Consistency)
一致性: 一致性指的是在事务的开始和结束应该满足一致性的约束;
例如 : A+B=100, 如果这个时候 A 的值发生了改变,那么 B 的值也应该发生改变,以此完成这个条件;
I 指的是 隔离性(Isolation)
隔离性:隔离性指的是一个事务的执行不能被并发的其他事务干扰,即该事务操作的数据对其他并发的事务是隔离的,并发的各个事务之间不能互相干扰;
D 指的是 持久性(Durability)
持久性:持久性指的是一个事务被提交,它对数据库中的数据改变就是永久性的;
数据库的并发问题
脏读:脏读指的是一个事务读取了另一个事务还没有提交的数据,如果第二个用户回滚,那么第一个用户读取到的数据就是无效的;
幻读:幻读指的是一个事务读取了一组数据,然后另一个事务在这个数据表中又增加了几行,这时第一个事务再读取事务发现多了几行,这就是幻读;
不可重复读:一个事务读取了一个字段,然后另一个事务更新了这个字段,这个时候第一个个事务再读取这个字段值就不一样了;
数据库的隔离级别
隔离级别 | 描述 |
---|---|
读未提交 | 允许事务读取其他事务未提交的数据,脏读,不可重复读 ,幻读都会出现; |
读已提交 | 允许事务读取其他事务已经提交的变更,可以避免脏读,但是不可重复读,幻读问题依旧会存在; |
可重复读 | 确保事务可以多次在同一个字段中读取相同的值,在这个事务持续期间禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读依旧会出现; |
串行化 | 确保一个事务可在一个表中读取到相同的行,在书屋持续期间禁止其他事务对该表进行增删改操作,可以避免一些并发问题,但是性能及其底下; |
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED 。
Mysql 支持 4 种事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ。
|