xml配置
[code="xml"]
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
value="${jdbc.default.driverClassName}" />
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
transaction-manager="talent.defaultTransactionManager">
tx:attributes
/tx:attributes
/tx:advice
aop:config
expression="execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))" />
pointcut-ref="allManagerMethod" />
/aop:config
class="com.jstrd.talent.dao.DaoFactory">
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
value="classpath:talent/ibatis/sql-map-config.xml" />
<!-- 自动加载sql-mapping文件 -->
${ibatis.mappingLocations}
class="com.jstrd.talent.dao.SqlMapDao">
class="org.springframework.orm.ibatis.SqlMapClientTemplate">
[/code]
java代码
[code="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"));
}
}
[/code]
java代码中,连续几个insert,然后两上update,其中一个update是会抛异常的。但是发现前面的insert已经在数据库中生效了,并不回滚
[b]问题补充:[/b]
数据库是mysql5
"MyTransactionTemplate根本没有处于事务中啊"??已经配置在其中了的:
execution(* com.jstrd.talent.manager.MyTransactionTemplate.*(..))"
[b]问题补充:[/b]
谢谢kyo100900的回答!我改成InnoDb后,事务还是没控制住,
日志发现sqlMap.update()每次都会
Fetching JDBC Connection from DataSource
然后
Returning JDBC Connection to DataSource
这里可能也有问题?!
[b]问题补充:[/b]
换了oracle环境还是一样,我怀疑是配错了
[b]问题补充:[/b]
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环境还是一样,我怀疑是配错了
调试发现SqlMapClientTemplate的事务管理器为com.ibatis.sqlmap.engine.transaction.TransactionManager@19f9c7a.跟配置的不一样啊
[b]问题补充:[/b]
"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.跟配置的不一样啊