数据库的四种隔离级别与七种传播属性

MySql的两种存储引擎:InnoDB,MyISAM

  InnoDB MyISAM
事务 支持ACID的事务,四种事务级别 不支持事务,但是每次查询都是原子的
支持表锁,默认行锁 表锁
是否存储总行数 不存储表的总行数 存储表的总行数
索引 采用聚集索引 采用非聚集索引
表存储 一个Innodb表存储在一个文件内,也可能为多个 索引文件、表结构文件、数据文件

                  备注:nnoDB在不使用索引项查询时,也是锁整张表

数据库锁的划分:

  • 按粒度划分:表级锁、行级锁、页级锁
  • 按锁级别:共享锁(read)、排他锁(write)
  • 按加锁方式:自动锁、显示锁
  • 按操作划分:DML锁、DDL锁
  • 按使用方式:悲观锁、乐观锁

并发事务引发的问题

       1.更新丢失(A事务回滚造成了B事务的更新无效) 

        解决的级别:InnoDB所有级别都解决了这个问题 ,数据库最低级别Read-Uncommitted

       2.脏读(B事务读到了A事务的未提交的更新数据)

       解决的级别:Read-Committed 解决了这个问题,使B事务读取的是A事务的已提交数据

       3.不可重复读(A事务在B事务多次读取数据过程中,更改提交了数据,导致B事务两次读取的数据不一致)

        解决的级别:Repeatable-Read,使B事务忽略A事务对数据的修改提交,读取的是B事务开启时的那份数据(快照)。 但是,仅限于读取,最终修改的数据还是基于A事务提交的数据进行修改(当前读 )。

       4.幻读(A事务读取到3条数据后,B事务增加(或删除)1条数据并提交,导致A事务再修改时数据增加了一条之前并没有查询到的数据)   

       解决的级别:Serializable,使事务之间必须串行执行。Serializable为数据库最高隔离级别。

 

事务传播属性:

  •  PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  •    PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
  •  PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
  •  PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  •  PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
  •  PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
  •  PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

 

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