@Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED)
时间: 2024-08-16 17:01:57 浏览: 32
这是一个Spring框架中的@Transactional注解,用于控制事务管理。`@Transactional`用于标记需要参与事务的方法或类。这里的配置有两个关键属性:
1. `rollbackFor = Exception.class`: 如果方法运行过程中抛出了标注了`Exception.class`或其子类的异常,那么默认会触发回滚事务(Rollback)。这表示只要遇到非预期的错误情况,就会撤销本次事务的所有更改。
2. `propagation = Propagation.NESTED`: 这意味着当这个事务方法被嵌套在另一个事务中时,它将作为嵌套事务(Nested Transaction)运行。如果外部事务已经存在,那么这个方法会在该外部事务的上下文中运行;如果没有外部事务,则创建一个新的独立事务。
简单来说,这个注解使得异常处理和事务隔离更易于管理。如果希望在特定条件下控制事务的行为,还可以调整其他`Propagation`枚举值,如`REQUIRED`, `REQUIRES_NEW`, 等等。
相关问题
@Transactional(rollbackFor = {Exception.class}) 嵌套导致表死锁
`@Transactional(rollbackFor = {Exception.class})` 是Spring框架中的一个事务注解,它表示如果在处理请求过程中发生任何`Exception.class`类型的异常,那么整个事务应该回滚,即撤消所有在这个事务期间所做的数据库操作。这是为了保证数据的一致性和完整性。
然而,在某些场景下,特别是当事务嵌套(如在一个事务内部开始另一个事务)时,可能会遇到死锁问题。这是因为两个并发事务分别持有对方需要的数据资源,都等待对方释放,这就形成了死锁。例如,事务A锁定了表A,然后尝试获取表B的锁;同时,事务B锁定了表B,试图获取表A的锁。这样的循环等待导致了死锁。
避免这种死锁通常需要遵循一些最佳实践:
1. 避免无必要的事务嵌套,尽量将事务分解到最小粒度的操作。
2. 设置合理的事务隔离级别,如使用较低的隔离级别可以减少死锁发生的可能性。
3. 使用`PROPAGATION_REQUIRED`或`PROPAGATION_NESTED`时,确保子事务依赖于外部事务,并在完成后自动提交。
如果你遇到具体的死锁错误,可以通过查看数据库日志、分析SQL语句和锁定信息来定位问题并解决。
19.下面选项对"@Transactional"描述正确的是() ☆ 【不定项选择】 A.@Transactional(propagation = "设置事务传播行为") B.@Transactional(rollbackFor = "指定回滚类型的异常") C.@Transactional(noRollbackFor = "指定回滚类型的异常") D.@Transactional(value= "设置事务传播行为")
A、B、C、D 都是正确的。
A. @Transactional(propagation = "设置事务传播行为"):用来设置事务的传播行为,常用的传播行为有:REQUIRED(默认值)、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。
B. @Transactional(rollbackFor = "指定回滚类型的异常"):用来设置事务在遇到指定类型的异常时回滚,可以指定多个异常类型。
C. @Transactional(noRollbackFor = "指定不回滚类型的异常"):用来设置事务在遇到指定类型的异常时不回滚,可以指定多个异常类型。
D. @Transactional(value= "设置事务传播行为"):用来设置事务的传播行为,与 A 选项作用相同,只是写法不同。