SQL Server:如何持有select查询的排它锁?对于mysql,
select * from Employee e
where e.id=123
for update
其他并发事务无法读取或写入所选行。
如何在SQL server上实现同样的功能?
SELECT *
FROM Employee e
WITH (HOLDLOCK, ROWLOCK)
WHERE e.id = 123;
对于(HOLDLOCK,row LOCK ),它是否持有所选行的读锁定?有了读锁,其他事务仍然可以读取锁定的行,对吗?
我有一张桌子,名叫spot和reservation。spot包含spot_id和spot_status列。对于预订过程,我启动一个事务,然后使用此查询获取特定行的锁。我正在使用php和mysql。
//start transaction
SELECT * FROM spot WHERE spot_id = $id FOR UPDATE ;
//if this query is successful then
1. set spot status to 1
2. insert corresponding values in reservation table.
and the
这类问题已经张贴了几次,但在以下情况下所提供的解决办法并不理想。在第一个查询中,我选择执行第一个查询时已知存在的表名。然后,在循环遍历它们时,我希望查询所选表中的记录数,但前提是它们仍然存在。问题是,在循环期间,一些表被另一个脚本删除。例如:
SELECT tablename FROM table
-- returns say 100 tables
while (%tables){
SELECT COUNT(*) FROM $table
-- by the time it gets to the umpteenth table, it's been dropped
测试设置
我有一个Server 2014和一个简单的表MyTable,其中包含Code (int)和Data (nvarchar(50))列,没有为该表创建索引。
表中有4项记录,其方式如下:
1, First
2, Second
3, Third
4, Fourth
然后在事务中运行以下查询:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
DELETE FROM dbo.MyTable
WHERE dbo.MyTable.Code = 2
我有一个受影响的行,我不发出提交或回滚。
接下来,我开始另一项
我的网站有问题..。在过去的几天里,随机的时候网站变得非常缓慢。我开始尽我所能去调查。我看到MySQL进程使用了服务器可用内存的85-95%。(我也应该升级我的记忆吗?)
我检查了我的MySQL进程日志,我注意到了一个巨大的查询列表:Waiting for table level lock
但我也注意到,所有这些与“表级锁”有关的查询,仅仅是与我的表“用户”有关的查询。
我有另外20个表,有不断的查询,但我没有看到它们在列表上。所以我想问题就出在users表上了?
我想知道如何改进表,并最终删除表级锁?
我还运行了这个:
SHOW VARIABLES LIKE 'query_cache
我正在使用PHP运行几个mysql查询,以更改几个表中的值。
基本上是这样的(简化的伪码)
$amount = (SELECT amount FROM wallet WHERE id = 1);
$amount = somelongcomplicatedtask($amount);
(UPDATE wallet SET amount = $amount WHERE id = 23);
可以有许多脚本并行使用mysql数据库(写/读),我需要确保以下内容:
如果其中一个查询失败,到目前为止完成的所有工作都将被恢复(我可以使用事务)。
当我使用表钱包(1和23)中的两行时,它们需要被锁定,
每次我使用MySQL的CREATE TABLE AS SELECT ...时,从其中选择的所有表/索引都是在查询的持续时间()锁定的。我真的不明白为什么?有办法绕过这件事吗?
使用: MySQL 5.1.41和InnoDB
添加了示例:
例如,以下查询可能需要10分钟才能完成:
CREATE TABLE temp_lots_of_data_xxx AS
SELECT
a.*
b.*
c.*
FROM a
LEFT JOIN b ON a.foo = b.foo
LEFT JOIN c ON a.foo = c.foo
在上述查询期间尝试更新表a、b或c中的值将等待上述
根据参考SELECT ... LOCK IN SHARE MODE sets an IS lock and SELECT ... FOR UPDATE sets an IX lock.在MySQL 5.7。
我真的很困惑,因为IX和IX兼容。支持的意思是什么?
另一方面,我尝试了如下:
Sess1 db> BEGIN;
SELECT * FROM t WHERE id = 1 FOR UPDATE; -- id is a primary key
Sess2 db> BEGIN;
SELECT * FROM t WHERE id
我有两张桌子
spies |
--------- |
id | PK
weapon_id | FK
name |
weapons
--------- |
id | PK
name |
我试图澄清这两个SQL更新(当使用MySQL innoDB时)是否存在差异。
查询1:
UPDATE spies SET name = 'Bond', weapon_id = 1 WHERE id = 1
或
查询2:
UPDATE spies SET name = 'Bond' WHERE id = 1
我听
我目前正在规划一个运行线程池的Java服务器,该线程池接受需要进行数据库读取/更新的客户端连接。
单行上有多个读/写的情况会怎样呢?我该如何管理呢?我应该在Java中创建一个队列,还是MySQL可以处理这种事情?
例如,我计划使用事务,其中我将使用以下内容来锁定一行:
Select <columns> from <table> where <condition> FOR UPDATE;
问:如果另一个线程进入并希望在第一次提交之前更新同一行,该怎么办?查询是否会失败,或者MySQL是否会将其保留一段时间并等待第一个锁释放?
我目前的解决方案是:我正在考虑这样
我使用自定义的堆栈溢出数据库(180 is )并运行一个简单的更新查询:(用户表上只有一个聚集索引)
Begin Tran
Update U set U.Reputation=100000
from StackOverflow.dbo.Users as U
where U.CreationDate = '2008-10-10 14:26:33.540'
查询计划:
📷
此查询将导致锁升级。我无法使用另一个窗口中的同一个表运行查询:
select * from StackOverflow.dbo.Users as U where U.id=11
如果我在查询结束时添加opti
我使用MySQL中的行锁定(事务)来创建作业队列。使用的引擎是InnoDB。
SQL查询
START TRANSACTION;
SELECT *
FROM mytable
WHERE status IS NULL
ORDER BY timestamp DESC LIMIT 1
FOR UPDATE;
UPDATE mytable SET status = 1;
COMMIT;
根据这个,
The problem with SELECT FOR UPDATE is that it usually creates a single synchronization point for
我有一个非常慢的查询,需要不时地在MySQL数据库上运行。
我发现更新正在查询的表的尝试会被阻止,直到查询完成。
我想这是有意义的,因为否则查询的结果可能不一致,但对我来说并不理想,因为查询的重要性要比更新低得多。
所以我的问题有两部分:
出于好奇,MySQL在这种情况下到底做了什么?它是否在查询期间锁定表?还是试着在更新之前锁定它?
是否有办法使缓慢的查询不阻塞?我想可能的选择是:
- Kill the query when an update is needed.
- Run the query on a copy of the table as it was just b
说SELECT FOR UPDATE设置一个IX锁。IX锁是意图排他锁,当发出时它意味着“事务T打算在扫描行上设置X(排它)锁”。这意味着在SELECT FOR UPDATE成功之前,它必须先获得IX,然后才能获得X。MySQL术语表表示,关于意图排他性锁:
意图锁定
一种适用于表级别的锁,用于指示事务打算在表中的行上获取什么样的锁。不同的事务可以在同一表上获取不同类型的意图锁,,但是获取表上的意图排他(IX)锁的第一个事务阻止其他事务获取表上的任何S或X锁。相反,获取表上的意图共享(IS)锁的第一个事务阻止其他事务获取该表上的任何X锁。两阶段进程允许按顺序解析锁请求,而不阻塞兼容的锁和相应
我正在运行一个真正的旧版本的mysql(3.23.56)。一切都很好,希望当我想要删除一个表的所有条目。我检查过查询,如drop、select、update,它们的行为都是正确的。即使我使用像delete from t1 where id='5'这样的sql,我也能得到正确的答案。但是对于delete from t1 (它将删除表t1中的所有条目),它显示
第1行中的错误2013 :查询期间与mysql服务器的连接丢失。
然后我就重新开始了。甚至这个表也只有一个条目!
我检查了错误日志。它显示:
Number of processes running now: 0
Fri J
寻找一些帮助和建议,请从超级大师MySQL/PHP专业人员谁可以抽出他们的时间。
我有一个用PHP/MySQL编写的web应用程序,它多年来一直在发展,并获得了大量的搜索。现在,当使用MySQL LOAD data INFILE处理新行的各种日常数据转储时,它遇到了瓶颈。
它是一个大约有150万行的大型MyISAM表,所有的SELECT查询都发生在它上面。当这些操作发生在大约600k行的LOAD DATA INFILE (和删除过期数据)的过程中时,它们只是被备份并花费大约30+分钟来释放,使得任何这些搜索都是徒劳的。
我需要想出一种方法来更新该表,同时保留在合理的时间范围内提供选择结果的能力