问题标签 [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.
sql-server - 休眠与 MS SQL Server 2012 表锁和并行查询问题
我有一个 java 线程更新事务中的几个表,还有另一个线程读取具有只读事务的表。读取表的线程正在等待并且不重新调整结果,并且仅在其他线程完成更新后才返回。
如果 DB 是 mysql ,其中更新和查询确实并行发生并且没有等待,情况就不同了。我是否在 MS SQL 方面遗漏了一些东西。需要做什么才能使其平行。这是因为 MS Sql Server 中的表锁而发生的。
MS Sql 服务器休眠设置:
db.driverClassName = com.microsoft.sqlserver.jdbc.SQLServerDataSource
db.dialect = org.hibernate.dialect.SQLServer2008Dialect
休眠版本:v4.3.6.Final
连接池:HikariCP-java6 - v2.2.5
mysql - MySQL LOCK 和 UNLOCK 命令是否被复制?
我有一个复制到从属的数据库。
我有一个进程每分钟更新一次主数据库中的 MyISAM 表。它通过锁定表、删除相关条目、插入更新的条目然后解锁表来实现。更新的条目不一定映射到以前的条目(即一分钟可能是 5 条记录,下一次是 10 条记录,下一次是特定标识符的 2 条记录)
在此表中的从属设备上时不时地执行 SELECT 查询不会返回任何结果。我能想到的唯一一件事是 LOCK 和 UNLOCK 表命令没有通过从属设备,有时 SELECT 查询发生在 DELETE 之后但在 INSERT 之前。
这是可能的,还是 LOCK 和 UNLOCK 也发送到从站?我想不出还有什么可能导致它,我也无法有意地重现它,我只是时不时地看到它。
php - 使用表锁防止并行执行(MySQL)
我有一个名为 cronjobs 的 MySQL 表,它包含每个需要的 cronjob 的完整信息(例如删除旧电子邮件、更新个人资料年龄等)。对于每个 cronjob 都有一个定义的代码块,如果 cronjob 到期(我对不同的 cronjobs 有不同的时间间隔),就会执行该代码块。
为了执行到期的 cronjobs,我得到了一个由 UNIX crontab 每分钟执行一次的 PHP 脚本(调用 execute_cronjobs_due.sh,它调用“php -f /path/to/file/execute_cronjobs_due.php”)。
当执行 execute_cronjobs_due.php 时,所有的 cronjobs 都会被标记为它们将被执行,因此另一个 execute_cronjobs_due.php 调用不会导致同一个 cronjob 的并行执行已经被执行。
现在的问题是:有时执行需要超过 60 秒,但 crontab 程序在这 60 秒后没有调用 execute_cronjobs_due.sh。实际发生的是 execute_cronjobs_due.sh 在执行前一个 crontab 之后立即被调用。如果一次执行时间超过 120 秒,接下来的两次执行将同时初始化。
时间线:
2015-06-15 10:00:00:执行 execute_cronjobs_due.sh(需要 140 秒)
2015-06-15 10:02:20:execute_cronjobs_due.sh 的两个同时执行
由于它是同时执行的,因此没有使用标记它们正在执行的 cronjob,因为选择(实际上应该排除标记的一次)是在完全相同的时间执行的。因此,更新发生在两者都已经选择了到期的 cronjobs 之后。
我该如何解决这个问题,以使 cronjobs 不会同时执行?我可以使用 MySQL 表锁吗?
非常感谢您提前提供的帮助,
弗雷德里克
sql - 锁定 SQL Server 表以防止插入
我正在 SQL Server 2008 R2 中编写此过程:
这是在我执行此查询和后续身份重新设定时锁定表以进行插入的正确方法吗?还想知道我在上面做的事情是否有任何问题?这将在自定义复制环境中使用。
TIA
sql - MS SQL Server 监控表锁
我想问一下是否有某种机制可以让我监视、捕获和写入(例如,写入表)有关发生的表锁的信息。
到目前为止,我发现很少有可以手动或定期执行的存储过程,我真正需要的是能够在插入之前/之中捕获它们(更有可能是更新)并保存到另一个表中。
我问这个问题,因为我有一个存储过程来更新我数据库中的一个表中的数据,通常它在 30 到 50 毫秒之间执行。但是有时会发生奇怪的事情,使用相同的数据和相同的服务器配置执行相同的程序需要长达 90 秒。
我应该为此使用触发器吗?如果是,我应该在什么触发器上设置它?我只需要某个表的表锁。因为据我了解,共享锁不允许插入/更新,因此我需要捕获所有类型的锁。
提前致谢
sql - H2数据库中具有独占性的锁表
我无法将 Oracle 语法转换为 H2 语法:
例如(甲骨文):
在 H2 中,它会导致(语法错误)
如何将oracle语法更改为h2?我试过 Lock_mode 但它不起作用,默认情况下 MVCC 为 true v1.4+
delete-row - 显式表锁定以禁用 DELETES?
使用 Oracle 11gR2:
我们已经有一个流程,它通过删除超过指定保留日期的记录(基于记录完成处理时的时间戳与保留日期之间的比较)来清理特定表。我目前正在编写代码,如果此过程失败,它将提醒我的团队。我可以看到这个过程可能失败的唯一方法是如果在它试图清理的特定表上禁用了 DELETE。
我想通过让进程失败来测试警报以确保它们正常工作并且看起来正确。如果我暂时以独占方式锁定表,是否会禁用 DELETE 并导致删除记录的过程失败?还是仅禁用 DDL 操作?有一个更好的方法吗?
mysql - 未指定表上的 PDO 表锁定?
今天的话很难,我正在努力把它写清楚,以便我可以帮助你帮助我。下面存在一些矫枉过正,ymmv。
我正在将大约 48m 记录从 table1 迁移到 table2,都是 InnoDB。我能够通过 user_id 识别要从 table1 中剔除的记录(“user_id=3 输入的任何记录都移出 table1 并进入 table2”)。我在单实例设置中获得了工作代码的第一次通过,我需要扩展它以便能够通过 AMQP 服务器运行迁移过程,以便我可以通过多个消费者运行作业(即我正在运行消费者/jobs 在同一作业的 2 个实例中并行运行)在循环设置中,其中消费者都同时运行。我希望能够扩大到 10 个消费者来快速完成这项工作,否则单个实例大约需要 15 天才能完成这项工作。
该代码每次运行都会选择与查询条件匹配的最旧的 2000 条记录。问题是,如果我有 2 个代码实例正在运行并选择记录,那么 instance1 将获取 id 的 1-2000,而在几乎完全相同的时间启动的 instance2 也将获取 1-2000,因为 instance1 没有完成将 0-2000 移出 table1 并且这些 id 仍将存在于 table1 中。
好的,没问题。我添加了一个控制表来记录要排除的记录——它允许 instance1 说“我有记录 1-2000”,这样当 instance2 启动并去查询时,它会说“我应该排除什么 id?” 基于查询控制表作为其“给我接下来的 2000 条记录”的一部分,以便 instance2 将获取 id 的 2001 到 4001,然后更新控制表以让它知道 instance2 的 id 为 2001 到 4001。所以如果有instance3 然后它会知道在启动请求下一个 2k 记录时忽略 id 的 1 到 4001。
当一个实例将一个条目写入锁定的控制表时,它会将其写入为“[first_id_found] 和 [last_id_found]”,或“5671 和 7671”。我使用 ' 和 ' 因为文本进入 sql BETWEEN 子句。
从 table1 中选择 id,其中 id 不在 1565 和 1567 之间,id 不在 1568 和 1570 之间,created_by=3 order by id asc limit 0, 2000
问题:
我需要锁定的唯一表是控制表,以便我确信一旦实例有权访问控制表,它将能够找到要省略的记录以及编写自己的省略记录,以便释放锁后访问表的下一个实例control
将在其中找到最新数据。
但是我需要将锁留在原处,直到查询table1
完成,并且我可以确定结果集中的第一个和最后一个 id,以便我可以将它们添加到control
表中,以便下一个启动的实例知道要排除什么。
请注意,控制文件既不是table1
也不是table2
,并且我没有指定table1
或table2
因为我不需要锁定其中任何一个,我也不想要一个,因为其他进程正在访问表并且我不想阻止从其他正在运行的进程访问table1
或table2
。
所以伪代码如下所示:
当我查询 table1 时,我没有返回任何记录。不正确,我有 4800 万条记录。检查 errorInfo() 向我显示错误情况:
“表 'table1' 未使用 LOCK TABLES 锁定”
我不想 lock table1
,但它看起来像因为它在 LOCK TABLES 被放置control
在一个 UNLOCK TABLES 之前和之前被查询,我处于某种事务模式,所有要使用的表都必须有分配的锁定级别。WTF,我在文档中对此一无所知。
table1
当它不在锁定范围内时,为什么我会遇到这个问题?我并不赞同这种策略,它只是我想到的,如果有一种不同的模式会产生与我游戏相同的功能。解决方法?建议?
oracle - 表锁能否消除死锁或使死锁更糟?
我们遇到了Oracle 数据库出现死锁问题的情况。
我说也许我们应该锁定一些桌子锁,一个人对我的回应是
他说的是真的吗?
这是我们收到的电子邮件的一部分:
php - PHP Mysql PDO 和解锁表
如果 php (try/catch) 出现错误,我应该管理表解锁吗?还是脚本结束时 PDO 对象自动释放锁?