数据库的脏读,可重复读,以及幻读的问题产生于 数据库事务的隔离特性之一 --------------------------------隔离性。
那么,什么是数据库的隔离性,即多个并发的事务之间相互隔离。
数据库的设计者认为,根据不同的事务的并发量可以使用不同的方法解决不同的问题。
并发情况问题一:脏读,
tansaction A 在select操作, 同时tranction B在频繁的update操作,会导致A的查询结果变化,而使得接下来的操作发生变化
解决方法:设置数据库的隔离级别为read commited即可以解决,A的 select 必须在 B 的update进行commit之后 ,select到 持久化到数据的数据。
并发情况问题二:可重复度读
tranction A频繁的进行select操作,同时transaction B在update操作, transaction A 的最终查询结果,依赖于前几次的查询,而B的操作会在A查询时update并且commit·,改变之前查询过的数据,导致最终查询数据不正确
解决方法:设置数据库的隔离级别为repeatable read,让A select 不到 B的update并且commit操作,
并发情况问题三:幻读
tranction A 进行 insert操作,tranction B 在A之前进行insert 操作,A查询时,看不到B的insert操作后的数据,再插入会报相同主键值
解决方法:设置数据库的隔离级别为serilizable,让B阻塞不能insert,直到A select,insert 之后,B马上进入insert