php - 过程中的游标仅锁定正在更新的当前行(在更新时),并且在持续时间内没有其他任何操作?

标签 php mysql cursor innodb deadlock

请耐心等待,因为我对词汇量没有希望,而且我自己的搜索也没有任何结果。

我学会了here如果我按照我想要的方式更新 here (GROUP_CONCAT 也存储在用户定义的变量中),我将锁定整个表。

我相当确定做到这一点的最佳方法是在 CURSOR 中逐行UPDATE,从最高的 PK id 开始,然后降序,因为我'我确信,如果我从最近的记录开始,我陷入僵局、冲突或任何所谓的(告诉你我的词汇很糟糕)的可能性就会降低。

正在UPDATEd的列没有索引。

我刚刚发现here默认情况下,TRIGGERTRANSACTION,因此我将创建一个 proc 并从 php 调用。

事务隔离级别为REPEATABLE-READ

我更担心这些重叠的UPDATE会导致死锁,而没有发生任何事情,而不是它们需要时间才能完成。

所有表 InnoDB。

除了 CURSOR 之外,所有 SELECTUPDATE 均位于 PK id 上的 WHERE SELECT,其中SELECT包含正在UPDATEd的表中的所有ID。没有加入。没有困惑。别大惊小怪。

也就是说,最后是问题:

  1. DECLARESELECTSELECT 一次,还是也循环(我更喜欢它而不是 SELECT 仅一次)?
  2. DECLARESELECT 的锁会在整个过程中保持不变(我希望它尽快释放)吗?
  3. 查询完成后,每个UPDATE的行锁是否会立即释放,或者它们是否会在整个过程中保留(我更喜欢在各个 >更新查询已完成)?
  4. 用户变量的 SELECT 在设置后是否也会释放(您猜对了:我更喜欢它们也尽快释放)?
  5. 是否仍然可以使用行锁SELECT正在UPDATEd的行(同样,如果可以的话我更愿意)?

非常感谢!

为什么UPDATE全部放在INSERT

在我的网站(在我的个人资料中),我允许用户访问所有提交的链接。按顺序排列就可以了,我只需引用 id。

但是,我还根据 3 种投票类型的自定义算法的组合百分位数对它们进行排名,对 3 种赋予同等权重。

问题是在我的算法中,每个投票都会影响所有其他投票。由于我的算法的性质,没有办法解决这个问题。

按需

我用 PHP 尝试了这条路线。不去。算计太多了。我不太关心用户立即获得准确的数据,因为页面会自动更新用户的排名,而用户并不知情,但我不能让用户永远等待,因为我允许快速动态分页。

在 View 中进行计算是一场更大的灾难。

最佳答案

  • DECLARESELECT 只会选择一次,但恐怕这对你没有帮助......<
  • SELECT 光标可能会在OPENCLOSE 期间锁定某项 - 具体是什么取决于您的存储引擎:可以是表、页、行或什么都没有
  • UPDATE 将在更新期间锁定。同样,根据您的存储引擎,锁可以是表、页或行(但显然不是没有)

但是您可能会考虑一种完全不同的方法:IIUC,您基本上想要一些排名或百分位数匹配,并且您尝试通过对每个 INSERT 使用react来实现这一点。这在我的视角中存在一个大问题:你计算了很多很多不需要的值。如果仅计算读取操作会发生什么?

  • 如果两次读取操作之间存在 allways 正好一个 INSERT,则必须重新计算 allways - 与现在计算 allways 的情况相同。
  • 如果两次读取操作之间没有 INSERT,MySQL 查询缓存将保留先前计算的结果,并且不会重新运行查询,因此您少计算。
  • 如果两次读取操作之间有多个 INSERT,则 N 次插入只需计算一次。

因此,按需计算排名/百分位数永远不会比INSERT计算更昂贵,但它有可能便宜得多。

关于php - 过程中的游标仅锁定正在更新的当前行(在更新时),并且在持续时间内没有其他任何操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224136/

相关文章:

android - 从特定图像文件夹查询光标,不从 sdcard 加载所有图像

javascript - 使用拖放的纯 javascript 和 css 分割器代码,光标问题

css - Chrome 中 anchor 上的指针状态偶尔失败

php - 使用 Codeigniter 生成包含 2 个表的 CSV

php - 让我的 php 文件只包含 php 代码的最佳方法是什么?

javascript - 如何显示上传带有不需要的扩展名的文件的错误?

MySQL:查找数据库和数组中的值之间的存在性

php - foreach($ex as $k=>$v) 中的 $k => $v 是什么意思?

php - 使用 PHP 变量自定义 SQL 语句?

MySQL:按多列分组时选择第一行或最后一行