0 0

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">
&lt;!-- 默认的数据源配置 -->
&lt;bean id="talent.defaultDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
&lt;property name="driverClassName"
value="${jdbc.default.driverClassName}" />
&lt;property name="url" value="${jdbc.default.url}" />
&lt;property name="username" value="${jdbc.default.username}" />
&lt;property name="password" value="${jdbc.default.password}" />
&lt;/bean>

&lt;!-- 事务配置 -->
&lt;bean id="talent.defaultTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
&lt;property name="dataSource" ref="talent.defaultDataSource" />
&lt;/bean>

&lt;!-- 配置事务特性 -->
&lt;tx:advice id="txAdvice"
transaction-manager="talent.defaultTransactionManager">
&lt;tx:attributes>
&lt;tx:method name="add*" propagation="REQUIRED" />
&lt;tx:method name="save*" propagation="REQUIRED" />
&lt;tx:method name="insert*" propagation="REQUIRED" />
&lt;tx:method name="del*" propagation="REQUIRED" />
&lt;tx:method name="update*" propagation="REQUIRED" />
&lt;tx:method name="main*" propagation="REQUIRED" />
&lt;tx:method name="*" read-only="true" />
&lt;/tx:attributes>
&lt;/tx:advice>

&lt;!-- 配置哪些类的方法需要进行事务管理 -->
&lt;aop:config>
&lt;aop:pointcut id="allManagerMethod"
expression="execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))" />
&lt;aop:advisor advice-ref="txAdvice"
pointcut-ref="allManagerMethod" />
&lt;/aop:config>

&lt;!-- 默认的DaoFactory -->
&lt;bean id="talent.defaultDaoFactory"
class="com.jstrd.talent.dao.DaoFactory">
&lt;constructor-arg value="${jdbc.default.db.dialect}" />
&lt;/bean>

&lt;!-- 默认的SqlMapClient -->
&lt;bean id="talent.defaultSqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
&lt;property name="dataSource" ref="talent.defaultDataSource" />
&lt;property name="configLocation"
value="classpath:talent/ibatis/sql-map-config.xml" />
&lt;!-- 自动加载sql-mapping文件 -->
&lt;property name="mappingLocations">
&lt;value>${ibatis.mappingLocations}&lt;/value>
&lt;/property>
&lt;property name="useTransactionAwareDataSource" value="true">&lt;/property>
&lt;/bean>

&lt;!-- 默认的SqlMapDao -->
&lt;bean id="talent.defaultSqlMapDao"
class="com.jstrd.talent.dao.SqlMapDao">
&lt;property name="sqlMapClient" ref="talent.defaultSqlMapClient" />
&lt;/bean>

&lt;!-- 默认的SqlMapClientTemplate -->
&lt;bean id="talent.defaultSqlMapClientTemplate"
class="org.springframework.orm.ibatis.SqlMapClientTemplate">
&lt;property name="sqlMapClient" ref="talent.defaultSqlMapClient" />
&lt;/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.*(..))"
&lt;strong>问题补充:&lt;/strong>
谢谢kyo100900的回答!我改成InnoDb后,事务还是没控制住,
日志发现sqlMap.update()每次都会
Fetching JDBC Connection from DataSource
然后
Returning JDBC Connection to DataSource

这里可能也有问题?!
&lt;strong>问题补充:&lt;/strong>
换了oracle环境还是一样,我怀疑是配错了

调试发现SqlMapClientTemplate的事务管理器为com.ibatis.sqlmap.engine.transaction.TransactionManager@19f9c7a.跟配置的不一样啊
2008年11月05日 18:14

5个答案 按时间排序 按投票排序

0 0

采纳的答案

需要一个proxyDatasource层包装。
org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
这个你少了应该是。纯粹靠dataSource。。你觉得他怎么设计的出可以支持dao层事务的nb玩意

2008年11月16日 13:24
0 0

配置感觉没问题。

不知道:
delete 是否可以用update, insert 是否可以用update。不知道是否是这个原因。

没试过, 回头试下看看。

2008年11月09日 21:56
0 0

http://jimichan.iteye.com/blog/263898

引用

mysql的数据表是有类型的MyISAM是非事务性表,
把它改成InnoDb类型都就OK了


你是MyISAM吗?

2008年11月07日 12:30
0 0

MyTransactionTemplate根本没有处于事务中啊

2008年11月05日 19:07
0 0

什么数据库?

2008年11月05日 18:29

相关推荐

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    Spring+ibatis 保留ibatis事务的配置

    根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...

    ibatis

    - 事务配置问题(如`spring&ibatis事务配置问题.htm`):整合过程中常见的问题可能涉及到事务的隔离级别、事务超时、回滚规则等,需要正确配置Spring的事务管理器以确保事务正确运行。 3. 文件编码转换: - 在...

    SPRING IBATIS 保留IBATIS事务的配置方式

    根据提供的文件信息,本文将详细解析Spring与iBatis整合时如何保留并使用iBatis事务管理机制,以及如何在应用程序中实现手动控制事务的方法。 ### Spring与iBatis整合 Spring框架是一个全面的企业级应用开发框架,...

    spring+ibatis配置实例

    "spring+ibatis配置实例"这个项目提供了一个完整的开发环境,包含所需的依赖包和标准化的项目结构,对初学者或开发者来说极具价值。 Spring是一个全面的Java应用框架,它提供了依赖注入(Dependency Injection,DI...

    spring+ibatis声明式事务Demo_

    通过这个Demo,开发者可以学习如何在Spring与iBatis集成的环境中配置和使用声明式事务,理解事务的ACID属性(原子性、一致性、隔离性和持久性)如何在实际项目中得到保障。此外,这也是理解和实践Spring AOP以及依赖...

    Spring MVC+Hibernate&Ibatis学习 例子 教程

    Spring MVC、Hibernate和iBatis是Java开发中常用的三大框架,它们在Web应用程序开发中各自承担着不同的职责。本教程将深入探讨这三个框架的核心概念、使用方法以及它们之间的协同工作。 **Spring MVC** 是Spring...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    spring ibatis 配置(包括事务管理)

    7. **AOP事务配置**:接下来,我们需要在Spring中配置AOP事务规则,定义哪些方法需要在事务中执行。通常使用`@Transactional`注解,但要在配置文件中开启注解驱动的事务管理。 ```xml ``` 8. **使用示例**:在...

    spring ibatis整合所需jar包

    7. 事务配置:根据业务需求,配置Spring的事务管理器,如PlatformTransactionManager,以控制事务的边界。 8. 整合测试:编写测试类,通过@Autowired注解注入DAO接口,进行数据库操作的测试,确保Spring和iBatis的...

    spring+ibatis声明式事务Demo

    当我们谈论"spring+ibatis声明式事务Demo"时,我们关注的是如何在Spring框架中利用iBatis实现声明式事务管理。 声明式事务管理是Spring框架提供的一种方便、高效的方式,使得开发者无需手动控制事务的开始、提交、...

    spring与ibatis整合集成实例

    3. **配置文件**:在整合过程中,需要配置两部分:Spring 配置文件(如 `applicationContext.xml`)和 iBATIS 配置文件(如 `sqlMapConfig.xml`)。Spring 配置文件中定义数据源、事务管理器以及 ...

    maven搭建SpringMVC+spring+ibatis

    在SpringMVC+Spring+Ibatis的架构中,多数据源配置是一项重要特性。这允许应用连接到多个数据库,根据业务需求选择合适的数据库进行操作。在Spring中,可以通过DataSourceRouter或AbstractRoutingDataSource实现动态...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    Spring与iBATIS的集成

    2. **配置Spring**:接下来,需要在Spring的配置文件中定义iBATIS的SqlMapClient或SqlSessionFactory Bean,并配置数据源、事务管理器等相关属性。 3. **定义映射文件**:iBATIS的核心在于定义SQL映射文件,这些...

    Struts+Spring+Ibatis示例

    Struts、Spring 和 iBatis 是 Java Web 开发中三个非常重要的开源框架,它们共同构建了一个灵活、可扩展且易于维护的系统架构。这个"Struts+Spring+Ibatis示例"提供了一个基础的整合应用,帮助开发者理解这三者如何...

    Spring struts ibatis Mysql 集成

    5. **配置iBatis**:编写MyBatis的配置文件,包含数据源、事务管理器和Mapper配置。 6. **数据库连接**:创建MySQL数据源,配置JDBC连接字符串,加载必要的SQL脚本初始化数据库。 7. **编写业务逻辑**:在Service层...

    struts+spring+ibatis做的一个增删改查例子

    在本例中,Spring主要负责管理Bean的生命周期,包括Struts中的Action类和iBATIS的SqlMapConfig.xml配置。通过Spring的IoC容器,我们可以实现组件间的松耦合,提高代码的可测试性和可维护性。 **iBATIS** 是一个持久...

Global site tag (gtag.js) - Google Analytics