Spring事务的使用
Spring事务的使用
基于注解(重要)
在Spring Boot中,@Transactional
注解用于声明式事务管理。它可以被放置在类或方法上,以便为特定的业务逻辑定义事务边界。以下是在Spring Boot项目中使用@Transactional
注解的详细说明:
1. 启用事务支持
在Spring Boot应用中启用基于注解的事务管理,通常需要在配置类上添加 @EnableTransactionManagement
注解。在Spring Boot中,由于自动配置的存在,如果已经引入了如spring-boot-starter-data-jpa
或者 spring-boot-starter-data-jdbc
等数据访问相关的起步依赖,且数据库连接池和事务管理器配置正确,那么事务管理会自动开启。
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableTransactionManagement
public class Application {
// ...
}
2. 使用@Transactional注解
a. 类级别注解
将 @Transactional
放置在类级别上意味着该类所有公共可见(非私有)的方法都将参与到事务中。不过需要注意的是,对于类内部调用,即同一个类内的方法互相调用时,事务可能不会生效,因为此时调用绕过了代理机制。
@Transactional
@Service
public class UserService {
public void updateUser(User user) {
// 这个方法会在一个事务中执行
}
// 其他业务方法...
}
b. 方法级别注解
更细粒度的控制可以通过在具体方法上添加 @Transactional
来实现。只有标注了此注解的方法才会在其执行过程中作为一个事务单元。
@Service
public class UserService {
@Transactional
public void updateUserInTx(User user) {
// 这个方法将在一个事务中执行
// 若其中发生异常,则整个事务将会回滚
}
// 未标注@Transactional的方法则不受事务控制
public void nonTransactionalMethod() {
// ...
}
}
c. 注解属性
-
readOnly:设置为
true
时,指示事务只读,这样可能会获得更好的数据库性能优化。@Transactional(readOnly = true) public void findUsers() { // 只读操作,例如查询 }
-
rollbackFor 和 noRollbackFor:指定哪些异常会导致事务回滚,哪些不导致事务回滚。
@Transactional(rollbackFor = Exception.class) public void updateWithExceptionHandling(User user) { // 如果在此方法中抛出Exception或其子类异常,事务将回滚 }
-
propagation:定义事务的传播行为,例如是否新建事务、是否挂起当前事务等,前文已详述了七种不同的传播行为。
@Transactional(propagation = Propagation.REQUIRES_NEW) public void operationInNewTransaction() { // 新建一个独立于当前事务的新事务 }
3. 注意事项
-
代理机制:
@Transactional
的生效依赖于AOP代理,因此确保注解所在类由Spring容器管理,并且是通过代理方式调用的。如果直接通过new关键字创建对象实例并调用方法,事务是不会生效的。 -
检查点:对于嵌套事务的支持(PROPAGATION_NESTED),需要数据库支持保存点(Savepoint)功能。
-
私有方法与内部类:Spring AOP代理默认不会处理私有方法和静态方法上的事务注解,同样,内部类的方法也不会被代理处理,所以这些方法上的事务注解不会生效。
-
事务隔离级别:可以通过
isolation
属性来指定事务的隔离级别,如 READ_COMMITTED、REPEATABLE_READ 等。
总之,在Spring Boot应用中使用@Transactional
注解进行事务管理,能极大地简化事务控制代码,让开发者专注于业务逻辑实现,同时提供了灵活的方式来配置事务的行为。
基于XML(了解)
在Java开发中,XML配置和注解方式是两种常见的配置应用程序的方式,特别是在Spring框架中。以下是一份关于在Spring框架中XML配置与注解方式的用法对比示例:
XML配置方式
1. 定义Bean
<bean id="myService" class="com.example.MyServiceImpl">
<!-- 配置依赖注入 -->
<property name="dependency" ref="anotherBean"/>
</bean>
<bean id="anotherBean" class="com.example.AnotherBean"/>
这里通过<bean>
标签定义了两个Bean,并通过<property>
标签实现依赖注入。
2. 事务管理配置
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="myTransactionalService" class="com.example.TransactionalService" />
<aop:config>
<aop:pointcut id="serviceMethods" expression="execution(* com.example.TransactionalService.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
<--
<tx:method name=""/> 详情具体配置
propagation 传播行为, REQUIRED:必须;REQUIRES_NEW:必须是新的
isolation 隔离级别
-->
</tx:attributes>
</tx:advice>
这里使用了Spring的AOP以及事务相关的标签来配置事务管理器,并通过切点表达式指定哪些方法需要进行事务控制。
3. 自动装配
<context:component-scan base-package="com.example"/>
<context:annotation-config/>
启用组件扫描和自动装配注解,这样Spring会自动发现并处理类上的@Autowired
、@Component
等注解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!