zoukankan      html  css  js  c++  java
  • Java学习笔记_ 数据库隔离级别和事务传播行为

    转自:

    https://blog.csdn.net/qq_38545713/article/details/79779265

    一:数据库的事物隔离级别与传播行为总结:

        
                

     

    很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。
    避免不可重复读需要锁行就行
    避免幻影读则需要锁表
    如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。
    所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题。


    数据库中事务的四大特性(ACID)
      (1) 原子性

      ⑵ 一致性

      ⑶ 隔离性

      ⑷ 持久性
    现在来看看MySQL数据库为我们提供的事物的四种隔离级别:
    关于spring的事务隔离级别与数据库的一样,也是下面的四个,只不过多了一个default
      1.Read uncommitted (读未提交):最低级别,任何情况都无法保证。
      2.Read committed (读已提交):可避免脏读的发生。
      3.Repeatable read (可重复读):可避免脏读、不可重复读的发生。
      4.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

     以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
      在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别

    isolation(隔离)
    4.查看MySQL数据库当前事务的隔离级别: select @@tx_isolation;

    5.在MySQL数据库中设置事务的隔离 级别: set tx_isolation=’隔离级别名称;’
     
    6.查看mysql的事物是否是自动提交
    1或者on代表启用,0或者off代表禁用,当autocommit=0时,所有的差丶都是在一个事物中,直到显示的执行commit提交或者rollback回滚,该事物结束,同时又开始了另一个新的事物
     
     

    二:数据库的传播行为:
    传播行为分为两种:分为支持事物的传播和不支持事物的传播
    1、PROPAGATION_REQUIRED:(支持事物)如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
    2、PROPAGATION_SUPPORTS:(支持事物)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
    3、PROPAGATION_MANDATORY:(支持事物)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
    4、PROPAGATION_REQUIRES_NEW:(支持事物)创建新事务,无论当前存不存在事务,都创建新事务。
    5、PROPAGATION_NOT_SUPPORTED:(不支持事物)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    6、PROPAGATION_NEVER:(不支持事物)以非事务方式执行,如果当前存在事务,则抛出异常。
    7、PROPAGATION_NESTED:(不支持事物)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
    已混淆点:spring的事务是什么?与数据库的事务是否一样
    本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作

    参考文章:

    https://www.cnblogs.com/WJ-163/p/6023054.html
    https://www.cnblogs.com/fjdingsd/p/5273008.html

  • 相关阅读:
    损失函数及其梯度
    激活函数及其梯度
    梯度下降简介
    误差计算
    输出方式
    全连接层
    测试(张量)- 实战
    数据加载
    高阶操作
    java网络基础知识的简述
  • 原文地址:https://www.cnblogs.com/kangxinxin/p/10727348.html
Copyright © 2011-2022 走看看