我不清楚(通过阅读MySQL文档)如果在MySQL 5.1上的INNODB表上运行以下查询,将为内部db更新的每个行创建WRITE LOCK(总共5000个)或锁定批处理中的所有行.由于数据库负载很重,这非常重要.
UPDATE `records`
INNER JOIN (
SELECT id, name FROM related LIMIT 0, 5000
) AS `j` ON `j`.`id` = `records`.`id`
SET `name` = `j`.`name`
Run Code Online (Sandbox Code Playgroud)
我希望它是每排,但由于我不知道如何确保它是如此,我决定问一个有更深入了解的人.如果不是这种情况并且db会锁定集合中的所有行,那么如果你给我解释原因,我将感激不尽.
我在一个表中有5行(1到5)。我要锁定第2行以进行一些更新,与此同时,如果有人尝试更新第4行,那么他应该可以更新。
我正在下面的代码中尝试此操作,但是我觉得它将锁定放在表级别而不是行级别。
------第一场
START TRANSACTION;
SELECT * FROM test WHERE t=1 FOR UPDATE;
UPDATE test SET NAME='irfandd' WHERE t=2;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
-----会话2(已被阻止)
START TRANSACTION;
UPDATE test SET NAME='irfandd' WHERE t=4;
COMMIT;
Run Code Online (Sandbox Code Playgroud) 在尝试避免死锁并同步来自多个服务的请求时,我正在使用ROWLOCK,READPAST.我的问题是我应该把它放在一个包含CTE,子查询和CTE上的更新语句的查询中?是否有一个关键点或三个地方都应该有它(下图)?或者也许有更好的方法来编写这样的查询,以便我只能选择将要更新的行.
alter proc dbo.Notification_DequeueJob
@jobs int = null
as
set nocount on;
set xact_abort on;
declare @now datetime
set @now = getdate();
if(@jobs is null or @jobs <= 0) set @jobs = 1
;with q as (
select
*,
dense_rank() over (order by MinDate, Destination) as dr
from
(
select *,
min(CreatedDt) over (partition by Destination) as MinDate
from dbo.NotificationJob with (rowlock, readpast)
) nj
where (nj.QueuedDt is null or (DATEDIFF(MINUTE, nj.QueuedDt, @now) > 5 and nj.CompletedDt is null))
and …Run Code Online (Sandbox Code Playgroud) 让我用一个 SQL 示例来开始我的问题。
这是表设置:
x和y. 与y.x指x.id。x(id=1)。START TRANSACTION;
CREATE TABLE `x` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`value` INT(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
CREATE TABLE `y` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`x_id` INT(11) NOT NULL,
`value` INT(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_x` FOREIGN KEY (`x_id`)
REFERENCES `x` (`id`)
) ENGINE=INNODB;
INSERT INTO x values (1,123456);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
现在启动一个事务 (Trx A) 来更新 中的行x。 …
这是一个扩展,是否可以强制SQL Server中的行级锁定?.这是用例
我有帐户表,帐户号码,余额等.许多应用程序正在使用此表.很可能在我修改帐户时,其他人正在修改另一个帐户.所以预期的行为是我会锁定我的帐户(ROW)而另一个用户将锁定他的(另一个ROW).
但SQL Server 2008 R2将此锁定升级到页面/表,第二个用户获得超时异常.我已经尝试了所引用问题中提到的所有解决方案,但没有任何工作.
如何强制SQL Server仅锁定行级锁定?或者如何以与页面/表锁定一起使用的方式修改此模型?
编辑 此更新通过其PK以单个记录为目标,并且已编入索引,因此只有一行正在更新/锁定,并且该过程不会超过一分钟
编辑 现在它看起来很奇怪.我正在为DAL使用ORM库,它打开了多个连接,我已经向他们的支持提出了问题.但是,出于测试目的,我打开了两个关于查询工具的会话,并做了以下
Session # 1
begin tran
UPDATE myTable SET COL_1 = COL_1 WHERE COL_1 = 101;
Session # 2
SELECT COL_1 FROM myTable WHERE COL_1 = 101;
Run Code Online (Sandbox Code Playgroud)
Session#2中的查询超时!!! 对其他值的查询COL_1工作正常.现在它看起来如果同一记录在另一个会话中处于编辑模式,则会阻止SELECT.
虽然Oracle确实支持在被其他会话修改时选择一行(使用默认的params/no关键字),但SQL Server没有(使用默认的params/no关键字),所以看起来问题出在库中.
我已经看过许多帖子,解释了Select FOR UPDATE的用法以及如何锁定行,但是我无法找到任何解释当代码尝试读取被锁定的行时发生的情况.
例如.假设我使用以下内容:
$con->autocommit(FALSE);
$ps = $con->prepare( "SELECT 1 FROM event WHERE row_id = 100 FOR UPDATE");
$ps->execute();
...
//do something if lock successful
...
$mysqli->commit();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我如何确定我的锁是否成功?行已被锁定时处理场景的最佳方法是什么?
对不起,如果在某处描述,但我似乎找到的只是"快乐路径"的解释.
我正在开发一个从 Teradata DWH 获取一些数据的应用程序。LOCK ROW FOR ACCESSDWH 开发人员告诉我在所有查询之前使用SELECT,以避免延迟对该表的写入。
由于非常熟悉 MS SQL Servers 的WITH(NOLOCK)提示,我认为LOCK ROW FOR ACCESS它是等效的。但是,INSERTorUPDATE语句不允许使用LOCK ROW FOR ACCESS(我不清楚为什么会失败,因为它应该应用于语句选择的表,而不是我插入的表):
-- this works
LOCK ROW FOR ACCESS
SELECT Cols
FROM Table
-- this does not work
LOCK ROW FOR ACCESS
INSERT INTO SomeVolatile
SELECT Cols
FROM PersistentTable
Run Code Online (Sandbox Code Playgroud)
我已经看到LOCKING TABLE ... FOR ACCESS可以使用它,但不清楚它是否符合我的需要(NOLOCK等效 - 不阻止写入)。
问题: 在语句中进行选择时,应该使用什么提示来最大程度地减少写入延迟INSERT?
我通过下面的存储过程随机从DB中选择可用的登录信息.但是当多个线程想要获取可用的登录信息时,虽然我正在更新记录的时间戳字段,但是会返回重复的记录.
如何在此处锁定行,以便一次返回的记录不会再次返回?
把
WITH(HOLDLOCK,ROWLOCK)
没有帮助!
SELECT TOP 1 @uid = [LoginInfoUid]
FROM [ZPer].[dbo].[LoginInfos]
WITH (HOLDLOCK, ROWLOCK)
WHERE ([Type] = @type)
Run Code Online (Sandbox Code Playgroud)
...... ......
ALTER PROCEDURE [dbo].[SelectRandomLoginInfo]
-- Add the parameters for the stored procedure here
@type int = 0,
@expireTimeout int = 86400 -- 24 * 60 * 60 = 24h
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @processTimeout int …Run Code Online (Sandbox Code Playgroud) rowlocking ×8
innodb ×4
mysql ×4
database ×1
foreign-keys ×1
locking ×1
mysqli ×1
php ×1
sql ×1
sql-server ×1
t-sql ×1
teradata ×1