`

Oracle事务与线程synchronized同步问题

 
阅读更多

           最近在项目开发遇到oracle数据库中的数据计算不一致的问题,同时这个问题还涉及到线程同步的问题,这里方法中解决同步的问题使用了synchronized关键字实现同步,但是在这个方法中计数时还是导致了计数不准确问题,最后发现问题是oracle更新数据是需要手动提交的,导致了同步方法了但事务没一起同步导致了数据不一致的问题,伪代码如下:

private synchronized boolean counterManage(Parameter param) {
	String bookNo = param.getBookNo();
	String goodsRegNo = parameter.getGoodsRegNo();
	Float count = param.getCount();
	Float total;
	CounterDetail counterDetail = CounterDAO.getInstance().findCounterByGoodsRegNo(goodsRegNo, counterNo);
	if(counterDetail != null && counterDetail.getEnableStatus() == 0) {
		total = count + counterDetail.getgStock();
		counterDetail .setgStock(total);
		CounterDAO.getInstance().updateBookDetail(counterDetail .getId(), total, 0);
	} else {
		counterDetail = new CounterDetail();
		counterDetail .setBookNo(bookNo);
		counterDetail .setGoodsRegNo(goodsRegNo);
		counterDetail .setEnableStatus(0);
		counterDetail .setgStock(count);
		counterDetail .setgName(param.getgName());
		counterDetail .setgModel(param.getgModel());
		counterDetail .setUnitCode(param.getUnitcode());
		CounterDAO.getInstance().saveBookDetail(counterDetail );
	}
	//session.commit();
	return true;
}

 代码2

public  boolean counterService(Object obj) {
      //其他代码
counterManage(Parameter param);
session.commit();
}

 上面红色部分提交经过封装后提交方法中所有未提交的事务,在代码2中session.commit();可以同时提交counterManage()方法中未提交的事务,但是在这里提交会导致虽然counterManage方法已同步,但是对于更新方法时一个线程进入调用同一个对象之后就会出现读脏数据导致数据的不一致性。目前解决方案是方法counterManage()执行完就提交。

如有更好的方法请给出评论共同进步,谢谢!

分享到:
评论

相关推荐

    超级有影响力霸气的Java面试题大全文档

    此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),...

    千方百计笔试题大全

    72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket...

    java面试宝典

    72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73、线程的基本概念、线程的基本状态以及状态之间的关系 18 74、sleep() 和 wait() 有什么区别? 18 75、socket通信...

    java 面试题 总结

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    java面试800题

    volatile:volatile变量表示保证它必须是与主内存保持一致,它实际是""变量的同步"", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前,一般用于多线程编程。 abstract:抽象,必须重载,修饰...

    Java面试宝典2020修订版V1.0.1.doc

    3、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 56 4、线程的基本概念 57 5、什么是多线程 57 6、程序、进程、线程之间的关系 57 7、创建线程有几种方式,分别是什么? ...

    java面试题

    15. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 11 16. abstract class和interface有什么区别? 12 17. abstract的method是否可同时是static,是否可同时是native,是否可...

    java基础题 很全面

    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 31 6. 写一段Jdbc连Oracle的程序. 32 7. 编码实现内部类 34 8. 输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按...

    最新Java面试宝典pdf版

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...

    Java面试宝典2010版

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 53、线程的基本概念、线程的基本状态以及状态之间的关系 54、简述synchronized和java.util.concurrent.locks.Lock的...

    Java面试笔试资料大全

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...

    Java面试宝典2012版

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks....

    Java面试宝典2012新版

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...

    Java面试宝典-经典

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...

    JAVA面试宝典2010

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...

    java面试题大全(2012版)

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 33 53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock...

    java面试宝典2012

    52、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 37 53、线程的基本概念、线程的基本状态以及状态之间的关系 37 54、简述synchronized和java.util.concurrent.locks.Lock...

Global site tag (gtag.js) - Google Analytics