问题标签 [table-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 在 MySQL 中对大表进行 UPDATE 查询
我有一个包含 21M 记录的 MySQL 数据库,我正在尝试对大约 1M 记录进行更新,但查询失败ERROR 1206 (HY000): The total number of locks exceeds the lock table size.
是否可以在不获取锁的情况下更新表?
我无权更改 MySQL 配置参数,例如innodb_buffer_pool_size
. 有没有不同的方法来实现相同的目标?
谢谢
编辑:
- 我已经分批尝试了 5000 个,它工作了几次,但我得到了同样的错误
- 我试过 LOCK TABLES 来锁定整个表,但它仍然不起作用。
php - php崩溃后mysql表被锁定
我有一个 MySQL 数据库和一个 innoDB 表。我有一个连接、锁定表、进行一些更新、然后解锁表的 php 页面。PHP 页面正在通过 wamp 与 apache 一起提供。
php 页面将文件上传到数据库。我决定通过上传一个大于分配给 PHP 内存的文件来模拟系统崩溃。这肯定导致了这个错误:允许的内存大小为 18874368 字节用尽(试图分配 6176754 字节)。之后,在更新期间被锁定的表仍然被锁定。
在出现此错误后尝试访问表时出现的错误是:表 'a' 未使用 LOCK TABLES 锁定。我知道这是一个锁定问题,因为我会弹出一个 SQL 提示并尝试从被锁定的表中进行选择,它只是等待,就像在表被锁定时一样。如果我随后终止 Apache 进程,我试图在 SQL 提示符中运行的语句最终将通过。我的猜测是,当我杀死 Apache 进程时,MySQL 意识到由于连接被切断,表锁应该被释放。
有任何想法吗??
oracle - Oracle 数据泵导出 (expdp) 锁定表(或类似的东西)
我必须从具有全局索引的分区表中导出数据,该索引必须始终在线,但我在这样做时遇到了麻烦。对于数据导出,我使用的是 Data Pump Export - expdp,并且我只导出一个分区。最老的,不是活跃的。
我的 expdp 命令导出正确的数据,它看起来像这样:
使用数据库的应用程序的连接超时为 10 秒。此参数无法更改。如果 INSERT 查询未在 10 秒内完成,则将数据写入备份文件。
我的问题是,在持续几分钟的导出过程中,一些数据最终出现在备份文件中,而不是数据库中。我想知道为什么,并避免它。
分区每周组织一次,我保持 4 个分区处于活动状态(过去 4 周)。每个分区最大为 3 GB。
我正在使用 Oracle 11.2
sql-server - 如何在 Microsoft SQL Server 中显式锁定表(寻找黑客 - 不合作的客户端)
这是我最初的问题:
我试图弄清楚如何在 SQL Server 中强制执行 EXCLUSIVE 表锁。我需要解决不合作的读者(超出我的控制,封闭源代码的东西),它们明确地将他们的隔离级别设置为未提交的阅读。效果是,无论我在执行插入/更新时指定了多少锁和哪种隔离,客户端只需要设置正确的隔离并返回读取我正在进行的垃圾。
答案原来很简单——
虽然无法触发显式锁,但任何 DDL 更改都会触发我正在寻找的锁。
虽然这种情况并不理想(客户端阻塞而不是见证可重复读取),但它比让客户端覆盖隔离并读取脏数据要好得多。这是带有虚拟触发锁定机制的完整示例代码
赢了!
结果:
sql - 调用存储过程时,何时锁定表以进行插入
我有一个用于报告目的的表格,每次用户从网络运行报告时都会插入数据。根据报表的参数,插入可以从单行到几千行不等。用于插入的 select 语句最多可以为插入运行 60 秒。它已经过优化,但由于数据库的复杂性,我无法进一步调整它。我的问题是 - 表格何时锁定以进行插入?是在调用存储过程时,在执行select语句时,还是在select语句执行完毕时?我想限制表被锁定的时间,以便在运行最多 50,000 行的大型报表时不会影响其他用户。
前任。
谢谢
mysql - MySQL select 与另一个表上的计数查询
我有三个表的简单文章应用程序:
在登录页面上,我想显示最新的文章标题以及文章的作者姓名和评论总数。主要问题是如何获得文章的评论总数,我没有做对。我应该得到以下输出:
在我的实际应用程序中,我在文章表中添加了一个列,用于记录文章的评论总数。当向系统添加新评论时,此列会更新。这样做的问题是在添加新评论时文章表被锁定。在我的应用程序中,每分钟都会添加很多评论。所以我试图通过重写 SQL 查询来避免锁定文章表。
以下是一些测试数据:
mysql - MySQL表锁定:持有者读写,其他会话只读?
是否可以锁定一个表,使持有者可以读写,而其他会话只能读取?
文档似乎建议读锁只允许每个人读,写锁只允许持有者读写,其他会话无权访问。似乎让持有者能够读写而其他会话只能阅读将是一种非常经常需要的行为——也许是最经常需要的行为。
也许在实施这种情况下对性能的影响会太高?
php - 用于 PHP 的与数据库无关的表锁定库
我有一个场景,我认为我需要针对所有活动(读取和写入)锁定表。我正在使用 Propel 1.6.x 并打算编写一个小的额外库来处理锁定。
我的用例是一个版本表,它的主键是(id、creator、version)。列对 (id, creator) 实际上是另一个表上的 PK。插入新行时,会在 PHP 代码中读取 MAX(version),然后将其插入行类以供以后保存。在最大值和保存之间,存在潜在的竞争条件,其中另一个进程可以获得相同的最大值,然后当然其中一个插入会由于非唯一性而失败。
为了避免需要锁,我宁愿使用子选择进行保存,例如:
然而这在 Propel 中不受支持,如果我通过 PDO 来实现,我将无法(afaik)发现赋予复合 PK 的“版本”部分的值。
现在,我可以有一个额外的自动递增列,因为可以在插入后读取自动递增的值以查找行,因此我可以在 Propel 中进行重新选择。但是,如果我能提供帮助,我想避免多余的专栏——在我看来,这似乎不够优雅。
所以......我的感觉是,将 max & save 调用封装在一个锁中是要走的路。这将不得不锁定整个表 IMO,并防止读取和写入(否则后续的最大调用将不会等待,因此会导致非唯一性再次失败)。
我需要它与 Propel 支持的所有平台一起工作,所以 - 除非我应该采取更好的方法 - 是否有一个 PHP 库可以对任何 PDO 数据库进行这种锁定?如果没有,我可以自己做 - 但如果其他人针对各种 dbs 完成了测试驴工作,那就太好了(设置 MSSQL Server? - 不,谢谢 :)
sql-server-2008 - SQL Server 2008 存储过程同时运行导致延迟
我有一个问题,当从同一个应用程序的两个不同实例同时运行同一个存储过程时,它似乎超时了,我想知道我能做些什么来解决它吗?
我相信问题出在 SQL Server 2008 处理自身、锁定行和执行 SP 的方式上……我不太了解的事情。该应用程序用于ADODB.Command
执行 SP。
我有一个 VB6 exe ( App.exe
),在一台服务器上多次运行。此应用程序调用数据库上的存储过程,该过程返回该应用程序的下一个序列号。此序列号字段对于应用程序的实例是唯一的 - 对于tbl_SequenceNos
正在运行的应用程序的每个实例,表 ( ) 中有 1 行。
例如,假设我们正在运行:App[a].exe
和App[b].exe
tblSequenceNos
好像:
获取下一个序列号的存储过程比较简单:
当两者都App[a].exe
尝试App[b].exe
运行此过程以获取它们的NextSequenceNo
值时,它们会挂起大约 30 秒(ADO 超时?)。
因为每个应用程序从不查看彼此的行,所以我认为这可以同时工作而无需指定特殊的锁定。有什么我想念的吗?我想也许我需要指定只锁定行,而不是整个表或页面?- 我不知道sql2008默认是做什么的。
任何帮助是极大的赞赏!提前谢谢你,安德鲁
sql-server - 如何检查表是否可用于删除和创建触发器?
我在 sql server 2000 中有一个很长的脚本(17k 行并且还在增长)。
问题是大约一半,作为远程安装过程的一部分,必须删除和重新创建几个触发器。
有时,一两个表正在使用中,安装在没有警告我的情况下停止,直到我查看消息选项卡并找到它。
我想要一个半无人值守的安装,我至少有两个选择:
a) 悲观的方法: 在开始时确认所有表的可用性,如果某个表正在使用中,则显示警告 +“set exec off”(在启动和触发器创建之间不太可能正在使用)
b) 乐观的方法: 当某个表正在使用时,在开始时显示警告,如果安装可以继续,请留给我,用 set exec off/on 代码封装有问题的触发器。我可以这样做,因为触发代码往往非常稳定(几年前)
无论如何,我只需要知道表是否可用于触发删除/创建而不停止我的进程(表锁定?)。我登录了 BOL 和一些论坛,但我真的不知道要找什么。
更新:
使用此选择查找您的 Type_Id 和 Mode_Id 和 Sts_Id 值...
(我的分别是 5、6 和 1,但可能是其他值,这些只是来自初始测试)
%%%警告:记住 MS 可以更改或弃用它们,因为这不是最好的方法,但我发现的唯一一个'直到现在......