开发者社区> 问答> 正文

spring durid 事务无论怎么配置都是失败! - java报错

spring 的配置:

扫描配置:


<context:component-scan base-package="com.karting">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
配置数据库源:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"  p:url="${jdbc.url}"  p:username="${jdbc.username}"  p:password="${jdbc.password}"  p:maxActive="${jdbc.maxActive}"  p:initialSize="${jdbc.initialSize}"  p:minEvictableIdleTimeMillis="${jdbc.minEvictableIdleTimeMillis}"  p:testOnBorrow="${jdbc.testOnBorrow}"  p:testWhileIdle="${jdbc.testWhileIdle}"  p:validationQuery="${jdbc.validationQuery}"  p:removeAbandoned="${jdbc.removeAbandoned}"  p:removeAbandonedTimeout="${jdbc.removeAbandonedTimeout}"  p:logAbandoned="${jdbc.logAbandoned}"  p:poolPreparedStatements="${jdbc.poolPreparedStatements}"  p:maxOpenPreparedStatements="${jdbc.maxOpenPreparedStatements}">
</bean>

配置注解事务:



<!-- the PlatformTransactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>
springMVC 的配置(只扫描Controller层):



<context:component-scan base-package="com.karting.controller"/>


Service的调用(Service类上有注解@Transactional):


@Transactional @Service public class AppointmentService {
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void testTransactional() throws Exception{ Appointment appointment = new Appointment();
    appointment.setId(1);
    appointment.setUpdated_by("test"); appointMentDAO.insert(appointment); throw new Exception("测试事务回滚");
}
} 抛出错误后还是插入成功,没有回滚。求各位大神帮忙看下哪里有问题。


我已经排除了:


  1. MariaDB 的数据库引擎情况
  2. 排除了springMVC配置扫描冲突的情况

快崩溃了。。。。


展开
收起
montos 2020-06-02 22:12:17 617 0
1 条回答
写回答
取消 提交回答
  • 你定义一下回滚规则呢,不对再看看######回复 @年少爱追梦 : 不行啊,大神,我完全都照抄了,一个字一个字审查了,还是不行。不论是注解还是声明式######@蒂法娜 http://www.oschina.net/question/2008155_220656,看一下这篇,不行的话,我明天休息的时候也试试######试过了,不行######Spring事务回滚只接受RuntimeException
    ######我试过了切面式的配置,试过了RuntimeException######你手动抛出的异常代码放到dao层insert方法试试######不行,哭######确认数据库引擎,然后确认事务的配置是否正确######嗯,已经确认了数据库引擎,我用的数据库式mariaDB, 引擎是Innodb######

    看下log,看看Connection打开后注册没注册事务,确定下是事务没配上还是没回滚

    或者配下rollbackFor Exception试试

    ######回复 @贱起苍澜 : 这样啊######回复 @蒂法娜 : 你自己封装的jdbc是不是还要自己封装事务啊,我没自己封装过。。要么你等等别的大神回复######回复 @贱起苍澜 : 还是不行。setAutoCommit false,update,操作,insert操作错误,最后还是setAutoCommit true。######回复 @贱起苍澜 : 我这就试试看######回复 @蒂法娜 : 或者你可以试试不用注解声明事务,用拦截器式事务看看能不能回滚######求真相!######整个项目看看?######

    以前也遇到,后来把异常定位到顶级异常类型就解决了,你可以试试:

    <tx:method name="add*" propagation="REQUIRED"  read-only="false"  rollback-for="java.lang.Throwable"/>

    ######好想还是不行######<2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10010} pool-connect
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10010} setAutoCommit false
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-connect
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20016} Parameters : [201635152yhqh1]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20016} Types : [VARCHAR]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20016, rs-50017} query executed. 8.365109 millis. 
    SELECT * FROM Appointment WHERE appointmentNum = ? LIMIT 1
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20016, rs-50017} open
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20016, rs-50017} Header: [id, kartingParkId, appointmentNum, userInfoId, eventId, price, status, updated_at, updated_by, created_at, created_by, expiresIn]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20016, rs-50017} Result: [1, 0, 201635152yhqh1, 2, 3454, 0.00, 0, 2016-04-15 17:35:04.0, , 2016-04-15 17:35:04.0, o4g5lv5Hclc3m29MyYVZeOLEar1o, 900]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20016, rs-50017} closed
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20016} clearParameters. 
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-recycle
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-connect
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20017} Parameters : [1]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20017} Types : [INTEGER]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20017, rs-50018} query executed. 9.60952 millis. 
    SELECT * FROM Appointment WHERE id = ? LIMIT 1
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20017, rs-50018} open
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20017, rs-50018} Header: [id, kartingParkId, appointmentNum, userInfoId, eventId, price, status, updated_at, updated_by, created_at, created_by, expiresIn]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20017, rs-50018} Result: [1, 0, 201635152yhqh1, 2, 3454, 0.00, 0, 2016-04-15 17:35:04.0, , 2016-04-15 17:35:04.0, o4g5lv5Hclc3m29MyYVZeOLEar1o, 900]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.ResultSet] - {conn-10009, pstmt-20017, rs-50018} closed
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20017} clearParameters. 
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-recycle
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-connect
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20018} Parameters : [3454, 2016-04-15 17:35:04.0, o4g5lv5Hclc3m29MyYVZeOLEar1o, 2, 900, 2016-04-15 17:35:04.0, 201635152yhqh1, 0.0, test, 0, 0]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20018} Types : [VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20018} update executed. effort 1. 20.194617 millis. 
    UPDATE Appointment SET eventId = ?, created_at = ?, created_by = ?, userInfoId = ?, expiresIn = ?, updated_at = ?, appointmentNum = ?, price = ?, updated_by = ?, kartingParkId = ?, status = ? WHERE id = 1
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20018} clearParameters. 
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-recycle
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-connect
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20019} Parameters : [3454, 2016-04-15 17:35:04.0, o4g5lv5Hclc3m29MyYVZeOLEar1o, 2, 900, 2016-04-15 17:35:04.0, 201635152yhqh1, 0.0, test, 0, 0]
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20019} Types : [VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR, VARCHAR]
    java.sql.BatchUpdateException: Duplicate entry '201635152yhqh1' for key 'appointmentNum'

    at org.mariadb.jdbc.MariaDbServerPreparedStatement.execute(MariaDbServerPreparedStatement.java:374)
    at org.mariadb.jdbc.MariaDbServerPreparedStatement.executeUpdate(MariaDbServerPreparedStatement.java:347)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2723)
    at com.alibaba.druid.filter.FilterAdapter.preparedStatement_executeUpdate(FilterAdapter.java:1069)
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeUpdate(FilterEventAdapter.java:491)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2721)
    at com.alibaba.druid.filter.FilterAdapter.preparedStatement_executeUpdate(FilterAdapter.java:1069)
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeUpdate(FilterEventAdapter.java:491)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2721)
    at com.alibaba.druid.filter.FilterAdapter.preparedStatement_executeUpdate(FilterAdapter.java:1069)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2721)
    at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeUpdate(PreparedStatementProxyImpl.java:158)
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:253)
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Statement] - {conn-10009, pstmt-20019} clearParameters. 
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10009} pool-recycle
    <2016-05-12 13:15:24> <DEBUG> [druid.sql.Connection] - {conn-10010} setAutoCommit true
    <2016-05-12 13:15:25> <DEBUG> [druid.sql.Connection] - {conn-10010} pool-recycle

    ######
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>



    ######不定义Service 接口,直接作用于类时,要加 proxy-target-class="true"
    2020-06-02 22:12:30
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载