请问大家一个问题:
  Java或c#语言中,同一个方法中123共有三处执行数据库操作,按字母顺序排列,并且处于同一事务,事务是由框架来处理,1是insert,2是sele,3是update 操作。
A)目的:1插入记录后,2进行查询1插入的数据,通过3对业务数据进行更新。B)结果:1插入成功了,2没有查询到1插入的数据返回0,以至3未能将1处的数据更新到数据库而更新为0?  C)问题:为什么1插入成功了,2没有查询到? 除了网络原因还有什么原因?若是网络因为那又在什么特殊情况下才发生?Java执行按123顺序,而在执行过程中,1插入的速度比2查询的速度要慢,而时间又要得久些,这种问题会存在吗?
D)代码:
下面代码会不会引起脏读,幻像读?
public void saveByList(String fphm, List<XiaoMaDanMx> list,
ShuiLuZhuangXieJiHuaManager slzxJiHuaManager,VmtclcmzManager vxmdManager) {
XiaoMaDanMxExample example = new XiaoMaDanMxExample();
example.createCriteria().andFPHMEqualTo(fphm);
this.xiaoMaDanMxDAOImpl.deleteByExample(example); for (XiaoMaDanMx auth : list) {
this.xiaoMaDanMxDAOImpl.insert(auth);//注释:这里是第一处插入

HashMap<String,String> zxjhd_map = new HashMap<String,String>();
zxjhd_map.put("zxjhdfph", auth.getZXDPH());
zxjhd_map.put("zxjhdfphm",auth.getZXDH());
HashMap<String,BigDecimal> vzxjhd_map = vxmdManager.getSlokAndSl2ok(zxjhd_map);//注释:这里是第二处查询
System.out.println("查询水陆装卸计划单:  p1:"+vzxjhd_map.get("SL1") +"  p2: "+ vzxjhd_map.get("SL1")+" ph: "+auth.getZXDPH()+"  fphm "+auth.getZXDH());
HashMap map = new HashMap();
map.put("p1", vzxjhd_map.get("SL1"));
map.put("p2", vzxjhd_map.get("SL2"));
map.put("ph", auth.getZXDPH());
map.put("fphm",auth.getZXDH());
slzxJiHuaManager.UpdateSlAndZlByPHAndFphm(map);//注释:这里是第三处更新

HashMap<String,String> mtzytb_map = new HashMap<String,String>();
mtzytb_map.put("mtzytbfphm", auth.getZXTZDH());
mtzytb_map.put("mtzytbph",auth.getZXTZDPH());
HashMap<String,BigDecimal> vmtzytb_map = vxmdManager.getSlokAndSl2ok(mtzytb_map);
System.out.println("查询码头作业单填报:  p1:"+vmtzytb_map.get("SL1") +"  p2: "+ vmtzytb_map.get("SL2")+" ph: "+auth.getZXTZDH()+"  fphm "+auth.getZXTZDPH());


HashMap tb_map = new HashMap();
tb_map.put("p1", vmtzytb_map.get("SL1"));
tb_map.put("p2", vmtzytb_map.get("SL2"));
tb_map.put("fphm", auth.getZXTZDH());
tb_map.put("ph",auth.getZXTZDPH());
this.mtzxzydtbManager.UpdateSlAndZlByPHAndFphm(tb_map); }

解决方案 »

  1.   

    谢谢你的回复!系统整个事务是用框架管理,系统运行了半年,该方法业务从没有出现过问题,若是事务没有提交,那就会经常碰到,那么第一处也就不会插入成功,第三处后面的sql语句也不会更新成功,代码如下:HashMap <String,String> mtzytb_map = new HashMap <String,String>(); 
    mtzytb_map.put("mtzytbfphm", auth.getZXTZDH()); 
    mtzytb_map.put("mtzytbph",auth.getZXTZDPH()); 
    HashMap <String,BigDecimal> vmtzytb_map = vxmdManager.getSlokAndSl2ok(mtzytb_map); 
    System.out.println("查询码头作业单填报:  p1:"+vmtzytb_map.get("SL1") +"  p2: "+ vmtzytb_map.get("SL2")+" ph: "+auth.getZXTZDH()+"  fphm "+auth.getZXTZDPH()); 
      

  2.   

    是不是ORACLE数据库
    如果是的话,可以设置数据库的事务级别.
    可以防止脏读和幻想读
      

  3.   

    谢谢大家的回复,数据是Oracle数据库,请问下,在那里设置事务级别,怎样设置事务级别,怎样修改代码避免!