我在同一个事务中,
先用HibernateTemplate.save()了数据
然后用HibernateTemplate.execute,手写SQL去查询,此查询涉及到上一步save的数据
但是就是读不到上一步save的数据
求高手解答。
先用HibernateTemplate.save()了数据
然后用HibernateTemplate.execute,手写SQL去查询,此查询涉及到上一步save的数据
但是就是读不到上一步save的数据
求高手解答。
解决方案 »
- iframe跨域传链接
- tomcat 使用时加载部署项目出现 “Exploded location overlaps an existing deployment” ?
- 求表单添加数据的问题?
- tomcat +MySQL数据源问题!!!!!!!
- 旅行社网站如何访问航空公司的票务查询接口提供实时票务查询?基于B/S的!求大虾指点!
- 嵌套标签问题
- 在weblogic上部署应用后,在浏览器输入的应用的地址应该是什么
- 关于hibernate的Middlegen-Hibernate工具问题
- myeclipse 中点击右键没有add webproject Capabilities
- 急急急!从输入流转换document出错:请检验文档格式。与NC集成财务凭证传输XML文件返回的错误信息
- 泛型问题,这是什么技巧?
- struts2把服务器图片传到jsp用img标签显示出来
两个biz配的不同的dao。
我们的框架是系统启动时就把biz实例化好了。
<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;
}
防止脏读
你在sqlplus里面 插入一条数据
在commit之前
其他用户是读不到你插入的数据的
所以必须提交事务
数据才能真正的插入到数据库中
否则他只停留在缓存里 也就是hibernate中的非持久化状态
maybe根本没有同步到数据库 而是缓存在了实体管理器中
要不你调用下flush()方法 和数据库同步下子呢;
是不是应该save 做为一个事务来处理,一个事物只允许提交一次
aop
advice
确信是同一个事务。
因为我断点走完save方法数据库里面是没有提交的。
走完后面的查询方法 数据库里面也是没有提交之前save进去的数据
走完整个方法以后才提交
我在数据库里面直接用insert 和 select写在一个事务里面
select也是可以读出数据的
但是如果另开一个session就会像你说的那样。
2 save的事物有无正确落实
3 save和query不能在一个事物中做
按照我们框架的事务传播机制save是在外围事务中执行的
save和query不能在一个事务中做?是说 同一个事务中,save的数据 query是查不到的?
flush 可以回滚 因为此时事务并未提交 只有commit之后才是不可回滚的
flush 的目的是把数据写入数据库 flush 之前可能你的数据还在服务器缓存中 数据库根本就不知道他的存在
flush 虽然写入了数据库 只要你没commit 都是可以回滚的
注:flush 是必须要做的,就算你不写 管理器也会默认回调,一般有三个时机会执行该方法
1、你显式调用时
2、执行查询之前
3、提交之前
后两种情况和你配置有关的 如果按你说的flush可以解决问题的话 可能就是你配置的是commit 时才同步。
答案在上面,我贴的图中