java - 为什么插入两条相同的记录并且事务不回滚
问题描述
我做了一个javaweb的基础项目,在上面加了spring事务配置,但是没有效果。在此之前,它运行良好。我在网上搜索了很多页面,这些配置与我的相同。
预期的结果是什么都不会插入,但插入了一条记录。
请帮我找出问题所在,谢谢
我的 serviceimpl 路径是:com.lidaning.sys.user.service.UserInfoServiceImpl
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.lidaning.sys.user.service..*.*(..))" />
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
@Override
public void insertUser(UserInfo u) {
u.setId("1");
u.setName("lidaning");
u.setPassword("***");
userInfoDao.insertUser(u);
userInfoDao.insertUser(u); //occur exception
}
解决方案
我明白了原因。因为spring两次加载了serviceBean(spring,springMVC),导致service丢失了事务的特性。当我将控制器与 applicationcontext 分离并将其放入 springMVC 时,它可以工作。
推荐阅读
- boost - 将循环缓冲区与 ASIO 一起使用
- python - 计算一个列的值连续变化n次以上的次数,连同变化,用group by,和pandas中的条件
- jenkins - 如何访问 warnings-ng 插件令牌?
- jenkins - Jenkins 使用运行参数在另一个构建中显示一个构建的显示名称
- c - 在c语言中。为什么似乎 system() 在 printf() 之前被调用?
- spring - Spring WebFlux:巨大的 JSON 数组反序列化性能
- android - 如何找到关键字来抑制 lint 警告
- c++ - C++从派生类中的虚函数调用非虚函数
- typescript - 如何在不指定类型的情况下更新 gremlin 顶点?
- r - 从 r 中的“效果”包中省略序数回归图中的截距线