事务(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)");
  }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号