• Spring事务


    事务有四个特性:ACID

    A:原子性:要么全成功,要么全失败

    C:一致性:所有的操作前后,总额不变

     I :隔离性:事务之间互不影响

    D :持久性:事务一旦完成,无论出现什么错误,他的结果都不受影响

     

     脏读:一个线程读取到另外一个线程未提交的数据                                         A 的数据未commit   B 就不可能读到

    不可重复读:A在一个事务中 两个 query到的数据,由于B中途对数据进行了 update 操作 ,导致前后读取 不一致

    幻读:  查询表中的一条数据不存在,就插入了,高并发的时候,发现之后,竟然插入了两条数据  

    为了保证数据不出错,我们不一定要把数据库的隔离级别设置最高,这样直接限制了系统的并发能力

    单体项目我们可以在程序里加锁,分布式的项目可以使用分布式锁(ZK,Redis)来解决这样的问题

    事务管理器:

    Spring不直接管理事务,而是将这些事务委托给JTA,JDBC、Hibernate、JPA等持久化机制所提供的相关平台来实现

    JDBC事务

    SpringBoot只需引入jdbc.starter 依赖,就自动引入DataSourceTransactionManager

    传播行为

    传播行为,当一个事务方法被另外一个方法调用的时候,必须指定如何进行传播。

    传播行为 含义
    REQUIRED 当前方法必须运行在事务中。如果当前事务存在,方法会在该事务中运行,否则,会启动一个事务
    SUPPORTS 如果当前有事务则加入,如果没有则不用事务
    MANDATORY 支持当前事务,如果当前没有事务,则抛出异常。
    REQUIRED_NEW 支持当前事务,如果当前有事务,则挂起当前事务,然后新创建一个事务,如果当前没有事务,则自己创建一个事务。
    NOT_SUPPORTED 忽略当前事务
    NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。(当前必须不能有事务)
    NESTED 如果当前存在事务,则嵌套在当前事务中。如果当前没有事务,则新建一个事务自己执行(和required一样)。嵌套的事务使用保存点作为回滚点,当内部事务回滚时不会影响外部事物的提交;但是外部回滚会把内部事务一起回滚回去。(这个和新建一个事务的区别)

     。。。。

  • 相关阅读:
    C#中将结构类型数据存储到二进制文件中方法
    常用的20个在线工具类网站清单
    PyQt:开发小工具
    PyQt:使用QtDesigner设计界面
    经营策略
    Xmind 8 update 9 破解
    AI: 百度AI实战教学
    DRF:djangorestframework从入门到精通
    python:requests库发送参数+文件
    python:关于postman中生成的基于requests库的接口代码
  • 原文地址:https://www.cnblogs.com/Jemb/p/11596914.html
Copyright © 2020-2023  润新知