proc中的CURSOR只锁定当前行是UPDATEd(UPDATing),而持续时间没有其他内容?

时间:2013-01-08 21:13:52

标签: php mysql cursor innodb deadlock

请耐心等待我,因为我对词汇量毫无希望,而且我自己的搜索也无法进行。

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

我相当确定最好的方法是在UPDATE中逐行CURSOR,从最高的PK ID开始然后降序,因为我确定我会有一个如果我从最近的记录开始,就会降低陷入僵局或冲突的可能性(或者告诉你我的词汇很糟糕)。

UPDATE d列没有索引。

我发现here默认情况下TRIGGER是一个TRANSACTION,所以我将改为使用proc并从php调用。

事务隔离级别为REPEATABLE-READ

我更关注这些重叠的UPDATE导致死锁,没有任何事情发生,而不是花时间完成。

所有表格InnoDB。

所有SELECTUPDATE都是PK {1}},除了WHERE CURSOR SELECT所有ID正在SELECT的表格。没有加入。没有麻烦。别大惊小怪。

那就是说,最后是问题:

  1. UPDATE DECLARE SELECT只会SELECT一次,或者也会循环(我只希望它SELECT一次)?
  2. DECLARE的{​​{1}}锁是否会在proc期间保持不变(我希望它尽快释放)?
  3. 查询完成后,每个SELECT版本的行都会锁定,还是会在proc的持续时间内保留(我更喜欢个人UPDATE之后的行锁定版本查询已经finshed)?
  4. 用户变量的UPDATE是否也会在设置后释放(您猜对了:我更喜欢那些也尽快发布)?
  5. 行锁是否仍可SELECTSELECT d(再次,我更愿意,如果可以的话)?
  6. 非常感谢提前!

    为什么UPDATE全部UPDATE

    在我的网站(在我的个人资料中)中,我允许用户访问所有提交的链接。这是顺序的,我只是引用id。

    但是,我也将它们排在3种投票类型的自定义算法的组合百分位数上,同样权衡3。

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

    点播

    我用PHP尝试了这条路线。不行。计算太多了。我不太关心用户有正确立即的数据,因为该页面将自动更新用户的排名而用户不是更明智,但我不能让用户永远等待,因为我允许快速动态分页。

    在视野中计算是一场更大的灾难。

1 个答案:

答案 0 :(得分:1)

  • DECLARE的{​​{1}}只会选择一次,但我担心,这对您没有帮助......
  • SELECT光标可能会将某些内容SELECT锁定到OPEN - 它取决于您的存储引擎:它可以是表格,页面,行或没有
  • 只要更新需要,CLOSE就会锁定。同样,根据您的存储引擎,锁可以是表,页或行(但显然不是什么)

但你可能会考虑一种完全不同的方法:IIUC,你基本上想要一些排名或百分位匹配,你试图通过对每个UPDATE作出反应来做到这一点。这在我的POV中有一个很大的问题:你计算了很多很多不需要的值。如果只计算读数操作,会发生什么?

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

因此,根据需要计算等级<百分位数 永远不会比在INSERT上计算贵,但它有可能显着降低成本。