0

0

spring结合mysql事务注解@Transactional不起作用的有关问题

php中文网

php中文网

发布时间:2016-06-07 16:25:33

|

1761人浏览过

|

来源于php中文网

原创

spring结合mysql事务注解@Transactional不起作用的问题 最近遇到的一个比较诡异的问题,貌似各种配置都正确了,事务不起效。 首先resin服务器的配置文件连接数据库的配置如下: databasejndi-namejdbc/bbs7_app/jndi-namedrivertypecom.mysql.jdbc.jdbc2.opti

spring结合mysql事务注解@Transactional不起作用的问题

最近遇到的一个比较诡异的问题,貌似各种配置都正确了,事务不起效。

首先resin服务器的配置文件连接数据库的配置如下:


		jdbc/bbs7_app
		
				com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
				jdbc:mysql://192.168.74.5:3310/bbs7_pc_app?useUnicode=true&characterEncoding=GBK
				root
				root
		
		
30
		30
		120s
	

?

图可丽批量抠图
图可丽批量抠图

用AI技术提高数据生产力,让美好事物更容易被发现

下载

spring的配置文件配置了注解开启:


		
	
	
	
		  
    

	

?要加事务的public方法也已经加上了注解(注解只对public方法有效)

@Transactional
    public int updateTopicAndGetFloor(User user, Topic topic, Date now) {
    	int floor = 0;
    	if (!topic.isNoUp()) {
            topic.setLastPostAt(now);
        }
        topic.setLastPosterId(user.getUid());
        StringBuilder sql = new StringBuilder("UPDATE ").append(TABLE_NAME).append(
                " SET replyCount=replyCount + 1,  lastPosterId=?").append(
                ", lastPostAt=?, updateAt=?, floor=floor + 1 WHERE tid=?");
        int result = topicXdb.getJdbcTemplate(topic.getFid()).update(topicXdb.xsql(topic.getFid(), sql.toString()),
                topic.getLastPosterId(), topic.getLastPostAt(),
                new Date(), topic.getTid());
        if (result > 0) {
            removeFromCache(topic);
      // throw new RuntimeException("测试事务异常");
            floor = getFloorFromDB(topic);
        }
        return floor;
    }

?但是,手动测试让方法抛出一个RuntimeException的时候,数据没有回滚。

排除了半天,发现mysql的事务是默认提交的,把mysql的全局事务默认提交关闭后,用root权限的用户登录,还是无效(mysql的bug),于是,换成其它一般权限的用户连接,发现还是不行。

听一个牛人同事说,mysql的驱动com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource,不支持事务的,于是换成了com.mysql.jdbc.Driver,所以,数据源驱动配置改为如下:


		jdbc/bbs7_app
		
				com.mysql.jdbc.Driver
				jdbc:mysql://192.168.74.5:3310/bbs7_pc_app?useUnicode=true&characterEncoding=GBK
				bbs7_pc_app
				bbs7_pc_app
		
		
30
		30
		120s
	

?改成这样之后,方法就有了事务控制了,抛异常之后数据可以正常回滚。

?

更正下,com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource这个驱动并不是不支持事务,上面的实验证明,貌似和spring的 jdbcTemplate操作、声明式事务@Transactional有点冲突。如果改用纯的jdbc操作,这个驱动还是支持事务的。

Connection?conn?=?dataSource.getConnection();这样每次都是拿到一个新的连接,事务只在同一个连接里面有效,如果是多个连接,就是分布式事务,要换另一些解决方法。参考这里:

http://www.iteye.com/problems/89655

?

?

?

?

?

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring中文手册
Spring中文手册

共0课时 | 0人学习

马士兵spring视频教程
马士兵spring视频教程

共25课时 | 9万人学习

MongoDB 教程
MongoDB 教程

共17课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号