深入解析Java的Spring框架中的混合事务与bean的区分
这篇文章主要介绍了Java的Spring框架中的混合事务与bean的区分,Spring是Java的SSH三大web开发框架之一,需要的朋友可以参考下
混合事务
在ORM框架的事务管理器的事务内,使用JdbcTemplate执行SQL是不会纳入事务管理的。
下面进行源码分析,看为什么必须要在DataSourceTransactionManager的事务内使用JdbcTemplate。
1.开启事务
DataSourceTransactionManager
protectedvoiddoBegin(Objecttransaction,TransactionDefinitiondefinition){
DataSourceTransactionObjecttxObject=(DataSourceTransactionObject)transaction;
Connectioncon=null;
try{
if(txObject.getConnectionHolder()==null||
txObject.getConnectionHolder().isSynchronizedWithTransaction()){
ConnectionnewCon=this.dataSource.getConnection();
if(logger.isDebugEnabled()){
logger.debug("AcquiredConnection["+newCon+"]forJDBCtransaction");
}
txObject.setConnectionHolder(newConnectionHolder(newCon),true);
}
txObject.getConnectionHolder().setSynchronizedWithTransaction(true);
con=txObject.getConnectionHolder().getConnection();
IntegerpreviousIsolationLevel=DataSourceUtils.prepareConnectionForTransaction(con,definition);
txObject.setPreviousIsolationLevel(previousIsolationLevel);
//Switchtomanualcommitifnecessary.ThisisveryexpensiveinsomeJDBCdrivers,
//sowedon''twanttodoitunnecessarily(forexampleifwe''veexplicitly
//configuredtheconnectionpooltosetitalready).
if(con.getAutoCommit()){
txObject.setMustRestoreAutoCommit(true);
if(logger.isDebugEnabled()){
logger.debug("SwitchingJDBCConnection["+con+"]tomanualcommit");
}
con.setAutoCommit(false);
}
txObject.getConnectionHolder().setTransactionActive(true);
inttimeout=determineTimeout(definition);
if(timeout!=TransactionDefinition.TIMEOUT_DEFAULT){
txObject.getConnectionHolder().setTimeoutInSeconds(timeout);
}
//Bindthesessionholdertothethread.
if(txObject.isNewConnectionHolder()){
TransactionSynchronizationManager.bindResource(getDataSource(),txObject.getConnectionHolder());
}
}
catch(Exceptionex){
DataSourceUtils.releaseConnection(con,this.dataSource);
thrownewCannotCreateTransactionException("CouldnotopenJDBCConnectionfortransaction",ex);
}
}
doBegin()方法会以数据源名为Key,ConnectionHolder(保存着连接)为Value,将已经开启事务的数据库连接绑定到一个ThreadLocal变量上。
2.绑定连接
publicstaticvoidbindResource(Objectkey,Objectvalue)throwsIllegalStateException{
ObjectactualKey=TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);
Assert.notNull(value,"Valuemustnotbenull");
Map |
|