问题描述
用的SSI框架(Struts2.1.8+Spring2.5+Ibatis2.3.4)将事务的开启定义在了biz层,声明式事务中指定了哪些方法使用读写事务,如果biz中定义的方法与声明式事务中指定的方法名不一致,应该无法增删改的,但结果是仍然能增删改,请高手看看哪里出了问题声明式事务中定义的是save*,而biz里面方法名是insertEmp,以前SSH集成的时候这样写访问会报错数据也插入不进去,但换成SSI之后,就没这个效果了配置如下:Spring配置<beanid="propertiesConfig"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><propertyname="location"value="classpath:conn.properties"></property></bean><beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"><propertyname="driverClassName"value="${driver}"></property><propertyname="url"value="${url}"></property><propertyname="username"value="${user}"></property><propertyname="password"value="${pwd}"></property><propertyname="maxActive"value="10"></property><propertyname="maxIdle"value="5"></property><propertyname="maxWait"value="5000"></property></bean><beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><propertyname="dataSource"ref="dataSource"></property><propertyname="configLocation"value="classpath:SqlMapConfig.xml"></property></bean><beanid="sqlMapTemplate"class="org.springframework.orm.ibatis.SqlMapClientTemplate"><propertyname="sqlMapClient"ref="sqlMapClient"></property></bean><beanid="transManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"></property></bean><tx:adviceid="advice"transaction-manager="transManager"><tx:attributes><tx:methodname="save*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="delete*"propagation="REQUIRED"/><tx:methodname="*"read-only="true"/></tx:attributes></tx:advice><aop:config><aop:pointcutid="point"expression="execution(*com.hr.biz.impl.*.*(..))"/><aop:advisoradvice-ref="advice"pointcut-ref="point"/></aop:config>
biz接口publicinterfaceEmpBiz{publicintinsertEmp(Empemp);}
biz实现类publicclassEmpBizImplimplementsEmpBiz{privateEmpDaoedao;publicvoidsetEdao(EmpDaoedao){this.edao=edao;}publicintinsertEmp(Empemp){returnthis.edao.insertEmp(emp);}}
dao接口publicinterfaceEmpDao{publicintinsertEmp(Empemp);}
dao实现类publicclassEmpDaoImplimplementsEmpDao{privateSqlMapClientTemplatetemplate;publicvoidsetTemplate(SqlMapClientTemplatetemplate){this.template=template;}publicintinsertEmp(Empemp){return(Integer)this.template.insert("insertEmp",emp);}}
注入配置:<beanid="empDao"class="com.hr.dao.impl.EmpDaoImpl"><propertyname="template"ref="sqlMapTemplate"></property></bean><beanid="empBiz"class="com.hr.biz.impl.EmpBizImpl"><propertyname="edao"ref="empDao"></property></bean>
解决方案
解决方案二:
mybatis会自动提交事务,如果要使用你配置的事务管理器还是把方法名改为save*
解决方案三:
建议你使用注解方式的事物管理把<aop:config>和<tx:advice>去掉加入<tx:annotation-driven/>然后把transManager改成transactionManager在需要加入事物管理的方法头上加上@Transactional
解决方案四:
引用1楼nd707355117的回复:
mybatis会自动提交事务,如果要使用你配置的事务管理器还是把方法名改为save*
谢谢,我想知道的是,如何在我原有的写法上改动,从而达到biz方法名和声明式事务中定义方法名不一致无法增删改
解决方案五:
引用2楼littlebrain4solving的回复:
建议你使用注解方式的事物管理把<aop:config>和<tx:advice>去掉加入<tx:annotation-driven/>然后把transManager改成transactionManager在需要加入事物管理的方法头上加上@Transactional
谢谢,我想知道的是,如何在我原有的写法上改动,从而达到biz方法名和声明式事务中定义方法名不一致无法增删改
解决方案六:
检查下你的事物的配置是否被正确纳入系统使用,换就换说,也就是说你的事物没有起作用,你可以检查下比如save方法中抛出异常,看是否事物有回滚,如若回滚则事物配置没问题,反之则你懂得
解决方案七:
楼主我在mybatis3.2spring3.1中测试了的,你这种方式要报错,错误是该事务read-only,不过没在你的版本下面测试
解决方案八:
切面是针对接口的不是实现类你的配置改改就好了execution(**..service.*Service.*(..))