PROPAGATION_REQUIRES_NEW传播方式对于第二个事务,会产生一个全新的Connection来处理.两个连接的操作类似于:
-
Connection con1 = ds.getConnection();
-
con1.setAutoCommit(false
);
-
con1.executeUpdate(sql1);
-
con1.executeUpdate(sql2);
-
...
-
Connection con2 = ds.getConnection();
-
con2.setAutoCommit(false
);
-
con2.executeUpdate(sql1);
-
con2.exeucteUpdate(sql2);
-
...
-
con2.commit();
-
con2.setAutoCommit(true
);
-
con2.close();
-
-
con1.executeUpdate(sqln);
-
...
-
con1.commit();
-
con1.setAutoCommit(false
);
-
con1.close();<pre></pre>
Spring事务管理中事务涉及的变量主要有:
变量在两事务(第一个事务为PROPAGATION_REQUIRED,第二个事务为PROPAGATION_REQUIRES_NEW)创建、执行、完成过程中的变化如下:
第一个事务 |
|
|
|
|
|
|
|
|
TransStatus1 |
|
|
Transaction1 |
|
|
ConnectionHolder1 |
|
|
Transaction |
Transaction1 |
|
ConnectionHolder |
ConnectionHolder1 |
|
SynchronizedWithTransaction |
TRUE |
|
newTransaction |
TRUE |
|
|
|
Connection |
con1 |
|
newSynchronization |
TRUE |
|
resource |
|
|
|
|
suspendedResources |
null |
|
key |
dataSource |
|
Synchronizations |
|
|
savepoint |
null |
|
value |
ConnectionHolder1 |
|
ArrayList1 |
empty |
|
|
|
|
|
|
|
|
|
第二个事务:doGetTransaction |
|
|
|
|
|
Transaction2 |
|
|
|
|
ConnectionHolder |
ConnectionHolder1 |
|
|
|
|
|
|
|
|
|
|
|
doSuspendTransaction |
|
|
|
|
|
Transaction2 |
|
|
SuspendedResourcesHolder1 |
|
|
ConnectionHolder |
null |
|
suspendedSynchronizations |
ArrayList1 |
|
|
|
suspendedResources |
ConnectionHolder1 |
|
resource |
|
|
|
|
null |
|
|
Synchronizations |
|
|
|
|
|
null |
|
|
|
|
|
|
|
|
|
|
doBegin |
|
|
|
|
|
TransStatus2 |
|
|
Transaction2 |
|
|
ConnectionHolder2 |
|
|
Transaction |
Transaction2 |
|
ConnectionHolder |
ConnectionHolder2 |
|
SynchronizedWithTransaction |
TRUE |
|
newTransaction |
TRUE |
|
|
|
Connection |
con2 |
|
newSynchronization |
TRUE |
|
resource |
|
|
|
|
suspendedResources |
SuspendedResourcesHolder1 |
|
key |
dataSource |
|
Synchronizations |
|
|
|
|
value |
ConnectionHolder2 |
|
ArrayList2 |
empty |
|
savepoine |
null |
|
|
|
|
|
|
|
|
|
|
|
|
|
triggerBeforeCommit |
triggerBeforeCompletion |
doCommit:con2.commit |
triggerAfterCompletion |
|
doCleanupAfterCompletion |
|
|
|
|
con2恢复autoCommit与isolationLevel |
|
resource |
|
|
Synchronizations |
|
关闭连接 |
|
null |
|
|
null |
|
|
|
|
|
|
|
|
|
|
resume |
|
|
|
|
已经恢复到第一个事务doBegin刚完成状态 |
|
resource |
|
|
Synchronizations |
|
|
key |
dataSource |
|
ArrayList1 |
empty |
|
value |
ConnectionHolder1 |
|
|
|
|
|
|
|
|
|
|
|
源码:
-
public
void
addEmployee(Employee employee)
throws
SQLException {
-
transactionTemplate.execute(new
TransactionCallback() {
-
public
Object doInTransaction(TransactionStatus ts) {
-
try
{
-
jdbcTemplate.update("INSERT INTO Employee (username,age) VALUES(?, ?)"
,
-
new
Object[]{
"lizi"
,
new
Integer(
22
)});
-
departmentDao.addDepartment();
-
jdbcTemplate.update("INSERT INTO Employee (username,age) VALUES(?, ?)"
,
-
new
Object[]{
"lijun"
,
new
Integer(
55
)});
-
System.out.println("更新成功"
);
-
-
} catch
(Exception ex) {
-
ex.printStackTrace();
-
System.out.println("更新失败"
);
-
ts.setRollbackOnly();
-
}
-
-
return
null
;
-
}
-
});
-
}
-
-
public
void
setTransactionTemplate(
-
TransactionTemplate deptTransactionTemplate) {
-
this
.transactionTemplate = deptTransactionTemplate;
-
deptTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
-
-
DataSourceTransactionManager manager = (DataSourceTransactionManager)deptTransactionTemplate.getTransactionManager();
-
DataSource ds = manager.getDataSource();
-
-
jdbcTemplate = new
JdbcTemplate(ds);
-
}
-
-
public
void
addDepartment() {
-
transactionTemplate.execute(new
TransactionCallback() {
-
-
public
Object doInTransaction(TransactionStatus status) {
-
try
{
-
jdbcTemplate.update("insert into department (dept,deptName) values('IT','IT department')"
);
-
} catch
(Exception ex) {
-
ex.printStackTrace();
-
status.setRollbackOnly();
-
}
-
return
null
;
-
}
-
-
});
-
}
分享到:
相关推荐
- `PROPAGATION_REQUIRES_NEW`:总是新建事务,如果已有事务则挂起。 - `PROPAGATION_SUPPORTS`:如果有事务则参与,无事务则非事务执行。 - `PROPAGATION_NOT_SUPPORTED`:非事务执行,如果已有事务则挂起。 - ...
5. **事务传播行为**:Spring定义了七种事务传播行为,比如PROPAGATION_REQUIRED(默认,若无事务则新建)、PROPAGATION_SUPPORTS(若有事务则加入,否则非事务运行)、PROPAGATION_REQUIRES_NEW(总是新建事务,若...
关于牛客刷题总结全部汇总 ...2. 传播行为意义:PROPAGATION_MANDATORY、PROPAGATION_NESTED、PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED、PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW 等。
4. `Propagation.REQUIRES_NEW`:总是开启一个新的事务,即使当前存在事务,也会挂起当前事务。 5. `Propagation.NOT_SUPPORTED`:不支持事务,如果存在当前事务,就挂起它。 6. `Propagation.NEVER`:不允许在...
在Spring框架中,事务是通过事务管理器来管理的,事务管理器负责事务的提交和回滚。事务可以分为不同的类别,例如平台事务管理器、事务al注解、声明式事务管理、编程式事务管理等。Spring事务的同步机制使用...
- `PROPAGATION_REQUIRES_NEW`:总是新建事务。 - `PROPAGATION_NOT_SUPPORTED`:如果有事务则挂起,以非事务方式运行。 - `PROPAGATION_NEVER`:总是以非事务方式运行,如果当前存在事务则抛出异常。 - `...
19. 事务传播行为:`PROPAGATION_REQUIRED`、`PROPAGATION_SUPPORTS`、`PROPAGATION_NEVER`、`PROPAGATION_NOT_SUPPORTED`和`PROPAGATION_REQUIRES_NEW`是Spring事务管理的传播行为选项。 20. 事务隔离级别:`...
- **PROPAGATION_REQUIRES_NEW**:总是创建一个新的事务,如果已经存在一个事务,则将它挂起。 - **PROPAGATION_NOT_SUPPORTED**:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。 - **PROPAGATION_NEVER...
可以使用Spring的@Transactional注解配合PROPAGATION_REQUIRES_NEW属性,为每个线程创建独立的事务。 4. **读写分离与分布式事务** - **读写分离**:在高并发场景下,可以将读操作和写操作分配到不同的数据库...
17. REQUIRES_NEW事务属性表示创建新的事务,即使在当前事务中,确保新事务独立。 18. 事务失败时,会话Bean的重新初始化通常由容器自动处理,例如回滚事务、恢复到之前状态。 19. 开发JDBC应用,WebLogic Server...
@Transactional(propagation = Propagation.REQUIRES_NEW, value = "transactionManager1") public void serviceMethod1() { // 使用dataSource1执行操作... } @Transactional(propagation = Propagation....
- 事务传播特性包括7种:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。 10. **多数据源事务** - 在多数据源情况下,可以使用`@Transactional`注解的`propagation`属性配合不同的...
在Spring Boot应用中,集成MyBatis作为...在实际项目中,还需要考虑事务管理、异常处理等问题,确保在切换数据源时,事务的一致性和正确性。同时,注意在不同数据源之间进行数据同步或数据隔离,以满足系统的业务需求。
41. **Spring事务传播行为和隔离级别**:如PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW等,隔离级别有READ_UNCOMMITTED等。 42. **IOC与DI**:控制反转(IOC)将对象的创建和依赖关系交给容器管理,依赖注入...