一、事务概念
事务是指作为单个逻辑工作单元执行的一系列操作,所有操作要么全部成功完成,要么全部失败而回滚。在关系型数据库中,事务通常是指一系列的数据操作,比如增删改查等。
二、Spring事务管理器
Spring事务管理器是Spring框架提供的一个事务管理的通用接口。Spring事务管理器可以与多种事务管理机制进行集成,包括JDBC事务、JTA事务和Hibernate事务等。
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource() {
// 创建数据源
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
三、Spring事务传播机制
Spring事务传播机制是指在多个事务方法调用的嵌套情况下,事务如何进行传播。
1、REQUIRED
REQUIRED是Spring默认的事务传播机制。该机制会在当前事务不存在时,创建一个新的事务并在当前事务中执行。在当前事务中调用其他方法时,调用的方法将在当前事务中执行。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// do something
}
2、SUPPORTS
SUPPORTS是指当前调用方法如果已经在事务中,则直接加入该事务,否则以非事务的方式执行。如果调用的方法没有事务,则当前方法也不会创建事务,以非事务的方式执行。
@Transactional(propagation = Propagation.SUPPORTS)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// do something
}
3、MANDATORY
MANDATORY是指当前调用方法必须在一个事务中运行,否则将抛出异常。
@Transactional(propagation = Propagation.MANDATORY)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// do something
}
4、REQUIRES_NEW
REQUIRES_NEW是指当前调用方法必须启动一个新的事务,并在该事务中运行。如果当前存在事务,则将当前事务挂起并创建一个新的事务执行。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
// do something
}
5、NOT_SUPPORTED
NOT_SUPPORTED是指当前调用方法不应该在事务中运行。如果当前存在事务,则将该事务挂起并以非事务的方式执行该方法。
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
// do something
}
6、NEVER
NEVER是指当前调用方法不应该在事务中运行。如果当前存在事务,则抛出异常。
@Transactional(propagation = Propagation.NEVER)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.NEVER)
public void methodB() {
// do something
}
7、NESTED
NESTED是指当前调用方法应该在一个嵌套事务中执行。如果当前不存在事务,则与REQUIRED传播机制相同。如果当前存在事务,则在该事务的嵌套事务中执行。
@Transactional(propagation = Propagation.NESTED)
public void methodA() {
// do something
methodB();
}
@Transactional(propagation = Propagation.NESTED)
public void methodB() {
// do something
}
四、总结
Spring事务传播机制是Spring框架重要的一部分。在实际开发中,应该根据实际情况选择合适的事务传播机制,以保证事务的正确性和完整性。