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

本文对比了MySql中InnoDB与MyISAM两种存储引擎的特点,详细解析了它们在事务处理、锁机制、索引类型及表存储等方面的差异,并深入探讨了事务的四个隔离级别如何解决并发操作中可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 InnoDBMyISAM
事务支持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类似的操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值