Questions tagged «locking»

通过临时授予请求锁定的进程的独占访问权限来管理对共享数据或资源的并发访问的机制。

1
MySQL:事务会锁定行吗?
我以前没有尝试过使用MySQL事务,我只是想澄清一下。 如果两个用户在非常精确的时间执行查询,MySQL将如何处理呢?例如,用户正在尝试更新记录。 user1:更新表集column = column-4,其中column_id = 1; user2:更新表集column = column-7,其中column_id = 1; 现在,如果我使用事务,MySQL是否会选择首先执行哪个查询并锁定第二个用户,直到提交第一个查询?是表锁还是行锁? 如果第三位用户发出选择声明怎么办?MySQL将返回什么值? PS这将在Innodb上。


3
跟踪,调试和修复行锁争用
迟到了,我遇到了很多行锁争用。争用的表似乎是特定的表。 通常就是这样- 开发人员1从Oracle Forms前端屏幕开始事务 开发人员2使用同一屏幕从不同的会话开始另一笔交易 大约5分钟后,前端似乎没有反应。检查会话显示行锁争用。每个人都抛出的“解决方案”是终止会话:/ 作为数据库开发人员 如何消除行锁争用? 是否有可能找出存储过程的哪一行引起这些行锁争用 减少/避免/消除此类问题的通用准则是什么? 如果您觉得此问题过于开放/信息不足,请随时进行编辑/让我知道-我会尽力补充一些其他信息。 有问题的表有很多插入和更新,我想说它是最繁忙的表之一。SP相当复杂-为简化起见-它从各种表中获取数据,将其填充到工作表中,在工作表上发生许多算术运算,并且将工作表的结果插入/更新到有问题的表中。 数据库版本为Oracle Database 10g企业版10.2.0.1.0版-64位。逻辑流在两个会话中以相同的顺序执行,事务未保持打开状态的时间过长(或至少我认为如此),并且在事务的主动执行过程中发生了锁定。 更新:表行数比我预期的要大,大约为310万行。另外,在跟踪会话后,我发现该表的几个更新语句没有利用索引。为什么会这样-我不确定。where子句中引用的列已建立索引。我目前正在重建索引。

1
我应该如何解释mysql慢查询日志中的“锁定时间”?
我试图了解如何最好地解释查询的锁定时间,这些查询显示在我们的MySQL慢查询日志中。 例如,如果UPDATE查询的锁定时间为10秒。我认为这是更新查询获得锁之后的总时间。即使它正在等待先前的选择查询完成但不执行UPDATE操作本身,时钟也应该滴答作响,因为它锁定了所有在UPDATE查询之后排队的SELECT查询。 以及SELECT查询锁如何。为什么某些选择查询具有锁定时间?是因为有后续的UPDATE查询,因此他们将表锁定在一起。
12 mysql  locking 


2
有理由使用SELECT…WITH XLOCK?
我面临着一些反复出现的死锁,其中之一是键锁,并且包含带有XLOCK提示的SELECT查询,该查询成为了死锁的受害者。另一个语句是对其中一个表的INSERT,该表是第一个查询的视图的一部分。 视图: create view dbo.viewE as select * from dbo.E where myValue > 13000 选择查询: select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() INSERT语句: INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate()) 基础表dbo.E在大约20列中拥有约300万行,其中有些是ntext。 取出查询并使用两个事务手动进行模拟,该行为是可重现的。如果从选择中删除了XLOCK,则行为会更改。 死锁图: <deadlock-list> <deadlock victim="process222222221"> <process-list> <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" …

1
锁定Postgres以进行UPDATE / INSERT组合
我有两张桌子。一个是日志表;另一个是日志表。另一个实质上包含只能使用一次的优惠券代码。 用户需要能够兑换优惠券,这将在日志表中插入一行并将优惠券标记为已使用(通过将used列更新为true)。 自然,这里存在明显的比赛条件/安全性问题。 在过去的mySQL世界中,我做过类似的事情。在那个世界中,我将全局锁定两个表,在一次只能执行一次的前提下,确保逻辑安全,然后在完成后解锁表。 Postgres中有更好的方法吗?特别是,我担心锁是全局的,但不一定是全局的-我真的只需要确保没有其他人试图输入该特定代码,那么也许行级锁会起作用吗?

1
Sch-M WAIT阻止SQL Server 2014中的Sch-S,但不阻止SQL Server 2008 R2?
最近,我们将生产实例从SQL 2008 R2迁移到了全新的SQL 2014服务器。我们通过使用Service Broker发现了一个有趣的场景。考虑Broker Enabled = true带有MyService和的数据库MyQueue。在此队列上禁用了毒药消息处理。队列中至少有2条活动会话与消息。 在一个进程(SPID 100)中执行: BEGIN TRANSACTION; DECLARE @conversation_group_id UNIQUEIDENTIFIER; RECEIVE TOP (1) @conversation_group_id = conversation_handle FROM MyQueue; 请注意,我们保持交易未结。想象这是一个.NET程序,它在某些外部资源上等待了很长时间。通过sys.dm_tran_locks我们看到,此SPID已被授予队列上的IX锁。 | type | resource_id | mode | status | spid | | OBJECT | 277576027 | IX | GRANT | 100 | 在一个单独的进程(SPID 101)中执行五次: BEGIN TRANSACTION; …

4
MySQL InnoDB甚至在READ COMMITTED中也将主键锁定在删除状态
前言 我们的应用程序运行多个线程,这些线程DELETE并行执行查询。这些查询会影响隔离的数据,即,不可能存在并发DELETE发生在来自不同线程的同一行上。但是,对于每个文档,MySQL DELETE均对语句使用所谓的“下一个键”锁定,该锁定既锁定匹配键又锁定一些间隙。这会导致死锁,我们发现的唯一解决方案是使用READ COMMITTED隔离级别。 问题 执行DELETE具有JOINs个大表的复杂语句时会出现问题。在特定情况下,我们有一个带有警告的表,该表只有两行,但是查询需要从两个单独的INNER JOINed表中删除属于某些特定实体的所有警告。查询如下: DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 当day_position表足够大时(在我的测试案例中有1448行),那么即使使用READ COMMITTED隔离模式的任何事务也会阻塞整个 proc_warnings表。 这个问题始终重现这个样本数据- http://yadi.sk/d/QDuwBtpW1BxB9都在MySQL 5.1(在59年1月5日检查)和MySQL 5.5(在MySQL 5.5.24检查)。 编辑:链接的示例数据还包含查询表的架构和索引,为方便起见,在此处复制: CREATE TABLE `proc_warnings` ( `id` int(11) NOT NULL AUTO_INCREMENT, …

1
SQL Server何时获取锁?
此处找到的SQL Server隔离级别列表指出,在事务内获取的写锁将保留到事务结束。但是,它没有提及何时获得这些锁。 默认情况下是否在事务开始时或仅在需要时获取锁?如果后者为真,那么在大型事务中尽可能晚执行写操作以最小化持有X锁的时间量是否有利?

4
如何使用PostgreSQL在每一行上保持唯一的计数器?
我需要在document_revisions表中保留一个唯一的(每行)修订号,该修订号的作用域是一个文档,因此它不是整个表唯一的,而仅是相关文档的唯一。 我最初想到的是: current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); 但是有比赛条件! 我正在尝试使用来解决它pg_advisory_lock,但是文档有点稀缺,并且我不太了解它,我也不想错误地锁定某些东西。 以下内容是否可以接受,或者我做错了,还是有更好的解决方案? SELECT pg_advisory_lock(123); current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); SELECT pg_advisory_unlock(123); 我是否应该为给定操作(key2)锁定文档行(key1)?因此,这将是正确的解决方案: SELECT pg_advisory_lock(id, 1) FROM documents WHERE id = …

2
当记录在Oracle中被锁定时,我们可以知道哪个记录被锁定了吗?
当记录被锁定时,我们可以知道哪个被锁定了吗? 如何获取记录的rowid或其他信息? 我可以通过此sql获取一些信息 SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW# FROM v$locked_object a, dba_objects b, v$session c WHERE a.object_id = b.object_id AND a.SESSION_ID = c.sid(+) 我在网上找到了一种通过使用函数来获取rowid的方法 DBMS_ROWID.ROWID_CREATE() 但这似乎不起作用。
10 oracle  locking 


2
防止查询等待表级锁定的方法
将客户的数据库移至其他服务器后,我们遇到了问题。这应该会对站点的性能产生积极影响,但是MyISAM中的表锁定存在问题。(我听说过使用InnoDB代替MyISAM,但是我们不能在不久的将来更改引擎)。 我们可以将其发现为更新查询,该更新查询是由主持人在文章站点上激活评论时执行的。这是过程: 更新查询已处理 SET status = 1 WHERE id = 5(已设置索引) 页面的缓存文件被删除 此时,整个页面变慢。数据库本身忙了几分钟。我几次获取进程列表,并看到了大约60个不同选择查询的条目,它们都处于等待表级锁定的状态。 1.我不理解为什么表上的此更新article_comments会影响表article等待表级锁定的选择语句。在进程列表中,几乎所有等待查询都来自该表。我已经读过一个事实,即更新/插入优先于选择,并且这可能会导致此类问题,但是当注释被激活时,articles-table本身不会被更新,因此选择不应该等待。我错过了吗? 2.除了更改为InnoDB以外,还可以采取其他措施来防止此行为或至少获得更好的平衡吗?对于将数据库移动到新服务器之前没有出现此问题,我感到非常恼火。我猜有一些配置错误,但我不知道如何识别。

2
MySQL在创建表为SELECT时锁定
我正在运行以下(虚拟)查询 CREATE TABLE large_temp_table AS SELECT a.*, b.*, c.* FROM a LEFT JOIN b ON a.foo = b.foo LEFT JOIN c ON a.bar = c.bar 假设查询需要10分钟才能运行。在表a,b或c运行时尝试更新它的值将等待上面的查询首先完成。我想避免这种锁定(数据一致性不重要)。我该如何实现? 使用:MySQL 5.1.41和InnoDB表 ps SET事务隔离级别读取未提交;行为无变化 更新 在执行查询时,SHOW ENGINE INNODB STATUS的输出如下(我在这里故意进行了非常慢的查询) ===================================== 120323 15:26:29 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 8 …
10 mysql  locking  ctas 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.