开发中错误使用Service层

196 阅读1分钟

当一个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。