Spring框架内的PROPAGATION_REQUIRES_NEW实现原理
说到Spring框架内的事务隔离级别,估计没⼏个⼈不知道。但就其实现原理(看spring源码的实现⽅式)都觉得头痛。⽹上很多源码分析也分析的不错,但个⼈感觉都没有说到重点。或者换种更让⼈简单理解的⽅式。
好了废话不多说。我们来看个例⼦
@Transactional
public void a() {
//更新数据
spring roll怎么读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 = ateStatement();
transaction2();
}
public void transaction2() throws Exception {
Connection conn = getConnection();
conn.setAutoCommit(false);
Statement statement = ateStatement();
connmit();
}
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("sql.jdbc.Driver");
//2.获得数据库的连接
Connection(URL, NAME, PASSWORD);
}
}
这么⼀说⼤家就都明⽩了吧。。呵呵。。。。
不过Spring是开源框架所以就复杂了,不过它的⾥⾯⽤到了⼤量的ThreadLocal来保存上⼀个DB链接。
好了,不多说了。说到这⾥有兴趣的朋友们可以带着问题去看⼀下Spring AbstractPlatformTransactionManager这个类的getTransaction⽅法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。