gpt4 book ai didi

Spring Transactions 不工作(JDBC 和 Tomcat)

转载 作者:行者123 更新时间:2023-11-28 22:42:48 25 4
gpt4 key购买 nike

我正在尝试将 Spring 事务合并到我的项目中,但它们似乎不起作用。我浏览了一些教程和 Spring 文档,对我来说一切似乎都还不错。

我有:1)上下文文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="jdbcTemplate" class="webapp.dataaccess.commons.JdbcTemplateProvider">
<property name="dataSource" ref="dataSource" />
</bean>

<!-- dao section -->

<bean id="modesDao" class="webapp.dataaccess.opcalc.basicdao.CalcModesData">
<property name="jdbc" ref="jdbcTemplate" />
</bean>

<!-- lots of DAO beans defined same way -->

2) 服务器上定义的数据源:

<Resource name="jdbc/calc_webapp" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="password" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/service" defaultAutoCommit = "true" />

3) 最后在一个 DAO bean 中我有这个方法:

@Transactional(propagation=Propagation.REQUIRED)
public Boolean saveFullOrganization(OrganizationLevel org) throws Exception{
Boolean out = true;
try{
Integer adminPermKey = permDao.saveAdminPermissions(org.getPermissions().getAdminPermission());
org.getPermissions().setAdminPermissionKey(adminPermKey);
Integer sellPermKey = permDao.saveSellingPermissions(org.getPermissions().getSellingPermission());
org.getPermissions().setSellingPermissionKey(sellPermKey);
Integer dszPermKey = permDao.saveDszPermissions(org.getPermissions().getDszPermission());
org.getPermissions().setDszPermissionKey(dszPermKey);
Integer reportPermKey = permDao.saveReportingPermissions(org.getPermissions().getReportingPermission());
org.getPermissions().setReportingPermissionKey(reportPermKey);

if(org.getPermissions().getKey()==null){
Integer permissions = permDao.savePermissionsSet(org.getPermissions(), null);
org.setPermissionsKey(permissions);
}
saveOrganizationUnit(org, org.getKey());
}catch(Exception e){
e.printStackTrace();
throw e;
}

return out;
}

流程相当直观 - 方法的第一部分为组织单元准备权限条目(bean permDao 中的每个操作也是事务性的),然后最后调用“saveOrganizationUnit”来完成添加新条目。我假设对于事务管理,如果在该过程中间发生任何异常,那么它的任何数据都不会进入数据库。但是我的测试证明,如果我在“saveOrganizationUnit”操作之前触发人为异常(这会中断整个过程并跳出方法),权限部分无论如何都会落在数据库中。因此,据我所知,事务在我的解决方案中不起作用。

我不确定我应该检查什么以及什么可能是错误的(我有点像 Spring noob,所以如果它很明显,请不要踢)。

最佳答案

@Transactional 的默认行为已定义 as follows :

Any RuntimeException triggers rollback, and any checked Exception does not.

所以,我猜你抛出了一个已检查的异常。如果你想在这种情况下触发回滚,你需要相应地配置@Transactional:

@Transactional(propagation=Propagation.REQUIRED, rollbackFor = Exception.class) ...

关于Spring Transactions 不工作(JDBC 和 Tomcat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22735066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com