数据库事务注解@Transactional使用时的注意事项

1. 抛出受查异常XXXException,事务会回滚。

2. 抛出运行时异常NullPointerException,事务会回滚。

3. Quartz中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。

4. 异步任务中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。

5. 在action中加上@Transactional,不会回滚。切记不要在action中加上事务。

6. 在service中加上@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。

7. 在service中的private加上@Transactional,事务不会回滚。

注意:

1. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。

2. @Transactional注解最好都放在方法前面,不要直接修饰类,必要的方法才是用数据库事务,查询这类操作也加事务会影响数据库操作效率

3. 使用@Transactional修饰的方法,直接被调用,事务才会起作用,如果被间接调用,事务注解不会起作用的。

4.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。

### 回答1: 如果一个方法使用了@Transactional注解,但是其内部的一些数据库操作不回滚,这是因为事务可能已经被标记为回滚,或者存在抛出异常导致事务回滚。你可以捕获这个异常并在代码中进行处理,以避免事务回滚。此外,您也可以通过使用 try-catch 块并在 catch 块中手动回滚事务来解决此问题。 ### 回答2: 在Spring框架中,@Transactional注解用于标记一个方法开启事务处理。当一个方法被注解为@Transactional,Spring会在该方法执行之前开启一个事务,在方法执行结束根据方法的执行结果选择性地提交或回滚事务。 然而,@Transactional注解默认只对未经检查的异常进行回滚,对于检查的异常(即被声明为throws的异常)或者在方法内部捕获并处理的异常,默认是不会回滚事务的。因此,如果在方法内部存在数据库操作失败但未抛出未经检查的异常,事务将不会回滚。 为了解决这个问题,可以使用rollbackFor属性来指定需要回滚的异常类型。例如,如果想要在方法内部遇到任何异常都回滚事务,可以使用@Transactional(rollbackFor = Exception.class)。 另外,在某些情况下,如果方法在调用其他带有@Transactional注解的方法,对于内部的数据库操作是否回滚也会受到影响。如果调用的方法本身已经开启了事务并成功提交,那么调用方法的事务也不会回滚,即使调用方法内部的数据库操作失败。 总之,@Transactional注解在方法内部对于数据库操作是否回滚有一些注意事项。要确保在需要回滚的情况下正确地使用异常处理和设置rollbackFor属性,以便实现事务的正确回滚。 ### 回答3: @TransactionaI注解是Spring框架中的事务注解,用于管理事务。当一个方法被@Transactional注解标记,Spring会为该方法开启一个事务,如果方法执行过程中发生异常,则事务会回滚,将数据库状态恢复到方法执行前的状态。但是,有我们可能需要在一个方法内部执行多个数据库操作,并且只希望其中一部分操作发生异常回滚,而不是全部回滚。 为了实现这个需求,我们可以在方法内部手动控制事务边界,使用编程式事务管理。首先,需要在方法上添加@Transactional(rollbackFor = Exception.class)注解来声明一个事务,并指定需要回滚的异常类型。 接下来,我们可以通过编写try-catch语句块来捕获可能发生异常的代码块,并在catch块中执行回滚操作。具体步骤如下: 1. 方法开始前,使用PlatformTransactionManager的getTransaction()方法获取当前事务。 2. 调用TransactionStatus的beginTransaction()方法来开始事务,并将返回的事务状态保存到局部变量中。 3. 在try语句块中执行需要事务管理的数据库操作。 4. 如果发生异常,将事务状态设置为回滚状态。 5. 最后如果存在事务,通过TransactionStatus的commit()或rollback()方法提交或回滚事务。 这样,我们就可以控制事务的范围并选择性地回滚异常。但是需要注意的是,手动控制事务会增加代码复杂性,并且需要确保在事务处理期间不会出现竞争条件或不一致的状态。 总之,@Transactional注解是用于管理事务注解,通过编程式事务管理可以实现方法内部部分数据库操作不回滚的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值