Questions tagged «locking»

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

2
SQL Server如何确定选择表时锁定的顺序?
当系统处于负载状态时,我有两个存储过程处于死锁状态。当Proc B插入同一张表时,Proc A从表中选择。锁定图显示Proc A具有Proc B希望为其IX模式锁定的S模式页面锁定,但是Proc A正在等待针对Proc B已经具有IX模式页面锁定的另一页面的S模式页面锁定。 。 显然,可以通过确保两个查询以相同的顺序锁定表中的页面来解决此问题,但是我不知道该怎么做。 我的问题是:SQL Server如何确定在执行INSERT和SELECT时锁定页面的顺序,以及如何修改此行为?

1
由于数据移动,无法继续使用NOLOCK进行扫描
我们运行SQL Server 2000,并且每晚都有一些此类错误。 Could not continue scan with NOLOCK due to data movement 引发此错误的查询是一个大型的复杂查询,连接了十几个表。我们的基础数据可以经常更新。 文化上的“最佳实践”是,过去,引入NOLOCK提示可以提高性能并提高并发性。该查询不必是100%准确的,即我们可以忍受脏读等。但是,尽管我们拥有所有这些锁定提示,但我们仍在努力理解为什么数据库抛出此错误。 任何人都可以对此有所了解-彬彬有礼,我实际上是程序员,而不是DBA :) PS:我们已经应用了下面提到的修复程序:http : //support.microsoft.com/kb/815008

2
在IsolationLevel.ReadUncommitted上发布的共享锁
我读到,如果我使用IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,看到了以下锁: 资源类型:HOBT 请求模式:S(共享) 什么是HOBT锁?与HBT(堆或二叉树锁)有关的东西吗? 为什么我还会得到S锁? 如何在不打开隔离级别快照选项的情况下进行查询时避免共享锁定? 我正在SQLServer 2008上对此进行测试,并且快照选项已设置为off。该查询仅执行选择。 我可以看到Sch-S是必需的,尽管SQL Server似乎没有在锁查询中显示它。它怎么仍然发出共享锁?根据: 设置事务隔离级别(Transact-SQL) 在该READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。 所以我有点困惑。

2
行级和页级锁定之间的区别和后果
尝试运行维护计划时,出现以下错误: 执行查询“”失败,并出现以下错误:“表”“上的索引”“(分区1)无法重新组织,因为页面级锁定已禁用。” 当前,我们已在此索引上启用行级锁定。我可以启用页面级别锁定,但是不确定会产生什么影响。 我的问题是:这两种锁定方案之间有什么区别,它们在生产中的实际后果是什么?

2
取消等待锁定的PostgreSQL ALTER TABLE查询是否安全?
我们在ALTER TABLE几个小时前开始查询,直到最近(通过pg_stat_activity)才意识到它正在等待锁。我们发现了另一个查询,该查询在我们要更改的表上拥有一个锁,并且不让它走。 我们的查询是一个“简单”查询(更改列数据类型),但是它在大型表上运行。 我们决定杀死而不是杀死保持锁定状态的进程,而不是杀死ALTER TABLE。 我们并没有包裹ALTER TABLE在一个事务中。 据我了解,我们的查询正在等待锁的事实意味着它一直在等待锁,并且从未更改过任何内容。 这是真的?我们完全取消ALTER TABLE查询是否安全?还是查询已经修改了某些内容并取消它会使我们的数据库处于某种中间状态? PS:计划使用取消它SELECT pg_cancel_backend(pid);。如果这是个坏主意,请告诉我。

1
如何以线程安全的方式查询和增加值(计数器)?(避免比赛条件)
在每行有一个计数器(只是一个整数值)的表,我需要的电流值,并增加它在同一时间。 实际上,我想这样做: SELECT counter FROM table WHERE id=123 UPDATE table SET counter=counter+1 WHERE id=123 但是,作为两个查询执行此操作显然不是线程安全的:执行相同操作(在同一行上)的多个进程可能会获得相同的计数器值。我需要它们全部都是唯一的,因此每个过程都将获得实际的当前值并将其增加一个。 我可以想到一种在每行实现一个手动锁的构造,但是我想知道是否有更简单的方法可以做到这一点?
10 mysql  locking 

1
如何防止SQLite数据库锁定?
从SQLite FAQ中,我知道: 多个进程可以同时打开同一个数据库。多个进程可以SELECT同时进行。但是,在任何时候,只有一个进程可以对数据库进行更改。 所以,据我了解,我可以:1)从多个线程读取DB(SELECT)2)从多个线程读取DB( SELECT)和write从单个线程(CREATE,INSERT,DELETE) 但是,我读到有关预写日志记录的问题,它提供了更多的并发性,因为读者不会阻止作者,而作家也不会阻止读者。读写可以同时进行。 最后,当我找到它时,我已经完全糊涂了: 这是导致SQLITE_LOCKED错误的其他原因: 试图CREATE或DROP表或索引而SELECT声明仍悬而未决。 当a SELECT在同一表上处于活动状态时,尝试写入该表。 SELECT如果未将sqlite设置为在多线程应用程序中尝试在同一表上同时执行两个操作。 对数据库文件的fcntl(3,F_SETLK调用失败。例如,这可能是由NFS锁定问题引起的。针对此问题的一种解决方案是将DB移开,然后将其复制回来,使其具有新的Inode值 那么,我想为自己澄清一下,有必要避免锁吗?我可以同时从两个不同的线程读写吗?谢谢。
10 locking  sqlite 

2
“签出”记录以进行处理的策略
我不确定是否有一个命名模式,或者没有,因为这是一个糟糕的主意。但是我需要我的服务才能在主动/主动负载平衡环境中运行。这仅是应用服务器。该数据库将位于单独的服务器上。我有一项服务,该服务将需要为表中的每个记录运行一个过程。此过程可能需要一到两分钟,并且每n分钟重复一次(可配置,通常为15分钟)。 拥有需要处理的1000条记录的表,以及针对同一数据集运行的两个服务,我希望每个服务“签出”要处理的记录。我需要确保一次只有一个服务/线程正在处理每个记录。 我的同事过去曾经使用过“锁定表”。将记录写入此表以在逻辑上锁定另一个表中的记录(该另一个表是静态的,并且添加了非常偶尔的新记录),然后将其删除以释放锁定。 我想知道对于新表来说,是否有更好的一列来表明它何时被锁定以及当前是否被锁定,而不是不断插入一个删除项,这会更好。 有人对这种事情有提示吗?是否有建立长期(逻辑)逻辑锁定的模式?如何确保一次仅锁定一项服务的任何提示?(我的同事使用TABLOCKX锁定整个表。)


1
在Postgres中优化并发更新
我正在运行并发Postgres查询,如下所示: UPDATE foo SET bar = bar + 1 WHERE baz = 1234 每个查询都会影响固定的K个行数,而且我找不到一种方法来强制更新行的顺序,最终导致死锁。当前,我通过手动执行顺序来解决此问题,但这意味着我必须执行比平时更多的查询,同时还将搜索复杂度从O(log N + K)提升到O(K log N)。 有没有一种方法可以提高性能而又不会导致死锁?我怀疑只要Postgres以与扫描行相同的顺序更新行,就可以用(baz)索引替换索引(baz, id),这是值得追求的方法吗?

5
为什么乐观锁定比悲观锁定快?
两种形式的锁定都会导致一个进程等待记录的正确副本(如果该记录当前正被另一个进程使用)。使用悲观锁定,锁定机制来自数据库本身(本机锁定对象),而使用乐观锁定,锁定机制是某种形式的行版本控制,例如时间戳,用于检查记录是否“陈旧”。 但是,两者都会导致第二个进程挂起。所以我问:为什么乐观锁定通常比悲观锁定快/优?并且,在某些用例中,悲观胜于乐观吗?提前致谢!

3
查询时SSRS是否锁定表?
我的高级DBA告诉我,默认情况下,SQL Query执行不会锁定该表。 我的SQL Server Reporting Services(SSRS)报告存在一些问题,似乎在锁定方面出现了一些问题并出现了一些错误。 我做了一些谷歌搜索,但没有找到任何东西。 SSRS报告是否锁定正在查询的表? 是否有任何MSDN文档专门记录此行为?

3
如何解决enq:TX-行锁争用?
我有以下情况。 我有RAC。在两个节点上都有锁。 在第一个节点上 SID EVENT USERNAME BLOCKING_SESSION ROW_WAIT_OBJ# OBJECT_NAME LOCKWAIT SQL_ID STATUS 1 102 enq: TX - row lock contention MYUSER 155 136972 TABLE1V 0000000810EFA958 5f4bzdg49fdxq ACTIVE 2 111 enq: TX - row lock contention MYUSER 155 136972 TABLE1V 0000000810EFAC98 5f4bzdg49fdxq ACTIVE 阻止会话信息 SID EVENT USERNAME ROW_WAIT_OBJ# OBJECT_NAME LOCKWAIT SQL_ID …

2
SQL Server事务超时
SQL Server 2008 R2中是否有办法导致涉及事务的数据库修改超时?在一种情况下,我们的应用程序代码会挂起或引发异常,并且无法执行回滚或提交。然后,这导致其他会话挂起,等待事务完成。

3
SQL Server-非阻塞选择语句的隔离级别是多少?
我有一个运行很长时间的事务(称为T1),该事务在SQL Server 2008 R2中的表上执行一些删除,更新和插入操作。同时,另一个进程会定期运行该表中的select语句。 在默认隔离设置下(我认为是READ COMMITTED吗?),T1会阻止所有select语句运行,直到事务提交或回滚为止。 我希望看到的是即使事务正在进行中,select语句也可以在一致的数据上起作用。我相信SNAPSHOT隔离可以提供帮助,但是不确定我的方向是否正确。这是此应用程序的最佳隔离级别吗? 其次,我对调用select语句的过程没有任何控制,但对调用T1的.NET应用程序有控制。在select语句和T1上是否都需要进行任何隔离级别更改,或者仅将T1标记为具有不同的隔离级别就足够了吗?

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.