oracle分同步事务和异步事务,Oracle事务与线程synchronized同步有关问题

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

private synchronized boolean bookManage(BookParameter parameter) {

String bookNo = parameter.getBookNo();

String goodsRegNo = parameter.getGoodsRegNo();

Float count = parameter.getCount();

Float total;

CbecBookDetail bookDetail = DAOFactory.getCbecBookDetailDao().findBookDetailByGoodsRegNo(goodsRegNo, bookNo);

if(bookDetail != null && bookDetail.getEnableStatus() == 0) {

total = count + bookDetail.getgStock();

bookDetail.setgStock(total);

DAOFactory.getCbecBookDetailDao().updateBookDetail(bookDetail.getId(), total, 0);

} else {

bookDetail = new CbecBookDetail();

bookDetail.setBookNo(bookNo);

bookDetail.setGoodsRegNo(goodsRegNo);

bookDetail.setEnableStatus(0);

bookDetail.setgStock(count);

bookDetail.setgName(parameter.getgName());

bookDetail.setgModel(parameter.getgModel());

bookDetail.setUnitCode(parameter.getUnitcode());

DAOFactory.getCbecBookDetailDao().saveBookDetail(bookDetail);

}

//session.commit();

return true;

}

代码2

public boolean bookService(Object obj) {

//其他代码

bookManage(BookParameter parameter);

session.commit();

}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值