zoukankan      html  css  js  c++  java
  • 数据库事务的四种隔离机制和七种传播行为

    MySQL数据库为我们提供的四种隔离级别:(依次解决脏读、不可重复读、幻读)

      ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

      ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。(Mysql默认的方式)

      ③ Read committed (读已提交):可避免脏读的发生。(Oracle默认的方式)

      ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。(INNODB内部机制)

    数据库事务正常执行的四个特性:

    ACID属性:

     原子性(atomicity):即不可分割,事务要么全部被执行,要么全部不执行

    一致性(consistency):事务的执行使得数据库从一种正确状态转换成另外一种正确状态

    隔离性(isolation):在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务

    持久性(durability):事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存

    并发下事务产生的问题:

    1、脏读:事务A读到了事务B还没有提交的数据;

    2、不可重复读:在一个事务里面读取了两次某个数据,读出来的数据不一致;

    3、幻读:在一个事务里面的操作中发现了未被操作的数据。

    幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是next-key locks。

    SELECT * FROM t_bitfly LOCK IN SHARE MODE;

    SELECT * FROM t_bitfly FOR UPDATE;(重复读,看到其他事物提交的数据)。


        

    不同的隔离级别在数据库中的加锁策略不一样:
        Read uncommitted - 读不需要加锁,写仅仅需要加行锁。 
        Read committed - 需要加写锁,读必须等待写事务结束。避免脏读
        Repeatable reads - 需要加读锁,当有事务在读一行记录,其他写同一行的事务都会阻塞。避免不可重复读。
        Serializable - 需要加范围锁,当有事务 SELECT 某个范围的数据时,其他访问同一范围的事务都会阻塞。避免幻读。

    Oracle数据库中:

    Serializable (串行化)级别。

    Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

    在MySQL数据库中查看当前事务的隔离级别:

       select @@tx_isolation;

      在MySQL数据库中设置事务的隔离 级别:

       set  [glogal | session]  transaction isolation level 隔离级别名称;    set tx_isolation=’隔离级别名称;’

    事务传播行为类型

    说明

    PROPAGATION_REQUIRED

    如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。

    PROPAGATION_SUPPORTS

    支持当前事务,如果当前没有事务,就以非事务方式执行。

    PROPAGATION_MANDATORY

    使用当前的事务,如果当前没有事务,就抛出异常。

    PROPAGATION_REQUIRES_NEW

    新建事务,如果当前存在事务,把当前事务挂起。

    PROPAGATION_NOT_SUPPORTED

    以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

    PROPAGATION_NEVER

    以非事务方式执行,如果当前存在事务,则抛出异常。

    PROPAGATION_NESTED

    如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

     
  • 相关阅读:
    Leetcode———重建二叉树
    springboot+quartz实现定时任务发送邮件demo
    MySQL备份,使用xtrabackup备份全实例数据时,会造成锁等待吗?那么如果使用mysqldump进行备份呢?
    MySQL高可用架构应该考虑什么?你认为应该如何设计?
    你为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?
    MySQL主从复制什么原因会造成不一致,如何预防及解决?
    用什么方法可以防止误删数据?
    MySQL每天产生了多大容量的binlog,用SQL语句能查到吗?
    你遇到过哪些原因造成MySQL异步复制延迟?
    为什么说 pt-osc 可能会引起主从延迟,有什么好办法解决或规避吗?
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9973435.html
Copyright © 2011-2022 走看看