选择“最大”,然后选择“增量”,然后选择“更新另一个 ROW Oracle - 并发问题”

Select Max then Increment & THEN Update another ROW Oracle - concurrent issue

提问人:Vijaykumar Arumugam 提问时间:7/30/2023 更新时间:7/30/2023 访问量:32

问:

我们有一个要求,我们需要选择 MAX 值,然后递增,然后根据日期更新另一行,我在下面给出了示例

日期 名字 生成_Code
7 月 30 日 John CD001型
7 月 30 日 岩石 CD002型
7 月 30 日 甲基苯丙胺 CD003型
7 月 31 日 John CD001型
7 月 31 日 岩石 CD002型
7 月 30 日 维 琪 CD004型
7 月 30 日 John CD001型

我们在包中实现了打击逻辑

第 1 步:从表中选择 NVL(MAX (Generated_Code)、CD000) 基于日期

第 2 步:将其递增 1

步骤 3:更新新插入行的生成代码

特殊情况 - 如果同一日期再次出现相同的名称,那么我们使用相同的GENERATED_Code,请参阅上面的最后一行,我们在步骤之间进行了一些检查并实现了它。

代码工作原理示例 - 如果插入了日期:7 月 31 日广告名称 Arron 的新记录,则 1 - 获取 CD002,创建 - CD003,然后更新新插入的重新编码,如下所示

日期 名字 生成_Code
7 月 30 日 John CD001型
7 月 30 日 岩石 CD002型
7 月 30 日 甲基苯丙胺 CD003型
7 月 31 日 John CD001型
7 月 31 日 岩石 CD002型
7 月 30 日 维 琪 CD004型
7 月 30 日 John CD001型
7 月 31 日 亚伦 CD003型

问题:并发,当从JAVA代码并发调用此包时,相同的GENERTED_code被应用于不同的名称两次,问题出在select MAX()值上。如何实现这个,序列是唯一的方法,我们不想为每个日期创建多个序列,如何处理?

Oracle 选择 并发 序列

评论

0赞 Olivier Jacot-Descombes 7/30/2023
在一个事务中执行所有这些操作。
0赞 Vijaykumar Arumugam 7/30/2023
是的,这些都是在一个交易中
1赞 p3consulting 7/31/2023
如果您不想要孔(它们不会回滚),则序列是“不行”的,无论如何,这不允许每天从 1 开始编号。您可以在 PL/SQL 过程中循环使用“SELECT with a row_number() over(partition by trunc(date)”并捕获 dup 键异常 (-1) 并重试直到确定为止。如果您在日期中保留小时/分钟/秒,这并不能保证按generated_code的顺序将严格等于按日期的顺序,并且该过程应该准备好处理多行(除非您将表的 PK 作为参数传递)
1赞 Paul W 7/31/2023
别这样。它违反了数据一致性的规范化规则。存储在行中的值不应依赖于其他行。如果要对日期内的行进行编号,请在查询时进行编号,而不是在插入时进行编号。

答: 暂无答案