当一个Controller使用Service层的方法时,如果整个Service层标注有@Transaction,那么它就会开启一个事务,而一个service方法完成后,它就会释放该事务,所以前后insertRole方法是在两个不同的事务中完成的。
@Controller
public class RoleController{
@Autowired
private RoleService roleService = null;
@Autowired
private RoleServiceList roleServiceList = null;
public void errorUseServices(){
Role role = new Role();
role.setRoleName("andreswalker");
role.setNote("方法一");
roleService.insertRole(role);
Role role1 = new Role();
role1.setRoleName("yifan");
role1.setNote("方法二");
roleService.insertRole(role1);
}
}
大家在使用带有事务的Service,当调用的时候,如果不是调用Service方法,Spring会为你创建对应的数据库事务。如果我们多次调用的时候,则不再同一个事务中,这样会造成不同时提交和回滚不一致的问题,我们应该注意整个问题,来避免造成不必要的麻烦。
我们使用try catch语句的时候,Spring的事务流程中,会捕捉到抛出这个异常,进行事务回滚,从而保证减少的库存和交易记录保存的一致性。
记住数据库的四个特性ACID。