不可重复读和幻读

       不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。好比,事务B在事务A提交前读到的结果,和提交后读到的结果可能不一样。不可重复读出现的缘由就是事务并发修改记录,要避免这种状况,最简单的方法就是对要修改的记录加锁,在事物B操做的时候,给记录加锁,A没法写入,这会致使锁竞争加重,影响性能。另外一种方法是经过MVCC能够在无锁的状况下,copy一个快照进行修改。避免不可重复读。
     幻读:在同一个事务中,同一个查询屡次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交先后各执行了一次查询操做,发现后一次比前一次多了一条记录。幻读是因为并发事务增长记录致使的,这个不能像不可重复读经过记录加锁解决,由于对于新增的记录根本没法加锁。这个是往里面加入一个新的纪录,无法和之前同样在记录上加锁,须要将事务串行化,读写分离,才能避免幻读。可是能够利用gap lock来解决问题数据库

一个数据库,你能够简单的认为一个文件系统。应对高并发的读,写,修改,删除,天然会带来不少的不一致的问题。如何读的同时处理有人正在进行写入。mvcc根据的正是利用快照,因而存在数据库的多种版本,不一样的时刻的操做对应着不一样的数据库的版本。脏数据问题,幻读的问题。并发

在修改的时候,有些数据库能够进行排队(serializable),读写分离,能够解决并发,可是效率和延时会所以上升。若是采用加锁的原则,那么会相应的利用表锁,页锁定以及行锁,锁之间天然会存在抢占资源,等待问题,形成的死锁。有些干脆复制一份数据,写入的时候就是在这个快照上面就行修改,而后进行提交,可是大量的复制天然会形成效率的降低。mvc

相关文章
相关标签/搜索