同一个事务,为什么读取不到之前没有提交的数据

van86 2010-12-23 10:54:38
我在同一个事务中,
先用HibernateTemplate.save()了数据
然后用HibernateTemplate.execute,手写SQL去查询,此查询涉及到上一步save的数据
但是就是读不到上一步save的数据
求高手解答。
...全文
3978 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
vicanary 2013-07-24
  • 打赏
  • 举报
回复
引用 27 楼 gongde56789 的回复:
[quote=引用 26 楼 gongde56789 的回复:] [quote=引用 25 楼 whitewolf123 的回复:] [quote=引用 23 楼 whitewolf123 的回复:] 2010年的…… ⊙﹏⊙b汗
可以的,读取数据时的方法一般有重载的,在后面加一个事务的参数就可以拿到没有commit的数据[/quote]加什么参数解决。。。[/quote]兄弟,求教育啊,= =话说一半木解决[/quote] 答案在上面,我贴的图中
vicanary 2013-07-24
  • 打赏
  • 举报
回复
引用 26 楼 gongde56789 的回复:
[quote=引用 25 楼 whitewolf123 的回复:] [quote=引用 23 楼 whitewolf123 的回复:] 2010年的…… ⊙﹏⊙b汗
可以的,读取数据时的方法一般有重载的,在后面加一个事务的参数就可以拿到没有commit的数据[/quote]加什么参数解决。。。[/quote] 给你个提醒吧,楼主早死了
vicanary 2013-07-24
  • 打赏
  • 举报
回复 1


创建事务时,选取以上的方式,即可在事务中读取没有提交的数据,但是要你的数据支持,oracl和sqlserver都可以,至于mysql以前是不支持的,不知道现在被oracl接手以后变成什么了。

这个方面的术语叫“事务隔离级别”,你可以搜搜相关的资料,去年我搞了好长时间呢。

gongde56789 2013-07-24
  • 打赏
  • 举报
回复
引用 26 楼 gongde56789 的回复:
[quote=引用 25 楼 whitewolf123 的回复:] [quote=引用 23 楼 whitewolf123 的回复:] 2010年的…… ⊙﹏⊙b汗
可以的,读取数据时的方法一般有重载的,在后面加一个事务的参数就可以拿到没有commit的数据[/quote]加什么参数解决。。。[/quote]兄弟,求教育啊,= =话说一半木解决
gongde56789 2013-07-24
  • 打赏
  • 举报
回复
引用 25 楼 whitewolf123 的回复:
[quote=引用 23 楼 whitewolf123 的回复:] 2010年的…… ⊙﹏⊙b汗
可以的,读取数据时的方法一般有重载的,在后面加一个事务的参数就可以拿到没有commit的数据[/quote]加什么参数解决。。。
vicanary 2013-05-13
  • 打赏
  • 举报
回复
引用 23 楼 whitewolf123 的回复:
2010年的…… ⊙﹏⊙b汗
可以的,读取数据时的方法一般有重载的,在后面加一个事务的参数就可以拿到没有commit的数据
cookie-niu 2013-02-22
  • 打赏
  • 举报
回复
引用 23 楼 whitewolf123 的回复:
2010年的…… ⊙﹏⊙b汗
别汗呀!到底一个事物里是否可以save还未commit时读取到数据呀!!困惑
vicanary 2012-09-21
  • 打赏
  • 举报
回复
2010年的……
⊙﹏⊙b汗
vicanary 2012-09-21
  • 打赏
  • 举报
回复
我知道解决方法了,今天遇到这个搞了一个上午,不过这帖子沉了?
van86 2010-12-23
  • 打赏
  • 举报
回复
默认的事务隔离级别,ORACLE
按照我们框架的事务传播机制save是在外围事务中执行的
save和query不能在一个事务中做?是说 同一个事务中,save的数据 query是查不到的?
[Quote=引用 13 楼 whut_lcy 的回复:]

1 事务级别是啥
2 save的事物有无正确落实
3 save和query不能在一个事物中做
[/Quote]
whut_lcy 2010-12-23
  • 打赏
  • 举报
回复
1 事务级别是啥
2 save的事物有无正确落实
3 save和query不能在一个事物中做
van86 2010-12-23
  • 打赏
  • 举报
回复
但是我这是同一个事务啊。
我在数据库里面直接用insert 和 select写在一个事务里面
select也是可以读出数据的
但是如果另开一个session就会像你说的那样。
[Quote=引用 6 楼 mopishv0 的回复:]

就是这样的
防止脏读
你在sqlplus里面 插入一条数据
在commit之前
其他用户是读不到你插入的数据的
所以必须提交事务
数据才能真正的插入到数据库中
否则他只停留在缓存里 也就是hibernate中的非持久化状态
[/Quote]
van86 2010-12-23
  • 打赏
  • 举报
回复
flush 以后如果出现异常 之前的能回滚吗?
确信是同一个事务。
因为我断点走完save方法数据库里面是没有提交的。
走完后面的查询方法 数据库里面也是没有提交之前save进去的数据
走完整个方法以后才提交
[Quote=引用 7 楼 jsnewland 的回复:]

能确信是同一个事务吗?如果是同一个事务肯定可以读到,
maybe根本没有同步到数据库 而是缓存在了实体管理器中
要不你调用下flush()方法 和数据库同步下子呢;
[/Quote]
shaosijun2004 2010-12-23
  • 打赏
  • 举报
回复
你的切面呢
aop
advice
shaosijun2004 2010-12-23
  • 打赏
  • 举报
回复
你都没有commit的东西,能查得到么?
是不是应该save 做为一个事务来处理,一个事物只允许提交一次
玉女 2010-12-23
  • 打赏
  • 举报
回复
操作一次提交一次
jsnewland 2010-12-23
  • 打赏
  • 举报
回复
能确信是同一个事务吗?如果是同一个事务肯定可以读到,
maybe根本没有同步到数据库 而是缓存在了实体管理器中
要不你调用下flush()方法 和数据库同步下子呢;
mopishv0 2010-12-23
  • 打赏
  • 举报
回复
就是这样的
防止脏读
你在sqlplus里面 插入一条数据
在commit之前
其他用户是读不到你插入的数据的
所以必须提交事务
数据才能真正的插入到数据库中
否则他只停留在缓存里 也就是hibernate中的非持久化状态
van86 2010-12-23
  • 打赏
  • 举报
回复
大人们啊。救救小弟吧
van86 2010-12-23
  • 打赏
  • 举报
回复
我断点调式单走完save方法 还没走完整个事务 数据库里面是查不出数据的。

再申明下:我们的框架是申明式事务管理,事务传播机制是:PROPAGATION_REQUIRED


<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="val*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="do*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="add*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="delete*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="audit*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="save*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="close*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>
<prop key="unClose*">
PROPAGATION_REQUIRED,-IEMSRollBackException
</prop>

我这个事务里面还有个delete方法,同样我之后的那个查询方法查询的数据也涉及到这个delete方法delete掉的数据,delete方法是用HibernateTemplate.execute执行的,同样走完这个方法,删除掉的数据也是没提交的,但是我之后的那个查询方法能读到删除掉的数据。

我的疑问是:难道HibernateTemplate.save()和HibernateTemplate.execute不是在一个事务里,就是说难道他们底层的session connection不一样???

public Gdj2SubValSysBO addFromSelected(Object[] objArr, Gdj2SubContrBO contrBO)
throws IllegalAccessException, InvocationTargetException, IEMSRollBackException {
String contrID = contrBO.getID();
Gdj2SubValSysBO subBO;
try {
subBO = findRoot(contrBO,true);
} catch (IEMSNotRollBackException e) {
throw new IEMSRollBackException(e);
}
List delArr = new ArrayList();
List addArr = new ArrayList();
if(objArr!=null) {
List list = new ArrayList();
List deleteList = new ArrayList();//以后编制分包时勾掉的测量体系

for(int i=0;i<objArr.length;i++) {
Gdj2ValSysBO mainBO = (Gdj2ValSysBO)objArr[i];
Gdj2SubValSysBO newBO = new Gdj2SubValSysBO();
BeanUtils.copyProperties(newBO, mainBO);
newBO.setContrID(contrID);
newBO.setValID(mainBO.getID());
if(mainBO.getHasSub() == 0) {
deleteList.add(newBO);
delArr.add(mainBO);
} else {
list.add(newBO);
addArr.add(mainBO);
}
}

try {
insertPacks(deleteList,delArr.toArray(),contrID);
insertPacks(list,addArr.toArray(),contrID);
doAddSelected(list,subBO.getID(),subBO.getContrID());
doDeleteSelected(deleteList);
IProjectBiz biz = (IProjectBiz)getBiz(ProjectBO.class);
biz.updateSynchro(contrID);
} catch (IEMSException e) {
throw new IEMSRollBackException(e);
}//


}

return subBO;
}




加载更多回复(9)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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