@Service public class PersonServiceImpl implements PersonService { @Autowired PersonDao personDao; @Override @Transactional public boolean addPerson(Person person) { boolean result = personDao.insertPerson(person)>0 ? true : false; return result; } @Override //@Transactional public boolean updatePersonByPhoneNo(Person person) { boolean result = personDao.updatePersonByPhoneNo(person)>0 ? true : false; addPerson(person); //测试同一个类中@Transactional是否起作用 return result; } }
@Service class A{ @Transactinal method b(){...} method a(){ //标记1 b(); } } //Spring扫描注解后,创建了另外一个代理类,并为有注解的方法插入一个startTransaction()方法: class proxy$A{ A objectA = new A(); method b(){ //标记2 startTransaction(); objectA.b(); } method a(){ //标记3 objectA.a(); //由于a()没有注解,所以不会启动transaction,而是直接调用A的实例的a()方法 } }
当我们调用A的bean的a()方法的时候,也是被proxy$A拦截,执行proxy$A.a()(标记3),然而,由以上代码可知,这时候它调用的是objectA.a(),也就是由原来的bean来调用a()方法了,所以代码跑到了“标记1”。由此可见,“标记2”并没有被执行到,所以startTransaction()方法也没有运行。
上一个:镖局电视剧(午马演过的电视)
下一个:Java中线程休眠的方法有几种?