了解数据库的四种隔离级别

前言

被人问到是否了解数据库的隔离级别,一下没有回答上来,那就简单的复习一下吧。

四种隔离级别

数据库的隔离级别有四种,从高到低依次:

  • Serializable
  • RepeatableRead
  • ReadCommitted
  • ReadUncommitted
ReadUncommitted

读未提交,可以读取另一个事务未提交的的数据。
应用实例:当用户进行充值操作的时候,程序一般都需要操作几个不同的表,当时我们在修改用户余额后,用户查询了自己余额,发现余额已经变更,但是程序后面的操作出现了异常,开启了回滚,这时候用户又发现自己的余额没有变更。这时候用户就出现了脏读,当时修改完用户余额时候事务并没有提交,而继续在执行下面的操作,而用户就读取了未提交事务的数据。

ReadCommitted

读已提交,需要等待一个事务提交后才能读取数据,ReadCommitted可以解决脏读的问题。
应用实例:当用户充值成功后,准备购买道具,用户开始购买道具的事务,这时候余额是足够的, 这就在这个时候用户有一个自动扣费的业务划走了用户的余额并提交事务,这时候就会导致用户购买道具扣款失败。余额也会发生变更。可用户当时不会觉得,他认为刚刚余额明明是够的。ReadCommitted能解决如果事务在进行修改操作的时候需要等待修改操作结束后才能读取数据,这样就可以避免脏读。但是在事务内出现了两次查询结果不一致的问题。这种现象就是不可重复读。

RepeatableRead

重复读,在开始读取数据时,不允许任何修改操作,
应用实例:单用户进行购买道具事务时,锁定用户的余额,不允许任何其他事务的更新修改操作。这时候购买道具成功了,但是自动扣费的业务就会扣款失败。重复读可以解决不可重复读的问题,但是重复读会出现幻读的问题。假如用户想打印他的消费清单,查询是10条,就在准备打印的时候用户的自动扣费业务消费了一笔并提交了事务,这时候打印出来的记录就会是11条。幻读就是一个事务在前后两次查询同一范围的时候,后一次查询看到了前一次查询没有看到的行。幻读的问题是针对insert,不可重复度对应的是update

Serializable

Serializable是数据库最高的事务级别,可以避免脏读,不可重复读和幻读,但是并发性极低,不推荐使用。

总结

SqlServer,Oracle的默认隔离级别是ReadCommitted,而MySql的默认隔离级别是RepeatableRead。了解隔离级别能让我们更好的去发现和解决问题。

posted @ 2020-06-04 21:56  她微笑的脸  阅读(546)  评论(0编辑  收藏  举报