Spring框架内的PROPAGATION_REQUIRES_NEW实现原理

说到Spring框架内的事务隔离级别,估计没几个人不知道。但就其实现原理(看spring源码的实现方式)都觉得头痛。网上很多源码分析也分析的不错,但个人感觉都没有说到重点。或者换种更让人简单理解的方式。
好了废话不多说。我们来看个例子

      @Transactional
      public void a() {
           //更新数据
            b();
            //...
            //回滚数据             
      }

      @Transactional(propagation = Propagation.REQUIRES_NEW)    
      public void b() {
           //更新数据
      }

大家看到上面的代码块,很容的明白,a方法事务不管是回滚还是提交与b方法互不干涉。同理b方法也是一样
其它的如PROPAGATION_NESTED这种,网上都说了借助于mysql的savepoint。唯独PROPAGATION_NEW说的玄乎。。
网上都说b方法把a方法内的事务给挂起来了。其实怎么挂的,很少有人说。
...
...
这里省略N字
...
...
其实很简单,创建两个连接。
例子如下:

public class TransactionTest {

    @Test
    public void test() throws Exception {
        Connection conn = getConnection();
        conn.setAutoCommit(false);
        Statement statement = conn.createStatement();
        statement.executeUpdate("update test_tl set addr='abc' where id=2");
        transaction2();
        conn.rollback();
    }

    public void transaction2() throws Exception {
        Connection conn = getConnection();
        conn.setAutoCommit(false);
        Statement statement = conn.createStatement();
        statement.executeUpdate("update test_tl set addr='abc' where id=1");
        conn.commit();
    }


    private Connection getConnection() throws Exception {
        String URL = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";
        String NAME = "test";
        String PASSWORD = "test";
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得数据库的连接
        return DriverManager.getConnection(URL, NAME, PASSWORD);
    }
}

这么一说大家就都明白了吧。。呵呵。。。。
不过Spring是开源框架所以就复杂了,不过它的里面用到了大量的ThreadLocal来保存上一个DB链接。
好了,不多说了。说到这里有兴趣的朋友们可以带着问题去看一下Spring AbstractPlatformTransactionManager这个类的getTransaction方法。

原文地址:https://www.cnblogs.com/tywei/p/13674009.html