一个有事务的方法,如何让内部调用的方法不回滚
时间: 2024-05-03 09:17:49 浏览: 8
在事务方法中,内部调用的方法默认会参与到当前事务中,并且如果内部方法抛出异常,整个事务会回滚。但是,如果你希望某些内部方法不参与当前事务并且不会导致事务回滚,可以使用Propagation.REQUIRES_NEW属性来实现。
具体实现如下:
1. 在外层事务方法上添加@Transactional注解,指定事务属性为默认值,比如:@Transactional。
2. 在需要独立事务的内部方法上,添加@Transactional注解,并将Propagation属性设置为Propagation.REQUIRES_NEW。
3. 当内部方法被调用时,会启动一个独立的事务,并将当前事务挂起。即使内部方法抛出异常,独立事务也会提交,不回滚外层事务。
示例代码如下:
```java
@Service
public class MyService {
@Autowired
private MyDao myDao;
@Transactional
public void doSomething() {
// 外层事务方法
myDao.update();
doSomethingElse();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingElse() {
// 内部独立事务方法
myDao.insert();
}
}
```
在上面的示例中,外层doSomething方法和内部doSomethingElse方法都使用了@Transactional注解,但是内部方法添加了Propagation属性为Propagation.REQUIRES_NEW,表示需要独立事务。当doSomething方法被调用时,myDao.update()会参与当前事务,然后调用doSomethingElse方法时,会启动一个新的事务,myDao.insert()会参与这个新事务,即使doSomethingElse方法抛出异常,独立事务也会提交,不会回滚外层事务。