tywo56 2008-11-05 18:14
浏览 123

spring&ibatis事务配置问题

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.跟配置的不一样啊

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 有没有帮写代码做实验仿真的
    • ¥15 報錯:Person is not mapped,如何解決?
    • ¥30 vmware exsi重置后登不上
    • ¥15 c++头文件不能识别CDialog
    • ¥15 Excel发现不可读取的内容
    • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
    • ¥20 yolov5自定义Prune报错,如何解决?
    • ¥15 电磁场的matlab仿真