光标PROC只锁定当前行被更新(同时更新),并没有别的时间?(CURSOR in proc that

2019-10-29 12:27发布

请原谅,因为我在词汇无望,和我自己的搜索都不会去任何地方。

我已经学会在这里 ,如果我在我想要的方式更新了这里 (与GROUP_CONCAT S还存储在用户定义的增值经销商),我会锁定整个表。

我敢肯定这样做将是最好的办法UPDATE在逐行CURSOR ,从那么高PK ID下降,因为我敢肯定,我将有一个死锁的机会较低,或冲突,或任何这就是所谓的(告诉你,我是坏的词汇),如果我从最近的记录开始。

该柱是UPDATE d没有索引。

我刚刚发现这里是一个TRIGGERTRANSACTION默认情况下,所以我会做一个进程,而不是从PHP调用。

事务隔离级别是REPEATABLE-READ

我更关心的是这些重叠的UPDATE s的发生没有什么比他们抽出时间来完成造成死锁。

所有表的InnoDB。

所有SELECT S和UPDATE s为WHERE上除了PK IDð CURSOR SELECTSELECT S IN表中的所有ID的就是BEING UPDATE天。 没有加入。 没有搞乱。 别大惊小怪。

这就是说,在这里终于有问题:

  1. 请问DECLARESELECTSELECT一次,或者这是否也环路(我宁愿它SELECT只有一次)?
  2. 请问DECLARESELECT的锁仍然是PROC的持续时间(我宁愿它尽快释放)?
  3. 将行锁定每个UPDATE尽快完成查询的释放,否则将仍然是PROC的持续时间(我宁愿行锁释放后,个人UPDATE查询finshed)?
  4. 请问SELECT S为用户变量,他们已经成立后也释放(你猜对了:我喜欢那些还要尽快释放)?
  5. 这将有可能仍SELECT该行作为UPDATE与行锁d(再次,我想如果我能喜欢)?

提前谢谢了!

为什么UPDATE所有的INSERT

在我的网站(我的个人资料),我允许用户访问过所有提交的链接。 那好顺序的基础上,我只是在引用该id。

不过,我也对他们进行排名上的3票种自定义算法的组合百分点,同样加权3。

问题是,在我的算法,每票将影响所有其他的票。 还有因为我的算法的性质没有办法解决这个。

一经请求

我试着用PHP这条路线。 没有去。 有太多的计算。 我不太关心其准确的数据,用户能够即时 ,因为页面会自动与用户是非明智的用户更新的行列,但我不能让用户永远等待,因为我实现快速动态分页。

在视图计算是更大的灾难。

Answer 1:

  • DECLARESELECT选择只有一次,但我很害怕,那也不会帮助你...
  • SELECT光标可能会保持一些距离锁定OPEN高达CLOSE它可以是表,页,行空:它是什么取决于你的存储引擎-
  • UPDATE将锁定只要更新需要。 再次,这取决于你的存储引擎,锁可以是表,页或行(但显然不是什么)

但是,你可能会考虑一个完全不同的方法:IIUC,你基本上要一些排名或百分的比赛,并尝试通过反应都要做这个INSERT 。 这在我的POV一个很大的问题:你计算很多很多不必要的价值观。 会发生什么,如果你在读操作只计算?

  • 如果恰好永诺一个 INSERT两次读取操作之间,你必须重新计算百达-相同的情况下,如果你像现在计算八方通。
  • 如果没有 INSERT两次读取操作之间秒,MySQL查询缓存将一直保持先前计算的结果,并不会重新运行查询,让您计算更少。
  • 如果有一个以上的 INSERT两次读取操作之间的S,你只需要一次N个刀片计算。

因此,在计算需求等级/百分点绝不会比计算更昂贵的INSERT ,但它必须是显著更便宜的潜力。



文章来源: CURSOR in proc that only locks current row being UPDATEd (while UPDATing) and nothing else for duration?