- @Transactional 注解事务
发生异常事务回滚:
@Override
@Transactional
public boolean insertEmployee(EmployeeTo employeeTo) {
employeeMapper.insert(employeeTo);
try {
updateEmployee(employeeTo);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
@Transactional
public boolean updateEmployee(EmployeeTo employeeTo) {
employeeMapper.updateById(employeeTo);
throw new MyException("更新操作失败");
// return true;
}
此处发生异常:新增用户还是会插入到数据库中,虽然,更新操作抛出了异常,但是还是会更新,事务不会回滚,此时的注解事务是失效的。还是回更新用户的数据。类似的注解像是异步任务注解@async 。为了不影响线程的执行,采用异步任务。
- Spring 解决方案
Spring 配置文件 XML 新增如下语句, 先开启cglib 代理, exposeProxy = true 暴露代理对象。
<aop:aspectj-autoproxy expose-proxy ="true" />
//或者
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
使用AopContext 获取当前对象的动态代理。
AopContext.currentProxy()
主类开启cglib代理:
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
-----------------------------------------
@Override
@Transactional
public boolean insertEmployee(EmployeeTo employeeTo) {
employeeMapper.insert(employeeTo);
try {
EmployeeService context = (EmployeeService)AopContext.currentProxy();
context.updateEmployee(employeeTo);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
@Transactional
public boolean updateEmployee(EmployeeTo employeeTo) {
employeeTo.setEmail("mail");
employeeMapper.updateById(employeeTo);
throw new MyException("更新操作失败");
// return true;
}
通过获取代理对象去实现增强。来实现事务,回滚。