在分布式Java桌面应用程序通过JDBC访问的特别请求的DB2表中,我每天都会多次收到以下场景:
>
客户机A想要插入新的寄存器,并在表上获得一个IX锁,X锁在每个新行中;
其他客户端想要执行SELECT,被授予表上的IS锁,但应用程序卡住了;
客户机A继续工作,但是插入和更新查询没有被提交,锁没有被释放,并且它继续收集X个锁到每一行;
客户端 A 退出,其工作未提交。其他客户端最终获取其 SELECT 结果集。
过去工作得很好,大多数时候都是这样,但锁的情况越来越频繁。
自动提交已开启。
日志中没有引发异常或检测到错误。
DB2 9.5/JDBC驱动程序9.1(JDBC 3规范)
事实证明,有时自动提交(我不知道为什么)会变成应用程序的随机单个实例。
以下验证似乎解决了问题(但不是问题的根源):
if (!conn.getAutoCommit()) {
conn.commit();
}
如果 jdbc 应用程序未执行 COMMIT ,则锁将一直存在,直到回滚或提交。如果应用程序因未提交的插入而退出,那么所有最新版本的 Db2 都将发生回滚。这是 Linux/Unix/Windows 上的 Db2 的预期行为。
如果jdbc应用程序无法提交,那么它就被破坏或配置错误,所以如果您想寻找一个永久的解决方案,您必须找到根本原因。
如果其他客户端希望忽略插入行锁,那么他们应该选择正确的隔离级别,您可以将Db2配置为跳过插入锁。请参阅此链接中的留档DB2_SKIPINSERTED
我在第一个事务中运行以下查询: 然后是第二个,来自不同的连接,这是完全相同的。在,它正在等待。 然后我运行下面的代码来查看锁 它显示行锁(ROW SHARE,ROW EXCLUSVE),这很好。但我也看到了 根据文档来自: 通过ALTERTABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER和VACUUM FULL命令获取。这也是未显式指定模式的lock TABLE语句
主要内容:1 同步队列的结构,2 锁的获取与释放,3 acquire独占式获取锁,3.1 tryAcquire尝试获取独占锁,3.2 addWaiter加入到同步队列,3.3 acquireQueued结点自旋获取锁,3.4 selfInterrupt自我中断,4 release独占式锁释放,4.1 unparkSuccessor唤醒后继结点,5 acquirelnterruptibly独占式可中断获取锁,,,,,,,,,详细介绍了AQS中的同步队列以及同步状态的独占式获取、释放的原理。 1 同
问题内容: 我正在编写一个程序,该程序将协调实时数据库中的最终交易。我正在进行的工作无法作为set操作完成,因此我使用了两个嵌套游标。 我在对每个客户端进行协调时需要对事务表进行排它锁,但是我想释放该锁,并让其他人在我处理的每个客户端之间运行查询。 我想在行级别而不是表级别上执行排他锁,但是到目前为止,我读到的内容说如果其他事务在隔离级别上运行(这对我来说),我将无法执行。 我是否正确获取了表级互
我有以下功能,由多个进程同时使用。但是我有时会在插入操作中遇到重复错误。我认为这是锁的问题,所以我改成了 ACCESS EXCLUSIVE 锁,但这不好,因为它锁定了整个桌子。使用共享行独占模式似乎可以正常工作,但我对性能和访问有一些疑问。其他进程将能够访问该表?与前一个锁相比,此锁更慢(行独占)?
当php使用flock()获取文件的独占锁,然后使用pcntl_fork将其拆分为两个进程时,两个进程都具有相同的独占锁——也就是说,对该文件句柄的flock($fd,lock_EX)的进一步调用返回true。 但是,使用flock的目的是防止两个进程同时写入同一个文件。那么PHP如何处理这种情况呢?它是否允许这两个进程(它们都有独占锁)发生冲突?有没有办法(不创建新的文件处理程序)让一个进程检测
我在Linux上,我想在大约5-10个进程之间共享内存(每个进程是一个C程序)。我知道如何使用POSIX信号量(sem_open、sem_wait、sem_post等)或其他信号量(semctl、semget、semop等)来实现这一点。问题是我只知道如何做独占信号量锁。我想要非专属锁。 在我的应用程序中,只有一个进程写入共享内存,而所有其他进程只读取它。我希望能够对信号量进行非独占读锁(就像sh