事务的并发控制可能产生哪些问题 及 四种事务隔离级别

1.事务的并发控制可能产生哪些问题

        不同事务之间可能会互相影响,比如一个事务修改另一个事务也改了,但是另一个事务的修改把这个事务的修改给覆盖掉了,这就是所说的事务并发控制问题。

如果不对事务进行并发控制,可能会产生四种异常情况

幻读(phantom read):一个事务第二次查询出现第一次没有的结果,说明别的事务已经插入一些数据。注意这是在同一个事务里面的查询

非重复读(nonrepeatable read):一个事务重复读两次得到不同结果,说明读取操作结果是不可重复的。

脏读(dirty read):一个事务读取到另一个事务没有提交的修改,就是当另一个事务它还没有提交修改一个事务就读取到了修改。

丢失修改(lost update):并发写入造成其中一些修改丢失。

 

2.四种事务隔离级别

  为了解决并发控制可能产生的异常问题,数据库定义了四种事务的隔离级别

读未提交(read uncommitted):别的事务可以读取到未提交改变

读已提交(read committed):只能读取已经提交的数据

可重复读(repeatable read):同一个事务先后查询结果一样,Mysql InnoDB默认实现可重复读级别。

可串行化(Serializable):事务完全串行化的执行,隔离级别最高,执行效率最低。相当于把数据库在一个事务执行的时候完全锁住,等它执行完才能执行下一个。

    ① 读未提交( Read Uncommitted )

         读未提交是隔离级别最低的一种事务级别。在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)

   ② 读已提交( Read Committed )

        在 Read Committed 隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。

  ③ 可重复读( Repeatable Read )

        在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。

  ④ 可串行化( Serializable )

        Serializable 是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。

       虽然 Serializable 隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。

        默认隔离级别:如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用 InnoDB,默认的隔离级别是Repeatable Read。

 

 

 

你可能感兴趣的:(数据库)