我可以看到如何关闭SQL Server中的行级和页级锁定,但我找不到强制SQL Server使用行级锁定的方法.有没有办法强制SQL Server使用行级锁定而不使用页面级锁定?
我有一个具有以下结构的查询:
SELECT ..... WHERE status = 'QUEUED' ORDER BY position ASC LIMIT 1 FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
它是InnoDB表上的单表SELECT语句.字段position(INT NOT NULL)上有索引.状态为ENUM,也已编入索引.
SELECT ... FOR UPDATE手册页说,它锁定了它读取的所有行.我是否理解正确,在这种情况下只会锁定一行?或者说它会锁定整个桌子?
是否可以确定哪些行将被EXPLAIN查询锁定?如果是 - 如何?解释空表上的查询显示以下内容:
1;'SIMPLE';'job';'index';<null>;'index_position';[34,...];<null>;1;'Using where'
Run Code Online (Sandbox Code Playgroud) 我如何保证我可以搜索我的数据库中是否存在用户名,然后将该用户名作为新行插入数据库而不在SELECT和INSERT语句之间进行任何拦截?
几乎就像我锁定了一个不存在的行.我想用用户名"Foo"锁定不存在的行,这样我现在可以检查它是否存在于数据库中并将其插入到数据库中(如果它尚不存在而没有任何中断).
我知道使用LOCK IN SHARE MODE和FOR UPDATE存在,但据我所知,这只适用于已经存在的行.我不知道在这种情况下该怎么做.
如果我有这个multiupdate查询
UPDATE user u
INNER JOIN user_profile up ON up.user_id = u.id
SET u.name = 'same_name_i_already_had', up.profile.age = 25
WHERE u.id = 10
Run Code Online (Sandbox Code Playgroud)
假设用户表中的第10行已经具有名称"same_name_i_already_had",因此不应该更新它.
另一方面,user_profile表中的行具有不同的年龄,因此MySQL应该更新它.
假设MySQL作为RDBMS和InnoDB,其行级锁定系统作为两个表的引擎,
MySQL是否会锁定用户表中的行,尽管不必更新该行的名称字段?
我正在处理我们处理货币交易的情况.
例如,我有一个用户钱包表,其中包含余额.
UserId; Wallet Id; Balance
Run Code Online (Sandbox Code Playgroud)
现在在我们的网站和Web服务中,每当某个事务发生时,我们需要:
如何以及在整个交易期间锁定该行/实体的正确方法是什么?
根据我的阅读,有一些解决方案,其中EF标记一个实体,然后在将其保存回数据库时对该标记进行比较,但是当另一个用户/程序已经编辑了该数量时它又做了什么?
我能用EF实现这个目标吗?如果没有,我有什么其他选择?
调用存储过程可能允许我正确地锁定行,这样当程序A锁定它时,没有其他人可以访问SQL Server中的那一行吗?
c# sql-server entity-framework rowlocking entity-framework-6.1
表模式(SQL Server 2012)
Create Table InterestBuffer
(
AccountNo CHAR(17) PRIMARY KEY,
CalculatedInterest MONEY,
ProvisionedInterest MONEY,
AccomodatedInterest MONEY,
)
Create Table #tempInterestCalc
(
AccountNo CHAR(17) PRIMARY KEY,
CalculatedInterest MONEY
)
Run Code Online (Sandbox Code Playgroud)
我正在做一个upsert.更新存在的行并插入其他行.
UPDATE A
SET A.CalculatedInterest = A.CalculatedInterest + B.CalculatedInterest
FROM InterestBuffer A
INNER JOIN #tempInterestCalc B ON A.AccountNo = B.AccountNo
INSERT INTO InterestBuffer
SELECT A.AccountNo, A.CalculatedInterest, 0, 0
FROM #tempInterestCalc A
LEFT JOIN InterestBuffer B ON A.AccountNo = B.AccountNo
WHERE B.AccountNo IS NULL
Run Code Online (Sandbox Code Playgroud)
一切都很好.并发执行期间出现问题.我#tempInterestCalc通过加入其他各种表来插入数据,包括与表的左连接,InterestBuffer并#tempInterestCalc为每个并发执行插入不同的数据集.
我的问题是,有时执行会被另一个执行锁定,直到我将它们串行提交. …
当我右键单击SQL Server Management Studio中的表并选择"编辑前200行"时,如果有的话,我正在查看的数据是否会被锁定?
我的一位同事表示,以这种方式查看数据时,数据行可以被锁定(我想当他说你把光标放在行上并开始编辑数据时).
这是唯一可以在此上下文中锁定数据的时间吗?
我有一个要求,我们需要在更新时不持有锁的情况下更新行。
以下是需求的详细信息,我们将每 5 分钟在一个表上运行一次批处理,update blogs set is_visible=1 where some conditions该查询将在数百万条记录上运行,因此我们不想在更新期间阻止所有行写入。
我完全理解没有写锁的含义,这对我们来说很好,因为 is_visible 列将仅由该批处理过程更新,其他线程不会更新该列。另一方面,同一个表的其他列会有很多更新,我们不想阻止这些更新
我已经从SQL Server 2005升级到2008.我记得在2005年,ROWLOCK根本无法工作,我不得不使用PAGELOCK或XLOCK来实现任何类型的实际锁定.我知道读者会问"你做错了什么?" 没有.我最终证明我可以编辑一个"ROWLOCKED"行,但如果我升级锁定级别则不行.我没有机会看到它是否适用于SQL 2008.我的第一个问题是有没有人在2008年遇到过这个问题?
我的第二个问题如下.我想测试一个值是否存在,如果存在,则对相关列执行更新,而不是整行的插入.这意味着如果找到该行,则需要将其锁定,因为维护过程可能会在进程中删除此行,从而导致错误.
为了说明原理,以下代码是否有效?
BEGIN TRAN
SELECT ProfileID
FROM dbo.UseSessions
WITH (ROWLOCK)
WHERE (ProfileID = @ProfileID)
OPTION (OPTIMIZE FOR (@ProfileID UNKNOWN))
if @@ROWCOUNT = 0 begin
INSERT INTO dbo.UserSessions (ProfileID, SessionID)
VALUES (@ProfileID, @SessionID)
end else begin
UPDATE dbo.UserSessions
SET SessionID = @SessionID, Created = GETDATE()
WHERE (ProfileID = @ProfileID)
end
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud) sql-server locking sql-server-2005 sql-server-2008 rowlocking
我试图理解 SQL Server 中的 ROWLOCK 以在锁定记录后更新记录。这是我的观察,想确认 ROWLOCK 是否像表或页锁之类的东西,或者我没有正确尝试过。ROWLOCK 应该是仅对行的锁定,而不是对表或页的锁定。
这是我尝试过的:
我创建了一个简单的表:row_lock_temp_test有两列ID和Name,没有 PK 或索引。现在我打开 SQL Server,两个不同的客户端但具有相同的凭据,并尝试执行一组查询,如下所示:
客户1:
1: BEGIN TRANSACTION;
2: update row_lock_temp_test set name = 'CC' where id = 2
3: COMMIT
Run Code Online (Sandbox Code Playgroud)
客户2:
1: BEGIN TRANSACTION;
2: update row_lock_temp_test set name= 'CC' where id = 2
3: COMMIT
Run Code Online (Sandbox Code Playgroud)
我在 C-1 上执行了查询 1、2,然后转到 C-2 并执行了相同的查询,两个客户端都执行了查询,然后我提交了事务,一切都很好。
然后我添加 RowLock 来更新查询,
C-1
1: BEGIN TRANSACTION;
2: update row_lock_temp_test WITH(rowlock) set name = 'CC' where id = 2
3: …Run Code Online (Sandbox Code Playgroud)