事务是逻辑上的一组操作,要么都执行,要么不执行。

事务能否生效数据库引擎是否支持事务的关键。比如常用的mysql数据默认的使用支持事务innodb引擎。但是,数据引擎变为mysiam,那么程序也就不再支持事务了。

事务特性(ACID):

原子性:事务是最小的执行单位,不允许分割。要不全部成功,要不全部回滚。

一致性:事务执行前后,数据保持一致。

隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰。也就是说多个事务并发执行时,一个事务的执行不影响其他事务的执行。

持久性:一个事务被提交后。他对数据的改变是持久的,即使数据发生故障也不应该对其有任何影响。

编程式事务管理

@TransactionTemplate或者@TransactionManger手动管理事务。应用很少

声明式事务管理

使用@Transactional

@Transactional(propagation=propagation.PROPAGATION_REQUIRED)
public void aMethod {//do somethingB b = new B();C c = new C();b.bMethod();c.cMethod();
}

PlatformTransactionManager: (平台)事务管理器,Spring 事务策略的核心。

TransactionDefinition: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)。

TransactionStatus: 事务运行状态。

TransactionDefinition.ISOLATION_DEFAULT :使用后端数据库默认的隔离级别,MySQL 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别.

TransactionDefinition.ISOLATION_READ_UNCOMMITTED :最低的隔离级别,使用这个隔离级别很少,因为它允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

TransactionDefinition.ISOLATION_READ_COMMITTED : 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

TransactionDefinition.ISOLATION_REPEATABLE_READ : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

TransactionDefinition.ISOLATION_SERIALIZABLE : 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

@Transactional注解详细使用

作用范围:

方法:推荐将注解使用于方法上,不过需要注意的是:该注解只能应用到public方法,否则不生效。

类:如果使用这个注解在类上,表明该注解对该类中所有的public方法都生效。

接口:不推荐

常用参数配置

@Transactional(propagation = Propagation.REQUIRED,timeout = 60000,isolation = Isolation.DEFAULT,readOnly = false,rollbackFor = Exception.class)

public String getInfo(){

return "wangyunzhao";

}

@Transactional 的使用注意事项总结

@Transactional 注解只有作用到 public 方法上事务才生效,不推荐在接口上使用;

避免同一个类中调用 @Transactional 注解的方法,这样会导致事务失效;

正确的设置 @Transactional 的 rollbackFor 和 propagation 属性,否则事务可能会回滚失败

Spring 事务中哪几种事务传播行为?

支持当前事务的情况:

  • TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)

不支持当前事务的情况:

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况:

  • TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

Spring事务--笔记相关推荐

  1. spring 事务笔记(四)

    spring 事务笔记(四) 文章目录 spring 事务笔记(四) spring 事务原理简述 声明式事务 1. 注解方式 配置事务管理器 开启事务并使用 2.xml配置方式 配置事务管理器 配置事 ...

  2. Spring-学习笔记10【Spring事务控制】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  3. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  4. Spring学习笔记十七---事务的转播行为

    为什么80%的码农都做不了架构师?>>>    spring 事务注解 默认遇到throw new RuntimeException("...");会回滚 需要捕 ...

  5. 学习笔记(Spring事务管理)

    maven中导入的依赖 学习时时候用的,所以就用的spring提供的orm组件 <dependencies><!--springioc--><dependency> ...

  6. 同一事务多次加for_Synchronized锁在Spring事务管理下,为啥还线程不安全?

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 大年初二,朋友问了我一个技术的问题(朋友实在是好学, ...

  7. spring学习笔记06-spring整合junit(出现的问题,解决的思路)

    spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...

  8. 【Java从0到架构师】Spring - 事务管理

    事务管理 声明式事务 propagation - 设置事务传播行为 read-only - 告诉数据库该事务只读 timeout - 超时抛出异常 rollback-for.no-rollback-f ...

  9. 【Spring 持久层】Spring 事务开发、事务属性详解

    持久层 事务回顾 Spring 事务编程开发 Spring 中的事务属性(Transaction Attribute) 隔离属性(ISOLATION) 传播属性(PROPAGATION) 只读属性(r ...

最新文章

  1. ESP32检测调制激光信号程序优化
  2. 【Java】Eclipse输入命令行参数的方法
  3. java定时任务_ftp上传软件,ftp上传软件定时功能教程
  4. spring cloud 调用接口间歇性返回http 500 - Internal Server Error的错误
  5. 面试前你需要掌握的二叉树、二叉排序树的创建和四种遍历方式
  6. ssh协议是osi_你见过这份864页神仙级的TCP/IP协议吗?,太香了!
  7. 【读书笔记】终极算法
  8. 如何写网站建设策划书
  9. 一名淘宝店长运营店铺靠谱指南
  10. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-Arrays(数组)
  11. C#--解析DataMatrix二维码
  12. 基于matlab的通信系统仿真的本科论文,基于MATLAB的TDM通信系统仿真设计.docx
  13. web--拉灯泡切换黑天与白夜的精美动画
  14. Javascript的图片滚动浏览效果代码
  15. 苹果电脑打不出中文逗号句号
  16. 调通sina33m下的GC0308(分色排版)V1.0
  17. android字库使用
  18. mysql服务启动超时,更新pid文件失败(亲测实用)
  19. 响应头Content-Type与Content-Disposition的区别
  20. SCCM客户端ccmcache文件夹清除和修改及Installer文件夹大小问题

热门文章

  1. docker 镜像名 tag 为none 的解决方案
  2. markdown 画图
  3. Python3学习笔记(urllib模块的使用)
  4. windbg 脚本命令实例
  5. C语言中,#include 和#include 的区别和注意点
  6. Linux内核分析 - 网络[四]:路由表
  7. python无法打开excle_无法打开Excel fi
  8. leetcode221 Maximal Square
  9. python计算出nan_python如何进行汇总统计?
  10. ocx js php,JS实现OCX控件的事件响应示例_javascript技巧