问题标签 [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.

0 投票
1 回答
11821 浏览

mysql - 如何从 mysql 中的“Table_locks_immediate”和“Table_locks_waited”了解数据库健康状况

如何通过查看数据库状态中的“Table_locks_immediate”和“Table_locks_waited”值来了解 mysql 数据库的健康状况。

我想知道“Table_locks_immediate”和“Table_locks_waited”之间的比率是否重要。

0 投票
1 回答
1522 浏览

sql-server - SQL Server 2008R2:“DELETE FROM”永远挂起,但“SELECT”工作正常

无论如何,我都不是 DBA,所以我迷失了这一点。我有一张有 152,000 行的表。我正在尝试执行此语句:

DELETE FROM FILES WHERE Asset_Id = 340

它永远挂在查询窗口中——只是说“正在执行查询......”。此语句工作正常:

SELECT * FROM FILES

我还有一份我尝试过删除语句的数据库副本,它在不到几秒钟的时间内运行,没有任何问题。所以那张桌子肯定有什么问题。这里可能发生了什么?它影响了我的网络应用程序中的功能。

谢谢。

0 投票
2 回答
3580 浏览

mysql - 在长 LOCK TABLES 期间与 MySQL 的通信链接失败

我遇到了一些奇怪的行为。我有一个 Java 程序,它使用准备好的语句和批量插入将数据永久写入 MySQL 表。如果某个其他进程在同一张表上发出 aLOCK TABLES t WRITE并在此后不久(几分钟后)释放它,Java 程序将按预期继续。但是,当锁定持续较长时间(超过 30 分钟)时,Java 程序会失去连接并且不会继续。2 小时后,它因通信链路故障而失败。表锁期间挂起的插入语句在锁被释放后执行,但之后连接就消失了。

以下是详细信息:

  • 它发生在 MySQL 5.0.51a 和 5.1.66 上
  • 我正在使用最新的 JDBC 驱动程序 mysql-connector-5.1.25-bin.jar
  • 设置wait_timeout为 28800(8 小时)
  • 通信链路故障的堆栈跟踪和 Java 程序如下所示

有谁知道这里发生了什么?我需要设置/增加任何超时吗?


两个小时后抛出的异常:

完整的 Java 程序:

0 投票
1 回答
166 浏览

mysql - 数据锁定阻止查询运行 - MySQL InnoDB

我们需要每 24 小时运行一次脚本,计算来自 1 个大日志表的数据的总和和平均值,并更新 Main_Table(Innodb)中的数据,该表一直有许多选择/更新查询(大约每秒 1 次)

我在本地数据库上运行了大约 10 分钟的测试查询:

并且因为这会更新 Main_Table 中的所有行,所以我猜由于表 loacking,所有内容都会卡在实时项目中 - 我必须终止查询过程才能再次开始正常工作 - 没有更新任何数据。

我做了一些挖掘,我正在考虑以下 3 个选项:

  1. 更新临时表中的所有数据,然后以某种方式合并到 Main_Table 中。
  2. 在 php 循环中运行脚本,而不是 1 个 MySql 查询(将花费更多时间,但一次更新 1 行)。
  3. 我不确定这是否与我们的问题有关,但我读到了一些关于“开始交易......等”的东西,我认为这可能是相关的......是吗?

希望有人能对此有所了解并帮助我们。谢谢

0 投票
1 回答
605 浏览

mysql - MySQL 写锁优先级

我很好奇用 MySQL 写锁以及它们是如何相互优先考虑的。具体来说,我想知道“低优先级写入”锁的优先级是否低于“普通”写入锁,或者它们是否相等。我能找到的唯一文档指出,低优先级锁的优先级低于读锁,允许首先处理读锁。但是我找不到任何说明它们与其他写锁的关系的东西。

这样做的重点是我正在寻找一种“优先化”写锁的方法,并且想知道是否只有标准的低优先级锁可以满足我的需求。

0 投票
1 回答
491 浏览

php - InnoDB 仅在引用的 id 存在时插入记录(没有 FOREIGN KEYS)

外键可能是解决此问题的最佳方法。但是,我正在尝试了解表锁定/事务,因此我希望我们暂时可以忽略它们。

假设我在InnoDB数据库中有两个表:categoriesjokes; 并且我正在使用PHP/MySQLi来完成这项工作。表格如下所示:

这里有两个函数,每个函数都被不同的连接同时调用。电话是:delete_category(1)add_joke(1,"Interrupting cow. Interrup-MOOOOOOOO!")

现在,如果SELECT两个函数的语句同时执行,并从那里继续,delete_category会认为可以删除类别,并add_joke认为可以将笑话添加到现有类别中,所以我会得到一个空categories表以及joke表中引用不存在的条目category_id

如果不使用外键,你将如何解决这个问题?

到目前为止,我最好的想法是执行以下操作:

1)"LOCK TABLES categories WRITE, jokes WRITE"在开始时delete_category。但是,由于我使用的是 InnoDB,因此我非常希望避免锁定整个表(尤其是经常使用的主要表)。

2)做add_joke一个事务,然后"SELECT id FROM categories WHERE id = '$category_id'" 插入记录后做。如果此时不存在,则回滚事务。但是,由于其中的两个SELECT语句add_joke可能返回不同的结果,我相信我需要研究我不熟悉的事务隔离级别。

在我看来,如果我做了这两件事,它应该会按预期工作。不过,我很想听到更明智的意见。谢谢。

0 投票
3 回答
165 浏览

sql-server - 序列化 INSERT

如果这个问题的答案取决于 DMBS,我很想听听 Oracle 11g 或更高版本和 SQL Server 2012 的答案。

我们有一个表,它有一个引用自身的外键:

我们有将新记录插入Versions表中的存储过程。如果它们同时运行,我们需要确保没有两个版本引用相同的另一个版本,因此版本层次结构中不能有任何分叉(除非我们故意创建一个分叉):

在第二种情况下,我们有两个基于相同版本的版本。

所以我们需要一种方法来序列化这两个事务。首先,我们想到了使用ISOLATION LEVEL SERIALIZABLE,但隔离级别对 没有任何影响INSERTs,因此它们不是解决方案。

Versions另一种方法是在事务开始时获取表上的锁。这可能适用于 SQL Server,但不适用于 Oracle,因为 OracleLOCK TABLE IN EXCLUSIVE MODE不会阻止事务 2 读取表。

那么这种问题的最佳解决方案是什么?

0 投票
3 回答
838 浏览

php - SELECT...FOR UPDATE 与准备好的语句不起作用

我正在尝试创建一个类似 fb 的按钮功能(不是 facebook api)。我的网站上有两个按钮:喜欢和不喜欢。数据库将保存总共有多少喜欢和不喜欢。

这是数据库表:

当用户点击喜欢按钮时的代码:

以及用户单击不同按钮时的代码:

问题来了……
like_count的数量从0开始。
理论上,如果只有一个人点击按钮,like_count不会超过1或小于0。
(点击like按钮->->锁定行->like_count+ 1->释放行->显示不同按钮)
(单击不同按钮->锁定行->like_count-1->释放行->显示类似按钮)
当我慢慢单击按钮时,我可以正确地完成这项工作,但是,当我继续快速点击按钮,like_count 的个数可能会超过 2,有时可能是负数。
我不知道我做错了什么。请帮忙!

0 投票
2 回答
2043 浏览

php - 为什么 LOCK TABLES [table] WRITE 不阻止表读取?

根据http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html,如果我锁定一个表以在 mysql 中写入,在解锁之前没有其他人可以访问。我写了这个脚本,加载为 script.php 或 script.php?l=1 取决于你想要做什么:

如果我在一个浏览器窗口中加载 script.php?l=1 那么,当它处于睡眠状态时,我应该能够在另一个窗口中加载 script.php 并且它应该等到 script.php?l=1 完成,对吗?

事情是,script.php 会立即加载,即使 script.php?l=1 有一个写锁。如果我尝试插入 script.php 那么它会等待,但为什么允许 SELECT 呢?

注意:我不是在寻找关于是否使用 LOCK TABLES 的讨论。事实上,我可能会进行交易,我现在正在调查,现在我只想了解为什么上述方法不起作用。

0 投票
1 回答
1102 浏览

java - Sybase/JDBC:如何检测重组或排他锁?

我们使用 Sybase ASE (15.5) 服务器作为我们的数据库,并且遇到了奇怪的、间歇性的 SPID 阻塞问题,我试图在应用层以编程方式检测和缓解这些问题。

Sybase 允许您安排所谓的“重组”,据我所知,这是定期重新索引/表压缩、清理等。基本上是预定的数据库维护。

每隔一段时间,我们就会让所有行星相互对齐,其中:

  1. 执行查询(在 Sybase 中创建 SPID)并由于某种原因挂起。这会在表上放置一个(阻塞)共享锁widgets;然后
  2. 计划的重组开始,并想要清理widgets表。reorg 请求排他锁widgets,但无法获取锁,因为widgets已被挂起的 SPID/query 锁定和阻塞;然后
  3. 执行后续查询,每个查询都请求共享锁widgets;这样
  4. 整个系统现在被捆绑了:reorg 在获得独占锁之前无法启动widgets,但widgets被挂起的 SPID 捆绑在阻塞共享锁中。并且由于重组已在 上放置了排他锁widgets,所有其他想要共享锁的查询widgets都必须等到重组完成(因为新请求的排他锁胜过新请求的共享锁)。

我认为我在这里的理想策略是:

  • 说,2 分钟后超时数据库查询,这将防止 SPID 挂起,从而防止重组运行;接着
  • 如果查询尝试访问具有排他锁的表,请检测并特别处理它(例如安排查询在 1 小时后再次运行,希望重组完成时等)

我的问题:

  1. 如何让查询超时以在 2 分钟后释放共享锁?
  2. 有没有办法以编程方式(很可能通过 Sybase JDBC 驱动程序,但也可能通过 Sybase 命令行、HTTP 调用等)确定重组是否正在运行?或者,表上存在排他锁?这样我就可以检测到独占锁并以特殊的方式处理它。

提前致谢!