1. @Transactional
注解
- 用途:用于声明事务管理,确保数据库操作的一致性。
- 基本用法:可以应用于方法或类上。类级别应用时,所有公共方法默认应用事务管理。
- 传播行为:提供多种传播行为选项,如
REQUIRED
、REQUIRES_NEW
、NESTED
等。 - 隔离级别:可以设置不同的事务隔离级别,如
READ_COMMITTED
、READ_UNCOMMITTED
等。 - 超时与回滚规则:允许设置事务的超时时间和指定哪些异常触发事务回滚。
2. @Async
注解
- 用途:用于实现异步方法调用,提升应用响应速度。
- 基本用法:标记方法在新线程中异步执行。
- 配置支持:需要在配置类中开启异步支持,使用
@EnableAsync
。 - 返回类型:异步方法可以返回
void
、Future
或CompletableFuture
。 - 异常处理:可以通过自定义
AsyncUncaughtExceptionHandler
来处理异步方法中的未捕获异常。
3. @Transactional
和 @Async
一起使用
- 正确使用场景:如用户注册后发送通知,
registerUser
方法中的事务管理不会受到异步执行的sendNotification
方法影响。 - 问题:
- 事务管理失效:
@Async
方法在新线程中执行,无法访问调用线程的事务上下文,导致事务管理失效。 - 异常处理:异步方法中的异常不会直接传播到调用线程,需要通过
Future
或异常处理机制来处理。 - 事务一致性问题:为确保一致性,可采用事件驱动方式,解耦事务操作和异步任务。
- 事务管理失效:
4. 解决方案
- 事件驱动:使用事件发布和监听机制解耦事务操作和异步任务,确保事务提交后再执行异步操作。
5. 综合示例
- 用户注册:
UserService
中的registerUser
方法保存用户并发布事件。 - 事件监听:
UserRegisteredListener
监听事件并异步调用NotificationService
发送通知和LogService
记录日志。 - 确保一致性:通过事件机制确保事务操作和异步任务的解耦。
6. 总结
@Transactional
和@Async
注解可以结合使用,但需要注意事务管理失效、异常处理和事务一致性问题。通过事件驱动可以有效地解决这些问题,提升应用性能和数据一致性。