-
关于spring嵌套事务不能回滚问题,求帮助5
这个是第一个service代码
public class BaseService
{
private BaseDAOImp dao;
private TransactionTemplateUtils templateUtils;
private UserService userServiceImpl;
public void addUser(final Users user)
{
templateUtils.call(new ITransactionManager(){
@Override
public Users doInTransaction() throws CharException
{
dao.insert("user_space.insertUsers", user);
userServiceImpl.deleteUser(user.getLoginid());
return null;
}
});
}
public void setDao(BaseDAOImp dao)
{
this.dao = dao;
}
public void setTemplateUtils(TransactionTemplateUtils templateUtils)
{
this.templateUtils = templateUtils;
}
public void setUserServiceImpl(UserService userServiceImpl)
{
this.userServiceImpl = userServiceImpl;
}
}
这个是第2个service代码在第一个service里面调用了,并抛出了一个自定义异常
public class UserService
{
private BaseDAOImp dao;
private TransactionTemplateUtils templateUtils;
public void deleteUser(final String loginId)
{
templateUtils.call(new ITransactionManager(){
@Override
public Users doInTransaction() throws CharException
{
throw new CharException("aaaa");
}
});
}
public void setDao(BaseDAOImp dao)
{
this.dao = dao;
}
public void setTemplateUtils(TransactionTemplateUtils templateUtils)
{
this.templateUtils = templateUtils;
}
}
这个是自己写的一个事务管理类注入了TransactionTemplate中间的doInTransaction是自己写的一个接口回调
public class TransactionTemplateUtils
{
private TransactionTemplate transactionTemplate;
@SuppressWarnings( "unchecked" )
public boolean call(final ITransactionManager manager)
{
return (Boolean) transactionTemplate.execute(new TransactionCallback(){
@Override
public Object doInTransaction(TransactionStatus status)
{
Object result;
try
{
result = manager.doInTransaction();
}
catch (CharException e)
{
result = false;
throw new RuntimeException(e.getMsgContext(), e);
}
return result;
}
});
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate)
{
this.transactionTemplate = transactionTemplate;
}
}
applicationContext.xml配置文件是这样定义的
<bean id="iBatisDaoSupport"
class="org.springframework.orm.ibatis.support.SqlMapClientDaoSupport"
abstract="true">
<property name="sqlMapClientTemplate" ref="sqlMapClientTemplate" />
</bean>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="txManager" />
</bean>
<bean id="templateUtils" class="net.sy599.yaolaiye.dao.impl.TransactionTemplateUtils">
<property name="transactionTemplate" ref="transactionTemplate" />
</bean>
<bean id="baseService" class="net.sy599.yaolaiye.test.service.BaseService">
<property name="dao" ref="baseDAOImp"></property>
<property name="templateUtils" ref="templateUtils"></property>
<property name="userServiceImpl" ref="userService"></property>
</bean>
<bean id="userService" class="net.sy599.yaolaiye.test.service.UserService">
<property name="dao" ref="baseDAOImp"></property>
<property name="templateUtils" ref="templateUtils">
</property>
</bean>
<bean id="baseDAOImp" class="net.sy599.yaolaiye.test.dao.impl.BaseDAOImp">
<property name="sqlMapClient" ref="sqlMapClient"></property>
</bean>
请问为什么第二个service抛除了异常怎么数据库里面的数据不回滚啊。。。请帮忙解答下问题2012年5月11日 13:09
目前还没有答案
相关推荐
嵌套事务允许独立于外部事务的回滚,但在外部事务回滚时,嵌套事务也会回滚。 #### 五、总结 通过上述分析,我们可以看出Spring中的事务传播行为提供了丰富的选项,可以帮助开发者精确地控制事务的执行逻辑。正确...
因此,为了确保事务回滚,你需要在`catch`块中重新抛出异常,或者在`finally`块中显式调用手动回滚的方法。特别要注意,如果`try-catch`块包含在`finally`中且在`finally`中有返回操作,那么catch中的异常会被返回...
当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...
- `NESTED`:如果当前存在事务,则在嵌套事务内运行;如果没有事务,则行为类似于`REQUIRED`。 Spring事务管理的隔离级别包括: - `DEFAULT`:使用数据库的默认隔离级别。 - `READ_UNCOMMITTED`:最低隔离级别,...
springboot mybatis多数据源加事务嵌套 事务之间的调用 回滚 亲测可用 定义2个库分别建立 CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) ...
4. **嵌套事务的深度**:理论上,你可以无限嵌套事务,但实际应用中应避免过深的嵌套,因为它可能导致性能问题,并增加代码的复杂性。 5. **事务隔离级别**:Nested事务继承了父事务的隔离级别,所以不需要额外设置...
7. **PROPAGATION_NESTED**:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则行为类似PROPAGATION_REQUIRED。 在`springTranscationDemo`中,我们可能会看到如何通过设置不同的传播行为来控制事务的...
- `NESTED`:如果当前存在事务,则在嵌套事务内运行;如果不存在,则行为类似`REQUIRED`。 3. **事务回滚规则**: - 默认情况下,只有在未捕获的`RuntimeException`或`Error`抛出时,Spring才会回滚事务。对于受...
这些传播行为可以帮助我们处理嵌套事务和其他复杂的事务场景。 另外,事务的隔离级别也是需要考虑的重要因素。Spring支持四种隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,它们...
- NESTED:如果当前存在事务,则在嵌套事务内执行;若无,则按REQUIRED行为处理。 #### 2.3 事务隔离级别 事务隔离级别是指并发事务间如何共享数据。Spring支持五种隔离级别: - READ_UNCOMMITTED:最低级别,可能...
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么...
7. **PROPAGATION_NESTED**:如果当前存在活动事务,则在嵌套事务中运行;如果没有活动事务,则按`PROPAGATION_REQUIRED`执行。这种传播行为仅对`DataSourceTransactionManager`有效。 #### 三、数据库隔离级别 ...
如果不存在,则抛出异常)、REQUIRES_NEW(总是创建一个新的事务,如果当前存在事务,则暂停)、NOT_SUPPORTED(总是运行在非事务上下文中,如果当前存在事务,则暂停)、NEVER(如果当前存在事务,则抛出异常)、...
本文将深入探讨"spring+mybatis的声明式事务"这一主题,帮助你理解并掌握这一核心技术。 1. **Spring事务管理** Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制...
当我们谈论"A类B类C类嵌套事务问题相关类"时,这通常涉及到在Java编程环境中处理事务的一系列类或者方法。Java中的事务管理主要用于确保数据的一致性和完整性,即使在系统出现故障或异常情况下也是如此。 在Java中...
NEW(新建事务,如果已存在则挂起)、NOT_SUPPORTED(不支持事务,如果存在则挂起)、NEVER(永不运行在事务中)、NESTED(如果存在事务,则在嵌套事务内运行,否则新建)。 - 超时(timeout):定义事务可以运行的...
- `NESTED`:如果当前存在事务,则在一个嵌套事务内执行;如果没有事务,则按`REQUIRED`行为执行。 4. **事务的隔离级别** - `READ_UNCOMMITTED`:最低级别,可能导致脏读、不可重复读和幻读。 - `READ_...
默认情况下,任何未捕获的运行时异常都会导致事务回滚。如果希望在特定异常发生时不回滚事务,可以使用`@Transactional(noRollbackFor=SomeException.class)`。 5. **事务的边界**: 事务的边界由@Transactional...
传播行为是事务管理的关键概念,它定义了在一个方法中如何处理嵌套事务。默认的传播行为是REQUIRED,意味着如果已有事务,则加入到当前事务;如果没有,则新建一个事务。 3. **TransactionStatus**: ...