-
spring&ibatis事务配置问题15
xml配置<!-- 默认的数据源配置 --> <bean id="talent.defaultDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.default.driverClassName}" /> <property name="url" value="${jdbc.default.url}" /> <property name="username" value="${jdbc.default.username}" /> <property name="password" value="${jdbc.default.password}" /> </bean> <!-- 事务配置 --> <bean id="talent.defaultTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="talent.defaultDataSource" /> </bean> <!-- 配置事务特性 --> <tx:advice id="txAdvice" transaction-manager="talent.defaultTransactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="main*" propagation="REQUIRED" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置哪些类的方法需要进行事务管理 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" /> </aop:config> <!-- 默认的DaoFactory --> <bean id="talent.defaultDaoFactory" class="com.jstrd.talent.dao.DaoFactory"> <constructor-arg value="${jdbc.default.db.dialect}" /> </bean> <!-- 默认的SqlMapClient --> <bean id="talent.defaultSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource" ref="talent.defaultDataSource" /> <property name="configLocation" value="classpath:talent/ibatis/sql-map-config.xml" /> <!-- 自动加载sql-mapping文件 --> <property name="mappingLocations"> <value>${ibatis.mappingLocations}</value> </property> <property name="useTransactionAwareDataSource" value="true"></property> </bean> <!-- 默认的SqlMapDao --> <bean id="talent.defaultSqlMapDao" class="com.jstrd.talent.dao.SqlMapDao"> <property name="sqlMapClient" ref="talent.defaultSqlMapClient" /> </bean> <!-- 默认的SqlMapClientTemplate --> <bean id="talent.defaultSqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"> <property name="sqlMapClient" ref="talent.defaultSqlMapClient" /> </bean>
java代码public class MyTransactionTemplate { public void addXX() throws Exception { SqlMapDao dao = DaoFactory.getSqlMapDao(); SqlMapClientTemplate sqlMap = dao.getSqlMapClientTemplate();//dao.getSqlMapClientTemplate();//(SqlMapClientTemplate)BeanFactory.getBean("talent.defaultSqlMapClientTemplate"); sqlMap.update("t_user.delete"); sqlMap.update("t_user.insert", new TUser(29, "tan29")); sqlMap.update("t_user.insert", new TUser(30, "tan30")); sqlMap.update("t_user.insert", new TUser(32, "tan32")); sqlMap.update("t_user.updateById", new TUser(29, "tan30"));//这里违反唯一约束,会抛异常的 sqlMap.update("t_user.updateById", new TUser(29, "tan28")); } }
java代码中,连续几个insert,然后两上update,其中一个update是会抛异常的。但是发现前面的insert已经在数据库中生效了,并不回滚
问题补充:
数据库是mysql5
"MyTransactionTemplate根本没有处于事务中啊"??已经配置在其中了的:
execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))"
问题补充:
谢谢kyo100900的回答!我改成InnoDb后,事务还是没控制住,
日志发现sqlMap.update()每次都会
Fetching JDBC Connection from DataSource
然后
Returning JDBC Connection to DataSource
这里可能也有问题?!
问题补充:
换了oracle环境还是一样,我怀疑是配错了
问题补充:
xml配置
<pre name="code" class="xml">
<!-- 默认的数据源配置 -->
<bean id="talent.defaultDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="${jdbc.default.driverClassName}" />
<property name="url" value="${jdbc.default.url}" />
<property name="username" value="${jdbc.default.username}" />
<property name="password" value="${jdbc.default.password}" />
</bean>
<!-- 事务配置 -->
<bean id="talent.defaultTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="talent.defaultDataSource" />
</bean>
<!-- 配置事务特性 -->
<tx:advice id="txAdvice"
transaction-manager="talent.defaultTransactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="main*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 配置哪些类的方法需要进行事务管理 -->
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="allManagerMethod" />
</aop:config>
<!-- 默认的DaoFactory -->
<bean id="talent.defaultDaoFactory"
class="com.jstrd.talent.dao.DaoFactory">
<constructor-arg value="${jdbc.default.db.dialect}" />
</bean>
<!-- 默认的SqlMapClient -->
<bean id="talent.defaultSqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="talent.defaultDataSource" />
<property name="configLocation"
value="classpath:talent/ibatis/sql-map-config.xml" />
<!-- 自动加载sql-mapping文件 -->
<property name="mappingLocations">
<value>${ibatis.mappingLocations}</value>
</property>
<property name="useTransactionAwareDataSource" value="true"></property>
</bean>
<!-- 默认的SqlMapDao -->
<bean id="talent.defaultSqlMapDao"
class="com.jstrd.talent.dao.SqlMapDao">
<property name="sqlMapClient" ref="talent.defaultSqlMapClient" />
</bean>
<!-- 默认的SqlMapClientTemplate -->
<bean id="talent.defaultSqlMapClientTemplate"
class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="talent.defaultSqlMapClient" />
</bean>
</pre>
java代码
<pre name="code" class="java">
public class MyTransactionTemplate {
public void addXX() throws Exception {
SqlMapDao dao = DaoFactory.getSqlMapDao();
SqlMapClientTemplate sqlMap = dao.getSqlMapClientTemplate();//dao.getSqlMapClientTemplate();//(SqlMapClientTemplate)BeanFactory.getBean("talent.defaultSqlMapClientTemplate");
sqlMap.update("t_user.delete");
sqlMap.update("t_user.insert", new TUser(29, "tan29"));
sqlMap.update("t_user.insert", new TUser(30, "tan30"));
sqlMap.update("t_user.insert", new TUser(32, "tan32"));
sqlMap.update("t_user.updateById", new TUser(29, "tan30"));//这里违反唯一约束,会抛异常的
sqlMap.update("t_user.updateById", new TUser(29, "tan28"));
}
}
</pre>
java代码中,连续几个insert,然后两上update,其中一个update是会抛异常的。但是发现前面的insert已经在数据库中生效了,并不回滚
<strong>问题补充:</strong>
数据库是mysql5
"MyTransactionTemplate根本没有处于事务中啊"??已经配置在其中了的:
execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))"
<strong>问题补充:</strong>
谢谢kyo100900的回答!我改成InnoDb后,事务还是没控制住,
日志发现sqlMap.update()每次都会
Fetching JDBC Connection from DataSource
然后
Returning JDBC Connection to DataSource
这里可能也有问题?!
<strong>问题补充:</strong>
换了oracle环境还是一样,我怀疑是配错了
调试发现SqlMapClientTemplate的事务管理器为com.ibatis.sqlmap.engine.transaction.TransactionManager@19f9c7a.跟配置的不一样啊
问题补充:
"MyTransactionTemplate根本没有处于事务中啊"??已经配置在其中了的:
execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))"
<strong>问题补充:</strong>
谢谢kyo100900的回答!我改成InnoDb后,事务还是没控制住,
日志发现sqlMap.update()每次都会
Fetching JDBC Connection from DataSource
然后
Returning JDBC Connection to DataSource
这里可能也有问题?!
<strong>问题补充:</strong>
换了oracle环境还是一样,我怀疑是配错了
调试发现SqlMapClientTemplate的事务管理器为com.ibatis.sqlmap.engine.transaction.TransactionManager@19f9c7a.跟配置的不一样啊2008年11月05日 18:14
5个答案 按时间排序 按投票排序
-
采纳的答案
需要一个proxyDatasource层包装。
org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
这个你少了应该是。纯粹靠dataSource。。你觉得他怎么设计的出可以支持dao层事务的nb玩意2008年11月16日 13:24
-
配置感觉没问题。
不知道:
delete 是否可以用update, insert 是否可以用update。不知道是否是这个原因。
没试过, 回头试下看看。2008年11月09日 21:56
-
http://jimichan.iteye.com/blog/263898
引用
mysql的数据表是有类型的MyISAM是非事务性表,
把它改成InnoDb类型都就OK了
你是MyISAM吗?
2008年11月07日 12:30
相关推荐
很好的spring+ibatis事务的配置文档.
SPRING与IBATIS整合采用保留IBATIS事务,可自己控制回滚!
spring ibatis 配置spring ibatis 配置spring ibatis 配置spring ibatis 配置
SPRING与IBATIS整合采用保留IBATIS事务,可自己控制回滚!
自己配置的springmvc+ibatis框架,自己找齐了包,不容易啊,所以上来跟大家分享一下,spring自动注入包,事务包,ibatis包,数据库连接包,都齐全的,仅局限于springmvc+ibatis,这些包不多,不少,刚够
NULL 博文链接:https://wilr.iteye.com/blog/1190524
系统采用spring2.5 + ibatis2.3.4,采用注解方式配置,非xml配置方式。包括分页排序查询、新增、修改、删除、登陆验证功能,数据库采用oracle。
最流行技术Struts2.1 +Spring 2.5.1+ibatis2.3整合开发而成,这与我以前发布的版本中最大特色是整合了Spring2.5.1中的注解功能和半自动化工具ibatis技术,这是本示例的两大特色,简化了配置文件的烦锁,希望能给更多喜欢...
这是一个servlet + spring + ibatis 的完整例子,里面包含了spring的事务管理以及所有的jar包,下载下来后直接改下数据库配置就可以运行!从界面到action,业务层,dao层有现成的代码!
这个Project是关于ibatis 和 spring 框架整合的Demo。 需要向大家说明一下几个需要注意的地方: ...2.ibatis和spring的整合主要是spring的配置文件需要配置ibatis的相关配置,如:数据库连接及事务管理等。
耗时3天,对Struts2+Ibatis+...包括Spring3.0的事务配置 OSCache二级缓存的配置 log4j实现输出Sql到控制台 JfreeChart与Struts2,Spring3.0的整合 对一个简单的表实现查询,批量删除,添加,删除 可导入eclipse直接运行
-- 配置那个类那个方法用到事务处理 --> *" read-only="true"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> ...
(8) spring-orm.jar 这个jar文件包含Spring对DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar...
1.4 iBATIS如何解决数据库的常见问题 20 1.4.1 所有权与控制 20 1.4.2 被多个分散的系统访问 21 1.4.3 复杂的键和关系 21 1.4.4 数据模型的去规范化或过度规范化 22 1.4.5 瘦数据模型 23 1.5 小结 24 第2章 iBATIS...
【第八章】 对ORM的支持 之 8.3 集成iBATIS ——跟我学spring3 【第八章】 对ORM的支持 之 8.4 集成JPA ——跟我学spring3 【第九章】 Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3 【第九章】 Spring的...
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 Spring Web 模块:Web 上...
Spring 2.0的'spring-jdo.jar', 'spring-jpa.jar', 'spring-hibernate3.jar', 'spring-toplink.jar' 和 'spring-ibatis.jar' 被合并到Spring 2.5大粒度的'spring-orm.jar'中。 Spring 2.5的 'spring-test.jar' 取代...
2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言...
spring-beans.jar(必须):这 个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI ...