美文网首页面试精选程序员
Mysql - 数据库的隔离级别、传播行为

Mysql - 数据库的隔离级别、传播行为

作者: 夹胡碰 | 来源:发表于2021-01-16 23:45 被阅读0次

1. 事务的特性

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
ACID,是指在可靠数据库管理系统(DBMS)中,事务(Transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性
    原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
    如,A向B转钱,在事务中的扣款和加款两条语句,要么都执行,要么都不执行。
  • 一致性
    一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。
    如,A和B存款总额为1000,A向B转钱,无论失败,最终A和B的存款总额依然为1000.
  • 隔离性
    多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
    数据库多个事务之间操作可能出现的问题以及事务隔离级别是这篇文章介绍的重点。
  • 持久性
    持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
    即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。

2. 事务的并发问题

  • 赃读(Dirty Read)
    一个事务读取到了另外一个事务没有提交的数据
    事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  • 不可重复读(Nonrepeatable Read)
    在同一事务中,两次读取同一数据,得到内容不同
    事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致
  • 幻读(Phantom Read)
    同一事务中,用同样的操作读取两次,得到的记录数不相同
    系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样

3. MySql的四中隔离级别

  • Read Uncommitted(读取未提交内容)
    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。
    读取未提交的数据,则会发生赃读
  • Read Committed(读取提交内容)
    一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别,但非MySql
    一个事务多次读取的过程中,另一个事务可能对同一条数据做修改并提交,导致前一个事务多次读取到的数据不一致,则会发生不可重复读
  • Repeatable Read(可重读)
    它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这是MySql的默认隔离级别
    但,此级别依然会发生幻读,InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
  • Serializable(可串行化)
    它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题,使用了间隙锁解决了该问题。

4. Spring Transaction的事务传播行为

  • PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务。
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
  • PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
参考
  1. 重新理解mysql的锁、事务隔离级别及事务传播行为

相关文章

  • 聊聊MySQL的隔离级别

    原文:聊聊MySQL的隔离级别 | MySQL隔离级别原理参考:oracle - mysql - 数据库事务隔离级...

  • Mysql - 数据库的隔离级别、传播行为

    1. 事务的特性 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操...

  • MySQL 事务隔离级别

    一、MySQL 数据库命令 查看数据库版本: 查看数据库现在的隔离级别 修改隔离级别: 级别参数:1.READ-U...

  • mysql事务

    事务属性的种类:传播行为、隔离级别、只读和事务超时 a)传播行为定义了被调用方法的事务边界。 b)隔离级别 在操作...

  • MySQL 事务 隔离级别 Spring传播行为

    一、四大属性ACID 1、原子性(Atomicity):事务中的所有操作是一个整体,要么全部成功,要么失败回滚。(...

  • Mac系统mysql设置事务隔离级别

    Mac系统mysql设置事务隔离级别 MySQL数据库事务隔离级别主要有四种: Serializable 串行化,...

  • 2018-04-19Spring事务

    spring事务分为:5大隔离级别(数据库4大隔离级别) 7大传播属性 隔离级别理解就是对数据操作的隔离性操作,脏...

  • Spring事务管理

    概述 事务管理:4大隔离级别+7大传播性+ReadOnly配置 4大隔离级别没啥好说的,和Mysql的事务级别一样...

  • Mac系统设置MySQL事务隔离级别永久版

    Mac系统设置MySQL事务隔离级别永久版 之前介绍过一种暂时性的更改MySQL数据库事务隔离级别的设置方法...

  • Spring 事务传播行为(一)

    Spring 提供了对数据库事务的支持,除了常说的事务隔离级别,Spring 定义了不同的事务传播行为,用来简化我...

网友评论

    本文标题:Mysql - 数据库的隔离级别、传播行为

    本文链接:https://www.haomeiwen.com/subject/ohjoaktx.html