用hibernate测试mysql不可重复读的例子遇到的问题

Simba_hua 2017-05-09 06:57:03
在用hibernate测试mysql不可重复读的例子时,出现了一直无法得到正确的结果,例子是这样的:
数据库表tn_task_log中有这样一条数据
id task_id token optlock
2 89 10 19

mysql数据库的隔离级别设置为:READ-UNCOMMITTED,测试用例如下:


Session session1 = commonDao.openSession();
Session session2 = commonDao.openSession();
Transaction t1 = session1.beginTransaction();
Transaction t2 = session2.beginTransaction();
TnTaskLog tnTaskLog1 = (TnTaskLog) session1.createSQLQuery("select * from tn_task_log where task_Id = 89")
.addEntity(TnTaskLog.class).list().get(0);
System.out.println("T1事务第一次查询数据:"+tnTaskLog1.getToken());

TnTaskLog tnTaskLog2 = (TnTaskLog) session2.createSQLQuery("select * from tn_task_log where task_Id = 89")
.addEntity(TnTaskLog.class).list().get(0);

tnTaskLog2.setToken(20);
session2.update(tnTaskLog2);
session2.flush();
t2.commit();
session2.close();

System.out.println("T2事务更新数据并提交");
TnTaskLog tnTaskLog3 = (TnTaskLog) session1.createSQLQuery("select * from tn_task_log where task_Id = 89")
.addEntity(TnTaskLog.class).list().get(0);
System.out.println("T1事务第二次查询数据:"+tnTaskLog3.getToken());

session1.close();


输出结果为:

Hibernate:
select
*
from
tn_task_log
where
task_Id = 89
T1事务第一次查询数据:10
Hibernate:
select
*
from
tn_task_log
where
task_Id = 89
Hibernate:
update
tn_task_log
set
cnt_is_finish=?,
cnt_token=?,
create_time=?,
max_connect_time_id=?,
max_trip_id=?,
task_id=?,
token=?,
trip_is_finish=?,
trip_token=?,
update_time=?,
optlock=?
where
id=?
and optlock=?
T2事务更新数据并提交
Hibernate:
select
*
from
tn_task_log
where
task_Id = 89
T1事务第二次查询数据:10

根据对不可重复读的理解,T1事务第二次查询数据应该为20才对,为什么是10呢?是我理解错误了吗?求大神指教,谢谢
...全文
181 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Simba_hua 2017-05-27
  • 打赏
  • 举报
回复
还真是这样,谢谢@oflty
oflty 2017-05-25
  • 打赏
  • 举报
回复
Session1是不是有缓存啊,T1事务第二次查询前refresh看看。

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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