atomikos分布式事务在Spring请求下无效

Lindpe 2015-06-10 10:50:01
ChargeDepositAction.java

@Controller
@RequestMapping("chargeDeposit")
public class ChargeDepositAction {
public void addChargeDeposit(HttpServletResponse response) {
try {
// ChargeDeposit chargeDeposit = HtGson.fromDecodeJson(depositJson, ChargeDeposit.class);
// chargeDeposit.setDepositId(UUIDGenerate.generate());

ChargeDeposit chargeDeposit = new ChargeDeposit();
chargeDeposit.setDepositId(UUIDGenerate.generate());
chargeDeposit.setFeeItemId("1");
chargeDeposit.setTreeCode("1000000001");
chargeDeposit.setAmount(new BigDecimal(100));
chargeDeposit.setCollectFeeMode("1");
chargeDeposit.setReceiptNo("12345");
chargeDeposit.setRemark("上山打老虎");
chargeDeposit.setCreateUser("00002");

int result = chargeDepositService.addChargeDeposit(chargeDeposit);
if (result > 0) {
HttpResponseUtils.outSuccessJson(response, String.valueOf(result));
} else {
HttpResponseUtils.outErrorJson(response, String.valueOf(result));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


ChargeDepositServceImpl.java

@Service
@Transactional
public class ChargeDepositServceImpl implements IChargeDepositService {

/**
* 新增
*
* @param chargeDeposit
* @return
*/
@Override
public int addChargeDeposit(ChargeDeposit chargeDeposit) {
int result = chargeDepositMapper.addChargeDeposit(chargeDeposit);
if (result > 0) {
// 生成日志
ChargeDepositLog chargeDepositLog = ChargeDepositLog.copy(chargeDeposit);
chargeDepositLog.setDepositLogId(UUIDGenerate.generate());
chargeDepositLog.setRemark(chargeDeposit.getRemark());
chargeDepositLog.setCreateUser(chargeDeposit.getCreateUser());
return chargeDepositLogMapper.addChargeDepositLog(chargeDepositLog);
}
return 0;
}
}


Spring XML

<!-- 加载jdbc配置文件 -->
<context:property-placeholder location="classpath:config/jdbc.properties"/>

<!-- 扫描所有com.ht包下的注解 -->
<context:component-scan base-package="com.ht.wy"/>

<!-- Atomikos父数据源,所有数据源均要集成该Bean -->
<bean id="atomikosParentDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close" abstract="true">
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="100"/>
<property name="borrowConnectionTimeout" value="30"/>
<property name="testQuery" value="select 1"/>
<property name="maintenanceInterval" value="60"/>
</bean>

<!-- 物业核心文件配置 -->
<bean id="wycoreDataSource" parent="atomikosParentDataSource">
<property name="uniqueResourceName" value="wycoreDataSource"/>
<property name="xaDataSourceClassName" value="${wycore.jdbc.driver}"/>
<property name="xaProperties">
<props>
<prop key="url">${wycore.jdbc.url}</prop>
<prop key="user">${wycore.jdbc.username}</prop>
<prop key="password">${wycore.jdbc.password}</prop>
</props>
</property>
</bean>

<bean id="wycoreSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="wycoreDataSource"/>
<property name="configLocation" value="classpath:config/mybatis/mybatis.xml"/>
<property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ht.wy.*.dao"/>
<property name="sqlSessionFactoryBeanName" value="wycoreSqlSessionFactory"/>
</bean>

<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp" init-method="init" destroy-method="shutdownForce">
<constructor-arg>
<props>
<prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
</props>
</constructor-arg>
</bean>

<!-- Atomikos分布式事务实现配置 -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false"/>
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService">
<property name="transactionTimeout" value="300"/>
</bean>

<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager"/>
<property name="userTransaction" ref="atomikosUserTransaction"/>
</bean>

<!-- 注解加载的事务 -->
<tx:annotation-driven transaction-manager="jtaTransactionManager"/>


单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:config/wyservice_context.xml")
@Controller
public class ChargeDepositServceImplTest {
@Test
public void testAddChargeDeposit() throws Exception {
ChargeDeposit chargeDeposit = new ChargeDeposit();
chargeDeposit.setDepositId(UUIDGenerate.generate());
chargeDeposit.setFeeItemId("1");
chargeDeposit.setTreeCode("1000000001");
chargeDeposit.setAmount(new BigDecimal(100));
chargeDeposit.setCollectFeeMode("1");
chargeDeposit.setReceiptNo("12345");
chargeDeposit.setCreateUser("00002");
// chargeDepositService.addChargeDeposit(HtGson.toJson(chargeDeposit),null);
}
}



atomikos事务在Junit单元测试中一切正常,可以正确回滚
但是使用SpringMVC发送页面请求后,atomikos事务就失效了
请问有大神遇到过吗,真不知道Junit和SpringMVC请求有什么区别
...全文
381 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
午夜知秋123 2017-11-23
  • 打赏
  • 举报
回复
主要异常处理的问题:springMVC的异常被你当前的程序捕获了,Junit的是把异常抛出了;可以把MVC的异常手动抛出来。 try { // ChargeDeposit chargeDeposit = HtGson.fromDecodeJson(depositJson, ChargeDeposit.class); // chargeDeposit.setDepositId(UUIDGenerate.generate()); ChargeDeposit chargeDeposit = new ChargeDeposit(); chargeDeposit.setDepositId(UUIDGenerate.generate()); chargeDeposit.setFeeItemId("1"); chargeDeposit.setTreeCode("1000000001"); chargeDeposit.setAmount(new BigDecimal(100)); chargeDeposit.setCollectFeeMode("1"); chargeDeposit.setReceiptNo("12345"); chargeDeposit.setRemark("上山打老虎"); chargeDeposit.setCreateUser("00002"); int result = chargeDepositService.addChargeDeposit(chargeDeposit); if (result > 0) { HttpResponseUtils.outSuccessJson(response, String.valueOf(result)); } else { HttpResponseUtils.outErrorJson(response, String.valueOf(result)); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("操作失败"); } 可以试试
月光冷锋 2017-05-21
  • 打赏
  • 举报
回复
我也是这个问题,
yj541748285 2016-02-24
  • 打赏
  • 举报
回复
我也是遇到这个问题呢。事务没有效果

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧