最近在项目开发遇到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()执行完就提交。
如有更好的方法请给出评论共同进步,谢谢!
相关推荐
这个案例可能涉及到线程同步、线程通信、线程池等高级主题,比如`synchronized`关键字用于保证线程安全,`wait()`和`notify()`方法实现线程间的协调,以及`ExecutorService`和`ThreadPoolExecutor`用于更高效地管理...
这可能涉及到线程安全问题,因此需要正确地同步对图表对象的访问,例如使用synchronized关键字或者使用Lock接口。此外,LiveChart通常会提供数据流更新机制,允许我们在后台线程中更新数据,而不会阻塞用户界面。 ...
- **同步机制**:synchronized关键字的使用,包括方法同步和代码块同步,以及死锁的概念。 - **线程通信**:wait(), notify(), notifyAll()方法的使用,以及生产者消费者模型。 6. **输入/输出流** - **I/O流的...
Oracle是世界上最广泛使用的... - 线程同步:避免并发问题,如synchronized关键字、wait()、notify()等方法。 掌握这些Oracle相关知识对于面试和实际工作都是非常关键的,能够帮助你在面试中表现出扎实的技术基础。
此外,我们还需要考虑线程安全,确保在多线程环境下对数据库操作的正确性,这可能涉及到`synchronized`关键字或`java.util.concurrent`包下的锁和同步机制。 接着,数据库连接和操作是另一重要环节。在Java中,可以...
4. **多线程**:掌握线程的创建与同步机制,如synchronized关键字和Lock接口。 5. **JVM内存模型**:了解堆、栈、方法区等内存区域的工作原理及垃圾回收机制。 【Unix面试知识点】 1. **Unix命令行工具**:熟悉ls...
5. **多线程**:线程的创建方式(实现Runnable接口或继承Thread类),线程同步机制(synchronized、wait/notify)及并发工具类(如Semaphore、CountDownLatch)。 6. **JVM内存模型**:了解堆、栈、方法区、本地...
3. 线程的同步:使用锁机制来实现线程的同步,可以使用 synchronized 关键字或 Lock 对象来实现。 4. Runnable 的作用:Runnable 是 Java 中的一种接口,用于定义可以执行的任务。 序列化和流 5. Java 序列化:...
5. **多线程**:Java支持多线程编程,理解线程的概念、同步机制(如synchronized关键字、wait/notify机制)以及线程池,能帮助开发者写出高效且并发友好的程序。 接下来,我们转向Oracle数据库: 1. **SQL基础**:...
4. **多线程**:线程的创建方式(实现Runnable接口和继承Thread类),线程同步(synchronized,wait,notify,notifyAll),线程池等。 5. **JVM**:内存模型(堆,栈,方法区,本地方法栈,程序计数器),垃圾回收...
7. **多线程**:讲解如何创建和管理并发执行的线程,以及同步机制,如synchronized关键字和wait()、notify()方法。 Oracle 9i是Oracle数据库的一个早期版本,具有强大的数据管理功能。在这个教程中,你可能会学习到...
3. **Java多线程与并发编程**:多线程是Java的一大优势,面试中会考察线程的创建、同步机制(synchronized、Locks)、线程池(ExecutorService)、并发工具类(如Semaphore、CyclicBarrier)等。理解线程安全问题及...
6. **多线程**:探讨Java中的线程同步机制,如synchronized关键字、wait()、notify()方法,以及ThreadLocal、ExecutorService等高级话题。 7. **JVM内部机制**:深入解析Java虚拟机的工作原理,包括类加载机制、...
3. **操作系统**:面试中可能涉及操作系统的内存管理(如虚拟内存、分页、分段)、进程与线程的概念及区别,同步与互斥,死锁问题,以及CPU调度等。理解操作系统的这些基础知识对于优化Java程序的性能至关重要。 4....
此外,Oracle的默认事务隔离级别是读已提交,MySQL则是可重复读。 4. **线程池创建方式** - `newFixedThreadPool`: 创建固定大小的线程池,线程数量不会改变,异常结束的线程会由新的线程替换。 - `...
这是一个典型的线程同步问题,可以使用`synchronized`关键字或者`java.util.concurrent`包中的工具,如`Semaphore`,确保对共享资源的互斥访问。 以上就是Java面试中涉及的几个关键知识点的详解,涵盖了字符串处理...
4. **线程同步**:Java中的`synchronized`关键字和`java.util.concurrent`包下的工具类(如Semaphore、ReentrantLock)可以帮助实现线程间的同步,确保在并发环境下的正确执行。 5. **线程池**:为了更有效地管理...
线程同步是Java多线程编程中的一种机制,用于解决线程之间的同步问题。关键字有synchronized、volatile和atomic。sleep()和wait()都是线程同步的机制,sleep()用于使线程暂停一段时间,而wait()用于使线程等待某个...
13. **可重入锁与synchronized的区别**:ReentrantLock具备synchronized的所有功能,还支持等待可中断、公平锁和多条件对象。等待可中断允许线程在等待时可选择放弃;公平锁按请求顺序分配锁;多条件对象可以创建多...
它并非解决共享变量同步问题,而是为每个线程提供私有变量存储。 12. **HTTP PUT方法**:PUT方法常用于更新已有资源,可通过表单提交多个文件,可以设置多个文件输入框并以数组命名,或者使用不同的名字。 13. **...