数据库四种事务隔离级别大致理解

1、ACID

  A:原子性:一个事务中的每个操作,要么都做要么都不做,不会在事务结束后有的做了有的没做。

  C:一致性:一个事务的始末应该对数据库的完整性没有破坏。比如转账问题,A转出帐,B不能没收到。

  I:隔离性:同一时间一个事务操作一个数据,另一个事务不能操作这个数据。

  D:持久新:事务处理后的数据应该进行持久化处理,存储到硬盘中,而不是依然在内存里。

 

2、事务并发时候出项的三种问题

  1、脏读:A事务对数据进行修改的过程中,B事务读取该数据,A事务对该数据进行回滚,那么B事务读到了脏数据。

  2、不可重复读:A事务多次读取一个数据,在此过程中,B事务对该数据进行了修改并进行了提交,导致A事务读取同一数据时却读到了不同数值。

  3、幻读:A事务对一类数据进行修改过程中,B事务插入(删除)一条数据,A结束修改后才发现多(少)了一条数据。

  脏读和不可重复读区别:脏读是在另一个事务提交之前查到不一致数据的;不可重复读是在另一个事务提交之后查到不一致数据的。解决脏读的方法是修改隔离级别为读未提交以上级别;解决不可重复读的方法是锁住要修改的行。

  不可重复度和幻读区分:不可重复读侧重于修改;幻读侧重于新增和删除。解决不可重复度的方法是锁住要修改的行,而幻读需要锁住整张表。

 

3、事务的四种事务隔离级别(从松到严)以及对应的问题

    隔离级别      脏读       不可重复读    幻读

  1、读未提交          是      是        是

  2、读已提交            否      是        是

  3、可重复读       否      否           是

  4、串行化        否      否           否

  mysql默认的隔离级别是可重复读

 

4、设置当前的事务隔离级别

  set session transaction isolation level (read uncommited、read commited、repeatable read、serializable)

 

5、MVCC多版本并发控制(只是一种机制,可以替代行锁减少开销)

  各种引擎都不是独立使用行锁的,如果使用行锁的话开销较大,一般使用MVCC来代替锁机制。

  innodb会在每行数据后添加隐藏的两列,一个是创建时间(版本号),一个是删除时间(版本号)

  每次事务都会增加一次版本号。

  查询只能查到两种条件的数据:1、只能查询到比查询时的事务版本号低的数据,这样可以有效避免不可重复读和幻读。

                2、删除版本号要么未定义,要么比查询版本号要高,这样可以保证在查询前数据还没有被删除。

  这样可以解决的是读写冲突,比如幻读,不可重复读这样的隔离性问题。

  但是两个事务,A事务update数据后没有提交,B事务也去update同一个数据后提交,然后A事务也提交,那么B事务提交的数据信息就丢失了。无法解决写写冲突。

 

6、OCC乐观并发控制

  用来解决写写冲突的无锁并发控制机制。在一个事务修改数据 提交后,需要查看期间有没有新的提交,没有就提交,有就放弃并重试。

 

一般可以使用MVCC配合OCC可以解决两种冲突。

 

posted @ 2019-07-05 18:30  彩电  阅读(582)  评论(0编辑  收藏  举报