spring boot 添加事物使用 @Transactional注解

简单使用 在启动类上方添加 @EnableTransactionManagement注解

使用时直接在类或者方法上使用 @Transactional注解

如:

  1. package com.zyc;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.annotation.ComponentScan;
  6. import org.springframework.transaction.annotation.EnableTransactionManagement;
  7. @ComponentScan(value = { "com.zyc" })
  8. @MapperScan("com.zyc.mapper")
  9. @EnableTransactionManagement
  10. @SpringBootApplication
  11. public class App {
  12. public static void main(String[] args) {
  13. SpringApplication.run(App.class, args);
  14. }
  15. }
package com.zyc;

import org.mybatis.spring.annotation.MapperScan;


import org.springframework.boot.SpringApplication;


import org.springframework.boot.autoconfigure.SpringBootApplication;


import org.springframework.context.annotation.ComponentScan;


import org.springframework.transaction.annotation.EnableTransactionManagement;

@ComponentScan(value = { "com.zyc" })


@MapperScan("com.zyc.mapper")



@EnableTransactionManagement

@SpringBootApplication


public class App {

public static void main(String[] args) {</br>
SpringApplication.run(App.class, args);</br>
}</br>

}

使用:直接作用在方法上

  1. @Transactional(rollbackFor=Exception.class)
  2. public void addData2(User user){
  3. userDao.insert(taskInfoTb);
  4. int i=9/0;
  5. }
@Transactional(rollbackFor=Exception.class)

public void addData2(User user){

userDao.insert(taskInfoTb);

int i=9/0;

}

使用时需要注意一下几点

  1. 1.不要在接口上声明 @Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
  2. 2.将 @Transactional  放置在类级的声明中 放在类声明 会使得所有方法都有事务 故 @Transactional应该放在方法级别 不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
  3. 3. 使用了 @Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)
  4. 4.使用了 @Transactional 的方法, 只能是public, @Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。
  5. 5.经过在ICORE-CLAIM中测试,效果如下:
  6. A.抛出受查异常XXXException,事务会回滚。
  7. B.抛出运行时异常NullPointerException,事务会回滚。
  8. C. Quartz中,execute直接调用加了 @Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
  9. D.异步任务中,execute直接调用加了 @Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
  10. E.在action中加上 @Transactional,不会回滚。切记不要在action中加上事务。
  11. F.在service中加上 @Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的)
  12. G.在service中的private加上 @Transactional,事务不会回滚。
1.不要在接口上声明 @Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
2.将 @Transactional 放置在类级的声明中 放在类声明 会使得所有方法都有事务 故 @Transactional应该放在方法级别 不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
3. 使用了 @Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)
4.使用了 @Transactional 的方法, 只能是public, @Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。
5.经过在ICORE-CLAIM中测试,效果如下:
A.抛出受查异常XXXException,事务会回滚。
B.抛出运行时异常NullPointerException,事务会回滚。
C. Quartz中,execute直接调用加了 @Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
D.异步任务中,execute直接调用加了 @Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
E.在action中加上 @Transactional,不会回滚。切记不要在action中加上事务。
F.在service中加上 @Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的)
G.在service中的private加上 @Transactional,事务不会回滚。

如果需要自己定制的事物可以实现TransactionManagementConfigurer接口

spring boot @Transactional事物处理的更多相关文章

  1. 事物Spring boot @Transactional

    事物:dr @Override @UDS(value="fq") @Transactional public BaseResultMessage testTransactional ...

  2. spring boot @Transactional的一个小坑

    同一个类Service下,有两个函数 method_1和 method_2,且method_1内部调用了method_2,那么希望method_2内部意外时,数据库回滚,那么一定要在method_1上 ...

  3. Spring boot @Transactional

    1.注解@Transactional 2.异常回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); @Ov ...

  4. spring boot 中事物的使用

    一.什么是事务? 事务,通俗的说就是,同时做多个事,要么全做,要么不做,也是其特性.举个例子来说,好比你在某宝.某东.某多上购物,在你提交订单的时候,库存也会相应减少,不可能是钱付了,库存不减少,或者 ...

  5. Spring Boot入门系列(十三)如何实现事务

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1 ...

  6. Spring Boot 数据访问集成 MyBatis 与事物配置

    对于软件系统而言,持久化数据到数据库是至关重要的一部分.在 Java 领域,有很多的实现了数据持久化层的工具和框架(ORM).ORM 框架的本质是简化编程中操作数据库的繁琐性,比如可以根据对象生成 S ...

  7. Spring Boot 中使用 @Transactional 注解配置事务管理

    事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...

  8. Spring Boot中使用@Transactional注解配置事务管理

    事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...

  9. 67. @Transactional的类注入失败【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] Spring的代理模式有两种:java自带的动态代理模式和cglib代理模式,cglib代码模式适用于没有接口的类,而java自带适用于接口类,默 ...

随机推荐

  1. luogu1984 [SDOI2008] 烧水问题

    题目描述 给出水的比热容.冰点和沸点,问将$n$杯有$\frac{1}{n}\mathrm{kg}$的水从冰点加热到沸点所需最小热量.不一定相邻的两杯水间可以无热量损失地热传递至两者温度相同. 题解 ...

  2. 【NOI 2014】 动物园

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3670 [算法] KMP [代码] #include<bits/stdc++.h ...

  3. [SpringMVC]定义多个前缀映射的问题

    转自:https://penciltim.iteye.com/blog/501073 我在web.xml里面定义多个dispatch-servlet的前缀映射,像下面这样 <!-- Servle ...

  4. php文件,文件夹

    例子代码:<?php$f='/www/htdocs/index.html';$path_parts = pathinfo($f);echo $path_parts['dirname'], &qu ...

  5. Python 35 线程(1)线程理论、开启线程的两种方式

    一:线程理论 1 什么是线程 进程其实一个资源单位,而进程内的线程才是cpu上的执行单位 线程其实指的就是代码的执行过程2 为何要用线程   线程vs进程     1. 同一进程下的多个线程共享该进程 ...

  6. 利用 Puppet 实现自动化管理配置 Linux 计算机集群

    随着虚拟化和云计算技术的兴起,计算机集群的自动化管理和配置成为了数据中心运维管理的热点.对于 IaaS.Paas.Saas 来说,随着业务需求的提升,后台计算机集群的数量也会线性增加.对于数据中心的运 ...

  7. 最小生成树之Prim算法(最原始最详细入门)

    //算法6.8 普里姆算法 #include <iostream> using namespace std; typedef char VerTexType; typedef int Ar ...

  8. Laravel5.1学习笔记4 控制器

    HTTP 控制器 简介 基础控制器 控制器中间件 RESTful 资源控制器 隐式控制器 依赖注入和控制器 路由缓存 简介 除了在单一的 routes.php 文件中定义所有的请求处理逻辑之外,你可能 ...

  9. react基础篇三

    事件处理 React事件绑定属性的命名采用驼峰式写法,而不是小写. 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) 例如,传统的 HTML: < ...

  10. swift里 as、as!、as?区别 T.Type与动态类型

    as 1.编译器进行类型转换合法性检查:静态 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: shoppingLi ...