问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何解决spring bean通过this访问实例方法时@Transactional失效

发布网友 发布时间:2022-04-14 08:40

我来回答

2个回答

懂视网 时间:2022-04-14 13:01

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
	

?

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

?

?

?

?

?

热心网友 时间:2022-04-14 10:09

Spring中的事务是以*方式织入到业务代理对象中的,如果业务对象两个方法a,b都配置了事务属性,而在a方法实现中又调用b方法,则b方法声明的事务会在本次调用中不生效。

解决的办法就是在a方法中不使用this.b()的方式调用方法b,而是从Spring容器中通过一种方式来获得业务代理对象,然后在代理对象上面调用它的b方法。这样b方法声明的事务就会有效啦。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
街头篮球手游中锋攻略汇总 C位攻略大全 街头篮球手游中锋有什么技巧 中锋C技巧详解 php一个表单提交数据怎么区分开,隐藏域可以吗,如果可以怎么用。 梦见牙掉光了什么预兆 梦见牙齿掉完了是什么征兆 梦见牙齿全掉了是什么预兆 梦见一口牙全部掉了是什么预兆 教师年度考核不认课的领导班子成员,干的工作不少,怎样考核办法公平... 湖北省郧西县义务教育学校绩效工资实施办法绩效工资总量和水平的... 事业单位年底是否有绩效奖金的 dell外星人笔记本可以换显卡么 果冻月饼怎么做 鲜果果冻爽怎么做 怎么做果冻? 缅甸玉镯子空间 桂花藕果冻怎么做 果酱桂花怎么做? 如何酿造高度米酒 果冻怎么做好吃,果冻的吃法 桂花冻要怎么做桂花才不会沉淀?谁能给我桂花冻的做法?我要蒟蒻果冻粉的... 请问,公安系统可以查出来离婚吗? 哪种蜥蜴的头最大 诺基亚,三星,步步高老款手机哪款手机有自动报时? 大家知道“科摩多龙”是如何被人们发现的吗? 请问有没有可以语音报时的手机?(注:非整点报时) 原神巨蜥怎么解锁 皮,加部首,组成新字有哪些越多越好 皮字旁的字大全 科莫多巨蜥属于那类动物? 有“皮”字旁的字有哪些? 皮偏旁的字有哪些 物业费收取标准2015是多少 打算集体起诉腾讯,该如何操作? 请问可以起诉腾讯吗? 怎样才可以起诉腾讯(马化腾)?能成功吗? 判断用户输入的文本框是否为数字或者字符串? JAVA中如何判断一个输入是数字还是字符串 乐清堂冻干粉修复痘坑有效吗? ACA烤箱加热管问题 关于ACA烤箱的问题 c++中哪个函数是判断用户输入为字符还是数字的函数 c++怎样识别用户输入的是数字或字符数组? C语言中怎么判断用户输入的是字符还是数值??? java判断字符串是不是数字类型 怎样看微博排名?微博排名有哪些指标?在哪里可以系统学习网络营销? spring 事务注解 不回滚 C语言中清屏函数是什么? C语言如何清空屏幕 客家的那种酿菜,把某种青菜卷起来的叫酿什么 C语言程序设计中如何清屏? 你知道酿菜除了酿豆腐,酿苦瓜,还能酿什么吗