前段时间看到了一个面试题,考察的是动态代理和事务的机制,正好在整理这部分知识,记录一下,后面可以问别人,哈哈
首先我们定义了一个接口IMyService
和实现
@Service
public class MyServiceImpl implements IMyService {
@Autowired
private UserDao userDao;
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void method1() {
User user = new User();
user.setUsername("method1");
userDao.insert(user);
method2();
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method2() {
User user = new User();
user.setUsername("method2");
userDao.insert(user);
throw new RuntimeException("oops");
}
}
问题:执行下面的方法后,数据库插入了几条记录?
@Service
public class TestManager {
@Autowired
private IMyService myService;
public void test() {
myService.method1();
}
}
答案是0,因为TestManager
调用myService.method1()
是通过动态代理生成的代理对象执行,但是method1
调用method2
时属于方法内部直接调用,不会调用代理类,method2
方法上的@Transactional
也就失效了,在method1
抛出异常后会将两次插入的数据都回滚掉