spring开启声明式事务:

  1. 导入依赖:
    pom.xml
<dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><!--spring依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.12.RELEASE</version></dependency><!--单元测试依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency><!-- https://mvnrepository.com/artifact/c3p0/c3p0 --><!--c3p0数据源--><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><!--spring jdbc spring操作数据库--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.3.12.RELEASE</version></dependency></dependencies>

操作数据库需要配置数据源,spring提供的操作数据库的JdbcTemplate创建时需要传入数据源,事务管理器创建时也需要传入数据源,然后将数据源,JdbcTemplate,事务管理器注册到容器中,具体代码如下

  1. 配置类文件
    SpringTxConfig.java
package com.sixteen.tx;import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;
import java.beans.PropertyVetoException;@ComponentScan(basePackages = {"com.sixteen.tx"})//包扫描
@Configuration
@EnableTransactionManagement//开启基于注解的声明式事务
public class SpringTxConfig {//注册数据源@Beanpublic DataSource dataSource() throws PropertyVetoException {ComboPooledDataSource dataSource = new ComboPooledDataSource();dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");dataSource.setPassword("123456");dataSource.setUser("root");dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8");return dataSource;}//注册JdbcTemplate@Beanpublic JdbcTemplate jdbcTemplate() throws PropertyVetoException {//两种方法获取DataSource//1. 直接在方法放置参数 public JdbcTemplate jdbcTemplate(DataSource dataSource)//      默认会去容器中获取//2. 如下: 调用上面的方法//spring对@Configuration类有特殊处理,注册组件的方法多次调用只是在IOC容器中找组件return new JdbcTemplate(dataSource());}//注册事务管理器@Beanpublic PlatformTransactionManager transactionManager() throws PropertyVetoException {return new DataSourceTransactionManager(dataSource());//需要传入dataSource}
}

ps: 我用的mysql是8.0+版本,编写jdbcUrl时至少需要附带时区参数:serverTimezone=Asia/Shanghai
在此之前需要在mysql数据库中建一张普通的User表,如下所示:(id自增)

id name
1 zhangsan
  1. 业务逻辑编写

UserDao.java

package com.sixteen.tx;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.UUID;@Repository
public class UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void insert(){String sql = "INSERT INTO `user`(name) VALUES(?)";String name = UUID.randomUUID().toString().substring(0, 5);jdbcTemplate.update(sql,name);}
}

UserService.java

package com.sixteen.tx;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserDao userDao;@Transactionalpublic void insertUser(){userDao.insert();System.out.println("插入完成");//故意制造错误,使事务生效,进行回滚int i = 10/0;}
}
  1. 测试代码
    SpringTxTest.java
package com.sixteen.test;import com.sixteen.tx.SpringTxConfig;
import com.sixteen.tx.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringTxTest {@Testpublic void testInsert(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringTxConfig.class);UserService service = context.getBean(UserService.class);service.insertUser();}
}

以上就是spring如何用注解方式开启声明式事务,细节之处可能没有讲到,但基本的实现还是有的,若有不足之处望见谅并指出。

spring 注解开启声明式事务相关推荐

  1. 【Spring】spring基于注解的声明式事务控制

    结构 domin package com.itheima.domain;import java.io.Serializable;public class Account implements Seri ...

  2. java版b2b2c社交电商spring cloud分布式微服务(七)springboot开启声明式事务

    java b2b2c 电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经 ...

  3. spring基于注解的声明式事务控制

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  4. Spring的编程式事务声明式事务 基于注解的声明式事务控制

    文章目录 Spring中编程式事务 基于XML的声明式事务控制 基于注解的声明式事务控制 Spring集成web环境 Spring中编程式事务 Spring的事务控制可以分为编程式事务控制和声明式事务 ...

  5. Spring JDBC-使用注解配置声明式事务

    系列 概述 使用Transactional注解 txannotation-driven其他属性 关于Transaction的属性 在何处标注Transactional注解 在方法处使用注解 使用不同的 ...

  6. Spring→事务、隔离级别、事务传播行为、编程式事务控制、XML配置声明式事务(原始方式)、XML配置声明式事务(基于tx/aop)、@注解配置声明式事务、优势总结

    事务 Spring事务管理 不考虑隔离引发问题 隔离级别 事务传播行为 演示环境搭建 编程式事务控制 XML配置声明式事务(原始方式) XML配置声明式事务(基于tx/aop) @注解配置声明式事务 ...

  7. SpringBoot第七篇:springboot开启声明式事务

    springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...

  8. 企业 SpringBoot 教程 (七)springboot开启声明式事务

    springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...

  9. mybatis plus 事务管理器_SpringBoot第七篇:springboot开启声明式事务

    springboot开启事务很简单,只需要一个注解@Transactional 就可以了.因为在springboot中已经默认对jpa.jdbc.mybatis开启了事事务,引入它们依赖的时候,事物就 ...

最新文章

  1. R语言使用pheatmap绘制热力图(数据归一化、行列聚类、注释、文字角度、字体)
  2. 10-Python与设计模式--享元模式
  3. python变量无需指定类型对吗_Python变量类型 - osc_3rgq3dae的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. win32按钮按下不弹起_荣耀亲选智能恒温电热水壶,宝爸冲奶粉再也不做难了
  5. 服务器租用单线、双线、bgp 相比有哪些区别优势?
  6. url 特殊字符 传递参数解决方法
  7. Apache Subversion 1.7.2发布,开源版本控制工具
  8. mysql横向扩展_高可用MySQL学习笔记-面向横向扩展的MYSQL复制
  9. python操作之更新数据库中某个字段的数据
  10. linux中类似append的命令,Linux技巧:介绍 tar 命令打包、压缩、和加解密的用法
  11. 591页22万字城市智慧应急指挥中心信息化设计方案
  12. 如何在excel中输入身份证号
  13. Codeforces1422 F.Boring Queries(根号分治+线段树+可持久化线段树)
  14. (codeforces)D. Cloud of Hashtags
  15. OneNote for win10本地存储文件的备份与查看
  16. 创建MFC对话框Dlg工程项目
  17. 医院双向转诊系统解决方案
  18. Android N BlockedNumberContract原生黑名单(一)
  19. 李群的伴随表示如何理解
  20. 德卡T10读卡器 读取身份证号码和身份证UID

热门文章

  1. Java 后端接收前端的富文本参数,传到后台后标签样式数据丢失
  2. 树莓派开发前的准备工作
  3. Dear ImGui中文文档(一)
  4. 设置iframe自适应高度
  5. React下MarkDown在线预览
  6. C语言实现线索二叉树
  7. Kotlin 协程Flow主要操作符(一)
  8. 用计算机上的窗口造句,窗口造句简单
  9. ubuntu20开启NTP服务器操作步骤
  10. java计算机毕业设计歌唱比赛积分管理系统MyBatis+系统+LW文档+源码+调试部署