一、事务的定义
在Java中,事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作。当涉及到数据库操作时,事务确保了数据的完整性和一致性,即使在出现故障的情况下也能保证数据的安全。事务的处理通常在数据库管理系统(DBMS)层面进行,但在Java环境中,事务的管理也可以通过编程框架如Spring或Java Transaction API (JTA)来控制。
二、特点
事务具有以下四个主要特性,通常称为ACID特性:
- 原子性(Atomicity):- 事务是一个不可分割的最小工作单元,事务内的所有操作要么全部成功,要么全部失败回滚。
- 一致性(Consistency):- 事务开始之前和结束之后,数据库的完整性约束没有被破坏。这意味着事务的执行不会违反任何规则,如外键约束、唯一性约束等。
- 隔离性(Isolation):- 事务之间相互隔离,一个事务的执行不会受到其他事务的影响。根据不同的隔离级别,事务可以避免脏读、不可重复读和幻读等问题。
- 持久性(Durability):- 一旦事务提交,它对数据库所做的更改将是永久的,即使在系统故障后也应如此。
三、应用场景
事务在Java应用中通常用于以下几种情况:
多表更新:- 当一个业务操作需要同时更新多个表时,使用事务可以确保所有更新要么一起成功,要么一起失败。
复杂业务流程:- 在涉及多个步骤的业务流程中,如果其中一个步骤失败,事务可以回滚到开始状态,避免部分操作完成而部分未完成的情况。
并发控制:- 在高并发环境下,事务可以帮助控制数据的并发访问,防止数据冲突和不一致。
批量操作:- 当需要执行一系列数据库操作时,可以将其封装在一个事务中,减少网络通信次数,提高效率。
安全性:- 事务可以提供一定程度的数据安全保护,例如在银行交易、电子商务支付等场景中,确保资金转移的准确性和安全性。
在Java中,事务的管理可以通过手动的方式使用
Connection
对象的
commit()
和
rollback()
方法,也可以通过Spring框架的声明式事务管理来自动处理事务边界。Spring框架允许通过注解(如
@Transactional
)或XML配置来控制事务的开始和结束,这大大简化了事务的管理。
四:实战配置
Spring Boot各版本对事务管理的开启和配置方式大体上保持了一致性,但具体实现细节和默认行为可能会随版本的更新而略有不同。下面是一些关键点,说明Spring Boot不同版本中事务管理的主要区别:
Spring Boot1.X版本
- 在Spring Boot 1.x版本中,事务管理主要通过Spring的
@EnableTransactionManagement
注解来显式地启用。 - 你需要在配置类中添加
@EnableTransactionManagement
注解,以启动Spring的事务管理功能。 @Transactional
注解用于标记需要事务支持的类或方法。- 通常还需要显式配置事务管理器,例如
DataSourceTransactionManager
,并将其注册到Spring容器中。
启动类配置:
/**
* 启动服务
*/
@SpringBootApplication
@RestController
@EnableTransactionManagement //开启事务
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication .class, args);
}
}
开启全局配置:
package com.config;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import javax.persistence.Transient;
import javax.sql.DataSource;
import java.util.Properties;
/**
* Title: 事务配置类
*/
@Configuration
public class TxConfigBeanName {
@Autowired(required=true)
@Transient
private DataSourceTransactionManager transactionManager;
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// 创建事务通知
@Bean(name = "txAdvice")
public TransactionInterceptor getAdvisor() {
Properties properties = new Properties();
properties.setProperty("add*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("save*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("modify*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("update*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("delete*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("*Delete*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("disable*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("enable*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("handle*", "PROPAGATION_REQUIRED,-ServiceException");
// properties.setProperty("*", "PROPAGATION_REQUIRED,-ServiceException,readOnly");
TransactionInterceptor tsi = new TransactionInterceptor(transactionManager,properties);
return tsi;
}
@Bean
public BeanNameAutoProxyCreator txProxy() {
BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
creator.setInterceptorNames("txAdvice");
creator.setBeanNames("*Service", "*ServiceImpl");
creator.setProxyTargetClass(true);
return creator;
}
}
@Transactional
应用
@Transactional(rollbackFor = Exception.class)
public void save(test vo) {
saveTest(vo);//保存主表
saveItem(vo.getItem());//保存子表
}
Spring Boot 2.x 版本
- Spring Boot 2.x系列进一步增强了自动配置能力,对于事务管理也是如此。
- 默认情况下,如果应用程序使用了Spring Data JPA或其他Spring Data模块,Spring Boot会自动配置
JpaTransactionManager
或相应的事务管理器。 @EnableTransactionManagement
注解在大多数情况下不再是必需的,因为事务管理的自动配置会自动包含它。- 开发者仍然可以在需要的地方使用
@Transactional
注解来控制事务的范围和行为。
开启全局配置:
package com.config;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import javax.persistence.Transient;
import javax.sql.DataSource;
import java.util.Properties;
/**
* Title: 事务配置类
*/
@Configuration
public class TxConfigBeanName {
@Autowired(required=true)
@Transient
private DataSourceTransactionManager transactionManager;
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// 创建事务通知
@Bean(name = "txAdvice")
public TransactionInterceptor getAdvisor() {
Properties properties = new Properties();
properties.setProperty("add*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("save*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("modify*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("update*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("delete*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("*Delete*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("disable*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("enable*", "PROPAGATION_REQUIRED,-ServiceException");
properties.setProperty("handle*", "PROPAGATION_REQUIRED,-ServiceException");
// properties.setProperty("*", "PROPAGATION_REQUIRED,-ServiceException,readOnly");
TransactionInterceptor tsi = new TransactionInterceptor(transactionManager,properties);
return tsi;
}
@Bean
public BeanNameAutoProxyCreator txProxy() {
BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
creator.setInterceptorNames("txAdvice");
creator.setBeanNames("*Service", "*ServiceImpl");
creator.setProxyTargetClass(true);
return creator;
}
}
@Transactional
应用
@Transactional(rollbackFor = Exception.class)
public void save(test vo) {
saveTest(vo);//保存主表
saveItem(vo.getItem());//保存子表
}
五、总结:
以上即为SpringBoot的事务开启、配置与使用方式!对你有所帮助,关注博主或点个赞再走吧!更多资源也可关注微信公众号获取!
版权归原作者 暴躁的大熊 所有, 如有侵权,请联系我们删除。