数据库的事物和隔离级别

版权声明:转载请标明来源 https://blog.csdn.net/u010652576/article/details/78258461

事物的特性

 1. 原子性(Atomicity):事务中包含的所有操作,要么一次性完成,要么失败后,全部回滚。
 2. 一致性(Consistency):事务提交前和事务提交后,都必须是一致的。
 3. 隔离性(Isolation):事务与事务之间是隔离的,多个并发事务不能互相影响。
 4. 持久性(Durability):事务一旦提交后,对数据的更改是永久性的。

数据库的隔离级别

用买票来说明,例如:A和B两人去买票。
 1. 读未提交(read uncommited) 
     会出现:脏读、不可重复读、幻读。
     因为写事物可以阻止其他写事物,但是无法阻止读事物,因此会出现脏读,即一个事务读取了其他事务修改但未提交的数据,有可能这个数据是错误,这就出现了读脏数据。
    解决方案:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。

 2. 读取已提交(read commited)
     会出现:不可重复读,幻读;解决:脏读。
     因为写事务会阻止其他写事务,读事务不会阻止其他任务事务,因为只能读取其他事务已经提交的,因此不会读取到脏数据,但是会出现不可重复读,即同一个事务中同样条件下读取数据,有可能出现数据不一致的情况,**不可重复读主要是针对同一条记录被其他事务修改**。   
     例如:A查询某场电影剩余3张票,但是当A准备买2张电影票的时候,发现票不够了,因此时有其他事务买了2张票,导致修改后的结果不满足A的需求。
    解决方案:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

3. 可重复读(Repeatable read)
    会出现:幻读,解决:不可重复读,脏读。
    可重复读能够保证同一事务内,多次读取同一条数据,保证该条数据的一致性,但是无法避免幻读,**幻读主要是针对新增\删除的记录符合查询的条件**。
    例如:A查询剩余票数大于3张的电影,第一次查询发现有3场电影,但是第二次查询发现有4场电影,因为在第二次查询前,影院又添加了一场电影,因此第二次读取的时候,会有4场电影。给A的印象,就好像第4场电影是虚幻出来的一样。
        解决方案:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。

4. 可串行化(serializable)
    解决:脏读、不可重复读、幻读。
强制事务串行执行,通过大量加锁,解决幻读,但是对性能影响极大

猜你喜欢

转载自blog.csdn.net/u010652576/article/details/78258461