前提是讨论同一个类中,一般有4中使用场景:
1:外层test1()方法加@Transactional注解,内层调用的test2()方法不加事务注解
2:外层test1()方法加@Transactional注解,内层调用的test2()方法也加事务注解
3:外层test1()方法不加事务注解,内层调用的加事务注解
4:外层test1()方法不加事务注解,内层调用的也不加事务注解
场景一:
@Transactional
public void test1(OrderInfo orderInfo){
// 执行插入操作
orderMapper.insert(orderInfo );
// 执行通知类方法
this.test2(orderInfo );
}
public void test2(OrderInfo orderInfo){
mesgMapper.insert(orderInfo );
}
这种场景下,前提在test1方法的事务生效时,那么对order和mesg表的插入操作,同属于一个事务,要么都成功,要么都失败
场景二:
@Transactional
public void test1(OrderInfo orderInfo){
// 执行插入操作
orderMapper.insert(orderInfo );
// 执行通知类方法
this.test2(orderInfo );
}
@Transactional
public void test2(OrderInfo orderInfo){
mesgMapper.insert(orderInfo );
}
这种场景下,前提在test1方法的事务生效时,那么对order和mesg表的插入操作,test2方法的事务生不生效,结果都是一样,效果同场景一,同属于一个事务,要么都成功,要么都失败
另外:若想使test2方法注解生效,这里不能使用this.的方式调用,需要使用代理类调用 AopContext.currentProxy() ;同时可以使用@Transactional(propagation = Propagation.REQUIRES_NEW)开启新事物
场景三:
public void test1(OrderInfo orderInfo){
// 执行插入操作
orderMapper.insert(orderInfo );
// 执行通知类方法
this.test2(orderInfo );
}
@Transactional
public void test2(OrderInfo orderInfo){
mesgMapper.insert(orderInfo );
}
这种场景下,那么对order和mesg表的插入操作,test2方法的事务失效,不能使用this.的方式调用,需要使用代理类调用 (AopContext.currentProxy() )
场景四:
public void test1(OrderInfo orderInfo){
// 执行插入操作
orderMapper.insert(orderInfo );
// 执行通知类方法
this.test2(orderInfo );
}
public void test2(OrderInfo orderInfo){
mesgMapper.insert(orderInfo );
}
这种场景下,那么对order和mesg表的插入操作,各自执行插入操作后,立马自动提交事务了
至于@Transactional注解原理,我们另外一篇中见~~~