请耐心等待,因为我对词汇量没有希望,而且我自己的搜索也没有任何结果。
我学会了here如果我按照我想要的方式更新 here (GROUP_CONCAT
也存储在用户定义的变量中),我将锁定整个表。
我相当确定做到这一点的最佳方法是在 CURSOR
中逐行UPDATE
,从最高的 PK id 开始,然后降序,因为我'我确信,如果我从最近的记录开始,我陷入僵局、冲突或任何所谓的(告诉你我的词汇很糟糕)的可能性就会降低。
正在UPDATE
d的列没有索引。
我刚刚发现here默认情况下,TRIGGER
是 TRANSACTION
,因此我将创建一个 proc 并从 php 调用。
事务隔离级别为REPEATABLE-READ
。
我更担心这些重叠的UPDATE
会导致死锁,而没有发生任何事情,而不是它们需要时间才能完成。
所有表 InnoDB。
除了 CURSOR
之外,所有 SELECT
和 UPDATE
均位于 PK id 上的 WHERE
SELECT
,其中SELECT
包含正在UPDATE
d的表中的所有ID。没有加入。没有困惑。别大惊小怪。
也就是说,最后是问题:
DECLARE
的SELECT
仅SELECT
一次,还是也循环(我更喜欢它而不是SELECT
仅一次)?DECLARE
的SELECT
的锁会在整个过程中保持不变(我希望它尽快释放)吗?- 查询完成后,每个
UPDATE
的行锁是否会立即释放,或者它们是否会在整个过程中保留(我更喜欢在各个>更新
查询已完成)? - 用户变量的
SELECT
在设置后是否也会释放(您猜对了:我更喜欢它们也尽快释放)? - 是否仍然可以使用行锁
SELECT
正在UPDATE
d的行(同样,如果可以的话我更愿意)?
非常感谢!
为什么UPDATE
全部放在INSERT
上
在我的网站(在我的个人资料中),我允许用户访问所有提交的链接。按顺序排列就可以了,我只需引用 id。
但是,我还根据 3 种投票类型的自定义算法的组合百分位数对它们进行排名,对 3 种赋予同等权重。
问题是在我的算法中,每个投票都会影响所有其他投票。由于我的算法的性质,没有办法解决这个问题。
按需
我用 PHP 尝试了这条路线。不去。算计太多了。我不太关心用户立即获得准确的数据,因为页面会自动更新用户的排名,而用户并不知情,但我不能让用户永远等待,因为我允许快速动态分页。
在 View 中进行计算是一场更大的灾难。
最佳答案
DECLARE
的SELECT
只会选择一次,但恐怕这对你没有帮助......<SELECT
光标可能会在OPEN
到CLOSE
期间锁定某项 - 具体是什么取决于您的存储引擎:可以是表、页、行或什么都没有UPDATE
将在更新期间锁定。同样,根据您的存储引擎,锁可以是表、页或行(但显然不是没有)
但是您可能会考虑一种完全不同的方法:IIUC,您基本上想要一些排名或百分位数匹配,并且您尝试通过对每个 INSERT
使用react来实现这一点。这在我的视角中存在一个大问题:你计算了很多很多不需要的值。如果仅计算读取操作会发生什么?
- 如果两次读取操作之间存在 allways 正好一个
INSERT
,则必须重新计算 allways - 与现在计算 allways 的情况相同。 - 如果两次读取操作之间没有
INSERT
,MySQL 查询缓存将保留先前计算的结果,并且不会重新运行查询,因此您少计算。 - 如果两次读取操作之间有多个
INSERT
,则 N 次插入只需计算一次。
因此,按需计算排名/百分位数永远不会比INSERT
计算更昂贵,但它有可能便宜得多。
关于php - 过程中的游标仅锁定正在更新的当前行(在更新时),并且在持续时间内没有其他任何操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224136/