事务(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)");
}
}