spring 事务管理让我费解的地方

ou7705312 2015-01-23 11:51:25
在用spring mvc时,用到了spring事务管理
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"><value>${jdbc.driver}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
<property name="maxActive"><value>${maxActive}</value></property>
<property name="maxWait"><value>${maxWait}</value></property>
<property name="maxIdle"><value>${maxIdle}</value></property>
<property name="removeAbandoned"><value>${removeAbandoned}</value></property>
<property name="removeAbandonedTimeout"><value>${removeAbandonedTimeout}</value></property>
<property name= "validationQuery"><value>${validationQuery}</value></property>
<property name= "defaultAutoCommit"><value>true</value></property>
</bean>
<!-- 配置Jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务管理器 p:dataSource-ref="dataSource" />-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethods" expression=" execution(* app.com.*.service..*.*(..))" />*
<aop:advisor pointcut-ref="serviceMethods" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="edit*" propagation="REQUIRED" rollback-for="Exception" />
<tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="batchUpdate" propagation="REQUIRED" rollback-for="Exception"/>
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
上面事务配置我理解的意思是:通过spring aop配置让工程service包下的所有以add、edit、save、update等开头的方法对其自动的事务提交、回滚
在service包下有个方法我是这样写的:
package app.com.test.service;

@Repository
public class TestServiceImpl implements TestService {
@Autowired
private TestJdbcDAO testJdbcDAO;
public void saveTest() throws Exception{
String sql1="insert into ATTACHINFO(id,name) values(1,'test1')";
testJdbcDAO.update(sql1);
String sql2="insert into ATTACHINFO(id1,name) values(2,'test2')";//错误sql语句
testJdbcDAO.update(sql2);
}
执行这个方法中,sql1是正确的,sql2是错误的,执行完在数据库中看到第一条数据插入进去了。我理解的是两条数据都不会入库,会进行事务回滚。
这挺让我费解的,求大神指教
...全文
467 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wasdasdfqwer 2015-02-08
  • 打赏
  • 举报
回复
很明显,实际中都是在xml中配置事物
ou7705312 2015-02-08
  • 打赏
  • 举报
回复
引用 17 楼 crazypandariy 的回复:
Spring的事务没有问题,既然不起作用,只能是你的配置有问题!对于这一串execution,对照着Spring官网配置,能出问题吗? 另外,都啥年代了,还用这种方式来配置事务! 建议使用注解方式配置事务,简单、快捷、灵活!
注解?你确定spring注解配置事务比这种aop的方式更加方便?这个我到是不赞同!
ou7705312 2015-02-08
  • 打赏
  • 举报
回复
虽然没有得到具体是什么原因,但还是非常感谢大家的帮助,这个问题本人已经解决了;原因是因为我这里是用来spring mvc ,在配spring 注解的时候出现问题如下: 在主容器中(applicationContext.xml),将Controller的注解排除掉 在springMVC配置文件中将Service注解给去掉 (我之前没加这个) <context:component-scan base-package="com"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan> 因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。 还有一种方式是将service层改用xml配置,其实这样做也是变相的让springmvc无法扫描service,而只能依赖父窗口也就是ServletContextListener来进行初始化,这样同样被赋予了事务性。
疯狂熊猫人 2015-02-08
  • 打赏
  • 举报
回复
Spring的事务没有问题,既然不起作用,只能是你的配置有问题!对于这一串execution,对照着Spring官网配置,能出问题吗? 另外,都啥年代了,还用这种方式来配置事务! 建议使用注解方式配置事务,简单、快捷、灵活!
ou7705312 2015-02-08
  • 打赏
  • 举报
回复
引用 15 楼 jiiiang400 的回复:
扫描包的配置execution(* app.com.*.service..*.*(..))改为execution(* app.com.*.service..*(..))试试,是不是多了一层
改成你这样也没用啊
化身天 2015-01-30
  • 打赏
  • 举报
回复
扫描包的配置execution(* app.com.*.service..*.*(..))改为execution(* app.com.*.service..*(..))试试,是不是多了一层
51show 2015-01-30
  • 打赏
  • 举报
回复
如果事务配置成功的话,方法里两条insert都不会成功执行的,是不是 扫描包的问题?在 spring 和 springMVC 配置文件中,扫描包是怎么配置的?还有 web 容器启动的时候,这两个配置文件的加载顺序是怎样的?
ou7705312 2015-01-29
  • 打赏
  • 举报
回复
引用 9 楼 whos2002110 的回复:
断点到TransactionInterceptor类的invoke方法,再执行saveTest确认aop配置是否正确
没进入断点; <aop:pointcut id="serviceMethods" expression=" execution(* app.com.*.service..*.*(..))" />* 对应扫描包package app.com.test.service;应该没问题吧;还需要配置什么?
ou7705312 2015-01-29
  • 打赏
  • 举报
回复
引用 10 楼 Gu31415 的回复:
是不是顺序写反了。。tx和aop
不是顺序写反了的问题的
ou7705312 2015-01-29
  • 打赏
  • 举报
回复
引用 8 楼 baohuan_love 的回复:
在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。 Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。 Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
那把defaultAutoCommit设置为false后,在代码中每次保存操作都要用commit方法,那么配置tx aop的的增强事务有什么作用?
  • 打赏
  • 举报
回复
是不是顺序写反了。。tx和aop
whos2002110 2015-01-27
  • 打赏
  • 举报
回复
断点到TransactionInterceptor类的invoke方法,再执行saveTest确认aop配置是否正确
  • 打赏
  • 举报
回复
在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。 Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。 Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
lywangbadan 2015-01-26
  • 打赏
  • 举报
回复
rollback-for="Exception" 去掉
野树林 2015-01-23
  • 打赏
  • 举报
回复
你第一次update的时候是一个完整的事务,执行完后就commit了,第二次update时是一个新的事务,和第一个事事务完全没关系
ou7705312 2015-01-23
  • 打赏
  • 举报
回复
引用 4 楼 boybaozi 的回复:
maek一下看看 其实我配置的就是都回滚,等大神,
你怎么配置的,让它们都回滚
boybaozi 2015-01-23
  • 打赏
  • 举报
回复
maek一下看看 其实我配置的就是都回滚,等大神,
ou7705312 2015-01-23
  • 打赏
  • 举报
回复
引用 1 楼 aazbc 的回复:
你第一次update的时候是一个完整的事务,执行完后就commit了,第二次update时是一个新的事务,和第一个事事务完全没关系
那配置了spring事务管理有什么用?我把这个配置去掉,还是以上的结果
ou7705312 2015-01-23
  • 打赏
  • 举报
回复
那配置了spring事务管理有什么用?我把这个配置去掉,还是以上的结果

67,513

社区成员

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

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