多线程测试spring事务隔离级别,发现没有效果啊-问答-阿里云开发者社区-阿里云

开发者社区> a123456678> 正文

多线程测试spring事务隔离级别,发现没有效果啊

2016-03-16 09:31:33 3207 1

闲的无事,就像测试下spring的事务隔离级别是否真的能工作,先说下环境,spring3.1.2,mysql5,innob引擎。mysql配置的隔离级别是read-commit,用的是spring的jdbcTemplate直接操作数据库。

测试逻辑是这样的,两个进程T1,T2向数据库同一字段写入内容。然后通过改变隔离级别来验证spring事务是否有效。

线程T1 线程T2
读取字段name:1111
休眠sleep,模拟业务处理 读取字段name:1111
休眠sleep,模拟业务处理
修改字段name:2222
修改字段name:1111

比如设置为 Isolation.REPEATABLE_READ,我的理解是这样的:T1的事务会对数据表的这行数据加锁,T2可以读取,但写入时需要获取锁,必须等待T1完成之后才能继续操作,但实际情况是T2直接提交了把name字段改为2222。
是不是我的理解有误,还是不能用这种多线程去测试spring的事务,请高手帮忙解惑。

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:03:21

    你的测试用例其实并不严谨。

    T1, 因为它没有修改数据,所以,只要有基本的MVCC(多版本并发控制)的功能,就可以满足“可重复读”了,无论T2,T3,T4有没有修改数据,根本无需锁定表。 - 比如oracle,这时默认情况下,T1是从undo中读取"旧"数据。

    再考虑数据库可能采用行锁,其实你要测试事务隔离级别的步骤应该是这样:

    1. T1 T2 关闭autocommit;

    2.T1 - select (开事务)

    3.T2 - update t1看得到的记录(随便一条),注意不要commit

    4.T1 - update T2中事务影响到的那条记录(此时,T1的事务就被挂起了)

    5.T2 - 提交 - (这时,T1也解锁了)

    要做这样的测试,其实用单纯的数据库客户端开两个SESSION还直观一些,无论是用mysql或postgresql或oracle都能完成这个测试。

    确认用例正常后,再考虑多线程(JDBC),然后再考虑Spring的JDBCTemplate. 这样一步步做过去,出问题时,才容易找到原因,否则纠缠太多,不利于学习中的知识点各个击破。

    0 0
相关问答

17

回答

【大咖问答】对话PostgreSQL 中国社区发起人之一,阿里云数据库高级专家 德哥

阿里ACE 彭飞 2019-07-10 09:36:10 967780浏览量 回答数 17

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 222995浏览量 回答数 162

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157084浏览量 回答数 145

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 333871浏览量 回答数 8

110

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 292284浏览量 回答数 110

17

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 643124浏览量 回答数 17

38

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 256868浏览量 回答数 38

21

回答

请教一下数据量有100万条左右要什么配置?

易网网络 2013-03-27 15:18:02 192334浏览量 回答数 21

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 302602浏览量 回答数 249

2

回答

区域选择帮助

fanyue88888 2012-12-07 15:54:30 204008浏览量 回答数 2
+关注
0
文章
14879
问答
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载