我正在编写一个程序,该程序将协调实时数据库中的最终交易。我正在进行的工作无法作为set操作完成,因此我使用了两个嵌套游标。
我在对每个客户端进行协调时需要对事务表进行排它锁,但是我想释放该锁,并让其他人在我处理的每个客户端之间运行查询。
我想在行级别而不是表级别上执行排他锁,但是到目前为止,我读到的内容说with (XLOCK, ROWLOCK, HOLDLOCK)
如果其他事务在READCOMMITED
隔离级别上运行(这对我来说),我将无法执行。
我是否正确获取了表级互斥锁,并且Server 2008 R2中有什么方法可以使行级互斥锁按我想要的方式工作而无需修改数据库上运行的其他查询?
declare client_cursor cursor local forward_only for
select distinct CLIENT_GUID from trnHistory
open client_cursor
declare @ClientGuid uniqueidentifier
declare @TransGuid uniqueidentifier
fetch next from client_cursor into @ClientGuid
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
begin tran
declare @temp int
--The following row will not work if the other connections are running READCOMMITED isolation level
--select @temp = 1
--from trnHistory with (XLOCK, ROWLOCK, HOLDLOCK)
--left join trnCB with (XLOCK, ROWLOCK, HOLDLOCK) on trnHistory.TRANS_GUID = trnCB.TRANS_GUID
--left join trnClients with (XLOCK, ROWLOCK, HOLDLOCK) on trnHistory.TRANS_GUID = trnClients.TRANS_GUID
--(Snip) --Other tables that will be "touched" during the reconcile
--where trnHistory.CLIENT_GUID = @ClientGuid
--Works allways but locks whole table.
select top 1 @temp = 1 from trnHistory with (XLOCK, TABLOCK)
select top 1 @temp = 1 from trnCB with (XLOCK, TABLOCK)
select top 1 @temp = 1 from trnClients with (XLOCK, TABLOCK)
--(Snip) --Other tables that will be "touched" during the reconcile
declare trans_cursor cursor local forward_only for
select TRANS_GUID from trnHistory where CLIENT_GUID = @ClientGuid order by TRANS_NUMBER
open trans_cursor
fetch next from trans_cursor into @TransGuid
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
--Do Work here
END
fetch next from trans_cursor into @TransGuid
END
close trans_cursor
deallocate trans_cursor
--commit the transaction and release the lock, this allows other
-- connections to get a few queries in while it is safe to read.
commit tran
END
fetch next from client_cursor into @ClientGuid
END
close client_cursor
deallocate client_cursor
如果您只担心其他读者,那么您就不需要排他锁,即模式
Begin Transaction
Make Data Inconsistent
Make Data Consistent
Commit Transaction
应该没事。唯一会看到不一致数据的会话是那些使用nolock
或的会话Read Uncommitted
,或者那些期望在不使用Repeatable Rows
或的情况下进行多次一致读取的会话Serializable
。
在回答这个问题时,我认为获得排他锁的正确方法是安排事情,以便引擎为您完成。
我在第一个事务中运行以下查询: 然后是第二个,来自不同的连接,这是完全相同的。在,它正在等待。 然后我运行下面的代码来查看锁 它显示行锁(ROW SHARE,ROW EXCLUSVE),这很好。但我也看到了 根据文档来自: 通过ALTERTABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER和VACUUM FULL命令获取。这也是未显式指定模式的lock TABLE语句
在分布式Java桌面应用程序通过JDBC访问的特别请求的DB2表中,我每天都会多次收到以下场景: > 客户机A想要插入新的寄存器,并在表上获得一个IX锁,X锁在每个新行中; 其他客户端想要执行SELECT,被授予表上的IS锁,但应用程序卡住了; 客户机A继续工作,但是插入和更新查询没有被提交,锁没有被释放,并且它继续收集X个锁到每一行; 客户端 A 退出,其工作未提交。其他客户端最终获取其 SEL
主要内容: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 同
我有以下功能,由多个进程同时使用。但是我有时会在插入操作中遇到重复错误。我认为这是锁的问题,所以我改成了 ACCESS EXCLUSIVE 锁,但这不好,因为它锁定了整个桌子。使用共享行独占模式似乎可以正常工作,但我对性能和访问有一些疑问。其他进程将能够访问该表?与前一个锁相比,此锁更慢(行独占)?
我在Linux上,我想在大约5-10个进程之间共享内存(每个进程是一个C程序)。我知道如何使用POSIX信号量(sem_open、sem_wait、sem_post等)或其他信号量(semctl、semget、semop等)来实现这一点。问题是我只知道如何做独占信号量锁。我想要非专属锁。 在我的应用程序中,只有一个进程写入共享内存,而所有其他进程只读取它。我希望能够对信号量进行非独占读锁(就像sh
我有一个名为“H2O问题”的家庭作业,我应该实现一个名为H2OBarrier的类,它有3种方法。 HReady,氢原子(线程)就绪时称为的方法 OReady,氧原子(线程)就绪时调用的方法 makeWater,当2个氢原子和1个氧原子准备就绪时称为方法 我应该使用Java可重入锁和条件来执行此操作。 这是我目前为止的代码,我想知道我是否正确地使用了lock和unlock。 我应该在我的 makeW