• 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方法。

  • 相关阅读:
    servlet的之前与之后的基本使用
    java HashMap插入重复Key值问题
    ConcurrentHashMap底层实现原理(JDK1.7 & 1.8)
    spring cloud实现热加载
    spring cloud各个组件以及概念的解释和基本使用
    深入理解java 虚拟机 jvm高级特性与最佳实践目录
    【leetcode】1、两数之和
    【Java 基础领域】二维数组创建内存图
    【Java EE领域】com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'salary' in 'fi
    【JavaEE领域】com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mp.employee' doesn't exi
  • 原文地址:https://www.cnblogs.com/tywei/p/13674009.html
Copyright © 2020-2023  润新知