提问人:rjp 提问时间:7/12/2023 更新时间:7/12/2023 访问量:218
在 Salesforce 中,当只有一个事务(线程)执行时,行锁定错误是如何发生的?
In Salesforce, how does a row lock error happen when there's only a single transaction (thread) executing?
问:
当在Salesforce中执行用户“操作”(一般意义上)时,假设没有执行标注或异步作业,代码不是在单个线程/事务中运行吗?假设是这样,当我知道我是我的个人沙盒中的唯一用户时,我怎么会收到行锁定错误(没有其他用户正在等待我正在更新的相同记录)。基于此链接: https://help.salesforce.com/s/articleView?id=000387767&type=1,如果有数千条子记录,则可能会出现行锁定错误。但是,它确实再次提到是否有多个用户。
我最终将引发行锁定错误的代码部分排队,问题消失了。但是,我仍然对我上面的查询感到困惑。
答:
0赞
Neel Mota
7/12/2023
#1
您可以指定事务模式(插入后,更新后)吗? 此外,如果可能的话,您可以指定哪个流,顶点类等抛出错误吗? 如果是“更新后”,则可能是您正在尝试更新已在“触发器”中的记录值。
让我为你总结一下。 更新后我们无法更新记录。
评论
0赞
rjp
7/12/2023
谢谢你的回复,尼尔。这是您指出的不同错误,但是在更新或插入后更新记录时,google.com/search?q=salesforce+update+record+read+only 与记录(行)锁定时不同。
0赞
eyescream
7/12/2023
#2
您可能有其他操作更新同一记录
- 计划的批处理(后台)作业
- 您几秒钟前所做的仍在运行的编辑的副作用(可排队、@future等,还有后台)
- 如果您刚刚开始一个大型的重新计算操作(共享规则重新计算,从查找转换为主从详细信息),则系统通常会变慢,直到有关完成的电子邮件到来。
- 如果要在 master-detail 中更新详细信息 - 它会锁定父级。我认为当有汇总摘要字段时,它更突出。然后,如果在细节的触发器中,您想自己更新父级 - 偶尔锁定可以启动。
评论
0赞
rjp
7/12/2023
感谢您的回复,眼霜:)。我认为您的最后一个要点,即在主从关系中更新多个详细信息记录就是这种情况,正如我在发布的问题中添加的链接中所指出的那样。我想我在想在同一个线程或事务中,同一线程获得的锁在数据库上下文中是可重入的(stackoverflow.com/questions/1312259/...)。
0赞
eyescream
7/12/2023
您是否尝试过使用 SELECT FOR UPDATE 调用它?调试日志中有什么有趣的东西吗?我在“详细信息”上编写了许多触发器,这些触发器更新了“主”上的内容,它们与流、工作流、汇总摘要字段共存......很难说,您的设置中可能有些奇怪。“应该有效”
0赞
Ashish Narang
10/5/2023
我们尝试过“选择更新”,但没有用。在我们的示例中,子记录由多个用户同时创建(几乎同时创建 400-500 个)
0赞
eyescream
10/5/2023
@AshishNarang也许可以发布你自己的问题?保存子记录需要一段时间吗?你现在绝对必须做的副作用(比如,如果数据不好,就会向用户抛出错误)与你可以卸载到异步进程(计划流、正常流但有计划路径、“将来”、可排队、可调度或批处理作业)......
评论