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

  }
}