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. 10.0arcmap切片生成ptk步骤

    注意:在制作之前需要点将图放到原本大小.并且保存一下不然容易造成数据丢失. 1.制作mxd 我们将待发布的数据,鼠标选中,拖入到ArcMap中间区域,单击保存. 可以对layers下面的图层进行改名. ...

  2. MySQL 基础 —— 字符串处理

    1. 字符串截取 MySQL 字符串截取函数 常见的 MySQL 截取函数有: LEFT(), RIGHT(), SUBSTRING(), SUBSTRING_INDEX() SUBSTRING() ...

  3. B3680 吊打xxx 物理???

    看到一道很有意思的题,这个题简直有毒,是一道物理题...好像得用模拟退火...但显然我太弱了不会模拟退火,只能用正交分解暴力... 每次沿着力的方向走一定的距离,假如转头了,则走的步长就减小一点. 不 ...

  4. 从map到hash

    https://zybuluo.com/ysner/note/1175387 前言 这两种技巧常用于记录和去重量少而分散的状态. 都体现了映射思想. \(map\) 我一般是数组开不下时拿这玩意判重. ...

  5. bzoj1895

    fhqtreap 其实fhqtreap只有可持久化之后才用新建节点... reverse和splay一样. //#include<bits/stdc++.h> #include<cs ...

  6. 第2章 安装Nodejs 2-3 Windows下安装Nodejs

    http://nodejs.org

  7. 第2课 Git配置文件的妙用

    2-1 "git config"  指令的用法 文件夹中".git"子文件夹内的config文件的优先权>登录账号的home directory中的.gi ...

  8. TP5.x——聊天列表查询

    前言 查询聊天列表,并返回最后一条聊天记录.这个有一个比较尴尬的点就是,一个是你主动发出的,一个是你接收的. 所以这个SQL会比较长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长 ...

  9. Android检测代理

    1. System.getProperties().remove("http.proxyHost"); System.getProperties().remove("ht ...

  10. HBase里的官方Java API

    见 https://hbase.apache.org/apidocs/index.html