数据库和Spring配置中都设置为Read Uncommitted,但是为什么设断点

changeking 2017-02-15 08:58:19
各位大神, 我工程是SSH架构, MySQL和Spring配置中都设置为Read Uncommitted,

现在模拟并发事务设置断点运行程序, 在断点的位置我去修改数据库(但未提交), 断点继续放行之后发现还是无法获取到未提交的内容, 这是怎么回事?

我明明在MySQL和Spring配置中都设置为Read Uncommitted了啊?




=====MySQL的操作=======

SET Transaction Isolation Level Read Uncommitted;
select @@tx_isolation;

-- 将自动提交功能置为OFF
SET AUTOCOMMIT=0;

update sys_user set usr_name='张三5' where usr_id=6;



=========applicationContext.xml=========

<prop key="hibernate.connection.isolation">1</prop>



=========BizImpl.java=========

@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackForClassName="Exception")
public void isolationTest(){
SessionFactory fac = udao.getSessionFactory();
Session hs = fac.openSession();

SysUser user = (SysUser) hs.get(SysUser.class, 6);
System.out.println("用户名:"+user.getUsrName());

//在此位置设置断点,并以debug模式运行
hs.clear();
SysUser user2 = (SysUser) hs.get(SysUser.class, 6);
System.out.println("用户名:"+user2.getUsrName());

}


========MainTest.java==========

@Test
public void test9(){
Biz biz = (Biz) ctx.getBean("biz");
biz.isolationTest();
}
...全文
301 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2017-03-21
  • 打赏
  • 举报
回复
读未提交,是你去读数据的时候,是否能读到人家修改了但未提交的 至于你自己修改的数据,你自己读当然是读到的,这跟事务隔离级别没有关系 所以不管是程序测试,还是 sql 测试,都是两个连接,一个连接把数据更新了但不提交,另一个连接去读取这个未提交的数据 而不管是程序还是 sql 的方式去读,归根结义都是发给 mysql 一个查询的请求,这个请求对于 mysql 而言没区别,它只是响应请求并返回数据,并不会因为请求者的不同而有不同的表现 所以程序如果正确开启了 Read Uncommitted,那是肯定能够读取到未提交数据的,程序端你可以查下当前的模式是否正确: select @@tx_isolation;
changeking 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
myql 这边的 update 不用配置 set transaction
有问题的应该是你程序这边,你可以另外开个 mysql 客户端工具查询,是不会问题的
SET Transaction Isolation Level Read Uncommitted;
select * from  sys_user  where usr_id=6;


你好, 这个问题, 我发现“读未提交”是针对执行修改的那条并发数据库线程而言, 也就是说那条线程执行更新数据库后并未提交, 但该线程搜索的时候却可以查到修改后的值(而且这个值并没有提交). 而针对我代码中的数据库线程是查不到另外一条线程的"读未提交"的数据的. 不知道我这有说对不对, 总之MySQL中我是模拟出来了, 但是程序没有模拟出来, 不知道什么原因?

=======MySQL========
update sys_user set usr_name='张三5' where usr_id=6;
select * from sys_user where usr_id=6;


zjcxc 2017-02-16
  • 打赏
  • 举报
回复
myql 这边的 update 不用配置 set transaction 有问题的应该是你程序这边,你可以另外开个 mysql 客户端工具查询,是不会问题的 SET Transaction Isolation Level Read Uncommitted; select * from  sys_user  where usr_id=6;
rucypli 2017-02-16
  • 打赏
  • 举报
回复
set global autocommit=0

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧