标签: rowlocking

是否可以在SQL Server中强制执行行级锁定?

我可以看到如何关闭SQL Server中的行级和页级锁定,但我找不到强制SQL Server使用行级锁定的方法.有没有办法强制SQL Server使用行级锁定而不使用页面级锁定?

sql-server sql-server-2005 sql-server-2008 rowlocking

54
推荐指数
3
解决办法
10万
查看次数

SELECT将锁定多少行... ORDER BY xxx LIMIT 1 FOR UPDATE?

我有一个具有以下结构的查询:

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)

mysql transactions rowlocking

32
推荐指数
2
解决办法
1万
查看次数

如何锁定尚不存在的InnoDB行?

我如何保证我可以搜索我的数据库中是否存在用户名,然后将该用户名作为新行插入数据库而不在SELECTINSERT语句之间进行任何拦截?

几乎就像我锁定了一个不存在的行.我想用用户名"Foo"锁定不存在的行,这样我现在可以检查它是否存在于数据库中并将其插入到数据库中(如果它尚不存在而没有任何中断).

我知道使用LOCK IN SHARE MODEFOR UPDATE存在,但据我所知,这只适用于已经存在的行.我不知道在这种情况下该怎么做.

mysql innodb locking rowlocking database-locking

17
推荐指数
3
解决办法
5262
查看次数

当MySQL在更新InnoDB表时确切地锁定了一行?

如果我有这个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是否会锁定用户表中的行,尽管不必更新该行的名称字段?

mysql innodb locking rowlocking

16
推荐指数
1
解决办法
1万
查看次数

如何在Entity Framework中完全锁定一行

我正在处理我们处理货币交易的情况.

例如,我有一个用户钱包表,其中包含余额.

UserId; Wallet Id; Balance
Run Code Online (Sandbox Code Playgroud)

现在在我们的网站和Web服务中,每当某个事务发生时,我们需要:

  1. 检查是否有足够的资金可用于执行该交易:
  2. 从余额中扣除交易成本.

如何以及在整个交易期间锁定该行/实体的正确方法是什么?

根据我的阅读,有一些解决方案,其中EF标记一个实体,然后在将其保存回数据库时对该标记进行比较,但是当另一个用户/程序已经编辑了该数量时它又做了什么?

我能用EF实现这个目标吗?如果没有,我有什么其他选择?

调用存储过程可能允许我正确地锁定行,这样当程序A锁定它时,没有其他人可以访问SQL Server中的那一行吗?

c# sql-server entity-framework rowlocking entity-framework-6.1

12
推荐指数
2
解决办法
1万
查看次数

SQL Server中的并发执行

表模式(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 sql-server rowlocking

10
推荐指数
1
解决办法
1772
查看次数

在SQL Server Management Studio 2008中编辑数据行时是否锁定了数据行?

当我右键单击SQL Server Management Studio中的表并选择"编辑前200行"时,如果有的话,我正在查看的数据是否会被锁定?

我的一位同事表示,以这种方式查看数据时,数据行可以被锁定(我想当他说你把光标放在行上并开始编辑数据时).

这是唯一可以在此上下文中锁定数据的时间吗?

sql-server-2008 rowlocking

7
推荐指数
1
解决办法
1562
查看次数

MySQL - 更新表行而不锁定行

我有一个要求,我们需要在更新时不持有锁的情况下更新行。

以下是需求的详细信息,我们将每 5 分钟在一个表上运行一次批处理,update blogs set is_visible=1 where some conditions该查询将在数百万条记录上运行,因此我们不想在更新期间阻止所有行写入。

我完全理解没有写锁的含义,这对我们来说很好,因为 is_visible 列将仅由该批处理过程更新,其他线程不会更新该列。另一方面,同一个表的其他列会有很多更新,我们不想阻止这些更新

mysql batch-processing rowlocking

7
推荐指数
1
解决办法
1万
查看次数

SQL Server ROWLOCK over SELECT如果不存在INSERT事务

我已经从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

6
推荐指数
1
解决办法
1万
查看次数

在 MSSQL 服务器中使用行锁进行更新

我试图理解 SQL Server 中的 ROWLOCK 以在锁定记录后更新记录。这是我的观察,想确认 ROWLOCK 是否像表或页锁之类的东西,或者我没有正确尝试过。ROWLOCK 应该是仅对行的锁定,而不是对表或页的锁定。

这是我尝试过的:

我创建了一个简单的表:row_lock_temp_test有两列IDName,没有 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)

sql-server rowlocking

6
推荐指数
1
解决办法
9436
查看次数