事务(Translation)小结
事务一:
如下,a()上的事务起作用,b()上的事务不会起作用,因为是ATest的同一个代理对象调用b(),
public class ATest { private JdbcTemplate jdbcTemplate; @Transactional public void a(){ System.out.println("事务测试"); jdbcTemplate.execute("insert t1 values(1,1,1,1)"); b(); } @Transactional(propagation=Propagation.NEVER) public void b(){ jdbcTemplate.execute("insert t1 values(2,2,2,2)"); throw new NullPointerException(); } } 类似于:
//此时b()抛出异常,b()上的事务不会起作用,与上面效果等同
public class ATest { private JdbcTemplate jdbcTemplate; public void a(){ System.out.println("事务测试"); //jdbcTemplate.execute("insert t1 values(1,1,1,1)"); b(); } @Transactional public void b(){ jdbcTemplate.execute("insert t1 values(2,2,2,2)"); throw new NullPointerException(); } } 类似于:
public class ATestProxy extends ATest {
private ATest target;
@Transactional
public void a(){
System.out.println("事务测试");
jdbcTemplate.execute("insert t1 values(1,1,1,1)");
target.b();
}
public void b(){
jdbcTemplate.execute("insert t1 values(2,2,2,2)");
throw new NullPointerException();
}
}
如果希望b()上的事务起作用,如下:
public class ATest { private JdbcTemplate jdbcTemplate; private ATest test; @Transactional public void a(){ System.out.println("事务测试"); jdbcTemplate.execute("insert t1 values(1,1,1,1)"); test.b(); } @Transactional(propagation=Propagation.NEVER) public void b(){ jdbcTemplate.execute("insert t1 values(2,2,2,2)"); throw new NullPointerException(); } }
事务二:
a() 和 b()都回滚;此时2个事务都会起作用
public class ATest { private JdbcTemplate jdbcTemplate;
private ATest test; @Transactional public void a(){ System.out.println("事务测试"); //jdbcTemplate.execute("insert t1 values(1,1,1,1)"); test.b(); //等于此处发生异常 } @Transactional(propagation=Propagation.REQUIRES_NEW) //如果a()上面有事务,就新建一个事务 public void b(){ jdbcTemplate.execute("insert t1 values(2,2,2,2)"); throw new NullPointerException(); } }
事务三:
此时,a()回滚, b()能正常执行
public class ATest { private JdbcTemplate jdbcTemplate; private ATest test; @Transactional public void a(){ System.out.println("事务测试"); jdbcTemplate.execute("insert t1 values(1,1,1,1)"); test.b(); throw new NullPointerException(); } @Transactional(propagation=Propagation.REQUIRES_NEW) //如果a()上面有事务,就新建一个事务 public void b(){ jdbcTemplate.execute("insert t1 values(2,2,2,2)"); } }