spring 注解如何开启声明式事务
作者:很懒的十六 发布时间:2023-04-09 23:07:42
标签:spring,注解,声明式,事务
spring开启声明式事务
导入依赖
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,事务管理器注册到容器中
具体代码如下:
配置类文件
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 {
//注册数据源
@Bean
public 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
@Bean
public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
//两种方法获取DataSource
//1. 直接在方法放置参数 public JdbcTemplate jdbcTemplate(DataSource dataSource)
// 默认会去容器中获取
//2. 如下: 调用上面的方法
//spring对@Configuration类有特殊处理,注册组件的方法多次调用只是在IOC容器中找组件
return new JdbcTemplate(dataSource());
}
//注册事务管理器
@Bean
public PlatformTransactionManager transactionManager() throws PropertyVetoException {
return new DataSourceTransactionManager(dataSource());//需要传入dataSource
}
}
ps: 我用的mysql是8.0+版本,编写jdbcUrl时至少需要附带时区参数:serverTimezone=Asia/Shanghai
在此之前需要在mysql数据库中建一张普通的User表,如下所示:(id自增)
id | name |
---|---|
1 | zhangsan |
业务逻辑编写
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 {
@Autowired
private 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 {
@Autowired
private UserDao userDao;
@Transactional
public void insertUser(){
userDao.insert();
System.out.println("插入完成");
//故意制造错误,使事务生效,进行回滚
int i = 10/0;
}
}
测试代码
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 {
@Test
public void testInsert(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringTxConfig.class);
UserService service = context.getBean(UserService.class);
service.insertUser();
}
}
来源:https://blog.csdn.net/six_teen/article/details/109411463
0
投稿
猜你喜欢
- 前言这篇博客介绍Java环境的配置,主要是安装JDK,以及path、JAVA_hOME、CLASSPAT的配置,还会介绍配置这些的原因。一.
- 我就废话不多说了,大家还是直接看代码吧~package com.cloudtech.web.util; import java.io.Buf
- Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下:LockPatternView.javapackage com.
- 在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为。如果在编写代码时不能理解引用类型和值类型的区别,那
- @RequestBody,@RequestParam和@Param区别@Param@Param是mybatis中的注解,用注解来简化xml配
- 解析:CLR支持两种类型:值类型和引用类型。用Jeffrey Richter(《CLR via C#》作者)的话来说,“不理解引用类型和值类
- 本文实例讲述了WPF中的ListBox实现按块显示元素的方法。分享给大家供大家参考,具体如下:注意:需要设置ListBox的属性 Scrol
- 绝大部分知识与实例来自O'REILLY的《Java网络编程》(Java Network Programming,Fourth Edi
- 一、简介Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止。官方的解释比较乏味,通俗的说就是创建一个子线程,给它加了这
- 一、PriorityQueue的数据结构JDK7中PriorityQueue(优先级队列)的数据结构是二叉堆。准确的说是一个最小堆。二叉堆是
- 1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate--> onStart
- 1.问题描述在我引入SpringCloud-gateway,运行时报错如下:org.springframework.beans.factor
- @Autowired和static的关系一、发生的场景好几次有个同事因为把static用到Spring的@Autowired上,导致注入的对
- 本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决。1 上传数据的处理进度跟踪2 进度数据在用户页面的显示就这么2个问题,第一
- java 并发线程个数的确定本文从控制变量的角度来谈决定线程个数的依据。模型很简单,在实际的生产环境中,情况肯定比下文要复杂的多。要充分的进
- map此内容是方便博主自己记忆内容,不用于公开学习资料,若发现语法错误,自行更正,勿喷map转JSON字符串package com.hanf
- Spring的事务隔离级别和事务的传播行为是面试中经常考察的问题,做个简单的总结。传播行为在SpringBoot中通过Transaction
- 在开发android的应用中,有时候需要限制横竖屏切换。只需要在AndroidManifest.xml文件中加入android:screen
- 传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets
- 前言之前学习的顺序表查询非常快,时间复杂度为O(1),但是增删改效率非常低,因为每一次增删改都会元素的移动。可以使用另一种存储方式-链式存储