首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理DB2中数据插入的并发性

管理DB2中数据插入的并发性
EN

Stack Overflow用户
提问于 2014-11-20 09:01:11
回答 3查看 789关注 0票数 1

我目前正在做一项研究,并想知道目前有什么方法或算法来管理多用户数据插入到两个关系表(通过主键和外键相关)。

在主键表中,

  • 主键可以是自动增量id,也可以是非自动增量id。

在外键表中

  • 每次将新记录插入主键表时,必须将2条记录插入外键并指向新记录的主键。

目前我是这样做的。

  1. 我有2张表(带非增量的主键表)(外键表)
  2. 我有另一个表(计数器)存储最大的主键值。
  3. 每次用户插入新记录时,它都会读取最大的主键值+1。
  4. 然后开始事务,并使用commit语句将三个记录分别插入主键表和外键表中。

我担心的是,市场上有哪些替代方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 17:10:08

如果我正确理解了您的问题,您将关注如何确定您需要在子记录中使用的刚刚插入的父记录标识值。实现这一点有几种方法(我假设这里讨论的是DB2 for Linux和Windows和DB2,因为您没有指明您的DB2版本和平台)。

如果使用IDENTITY属性定义父PK列,则可以使用内置函数IDENTITY_VAL_LOCAL()引用刚刚生成的标识值。

如果使用SEQUENCE生成键值,则在插入父表和子表的PREVIOUS VALUE FOR myseq时将使用引用NEW VALUE FOR myseq

最后,您可以使用名为“数据更改表引用”的特性,它允许您获得DML语句的结果:

代码语言:javascript
复制
SELECT yourpk_column FROM FINAL TABLE ( INSERT INTO yourparent_tab... )

您甚至可以用一个语句插入父表和子表(在本例中,person.person_id被定义为IDENTITY):

代码语言:javascript
复制
WITH parent (person_id) AS (  
  SELECT person_id FROM FINAL TABLE (
    INSERT INTO person (first_name, last_name) VALUES ('John', 'Doe')   
  )
)
SELECT * FROM NEW TABLE (
  INSERT INTO person_phone (person_id, type, number)
     SELECT person_id, 'Office', '555-555-1234' FROM parent
    UNION ALL
     SELECT person_id, 'Home', '555-555-6789' FROM parent) 
票数 1
EN

Stack Overflow用户

发布于 2014-11-21 17:56:04

正如其他人所说,您可以使用DBMS提供的标识。

但是,如果您希望使用自己的计数器,但同时也计划并发进程,那么您可以采取两种方法:锁定正在更新的计数器,或者再次检查没有其他进程更新它,如果更新了,则重试。

要锁定你可以选择..。对于更新(选择,同时将并发模式设置为UPDATE)。这将允许您从游标读取值,更新当前行,并将记录锁定在读取和更新之间。您将希望在更新之后立即释放锁;因此,如果插入因某种原因失败,您将得到一些从未使用过的序列号(这通常不是问题)。

另一种方法是生成GUID类型的值(虽然时间戳可能足够好),并在递增序列号时进行更新。当您获取时,您可以再次检查GUID没有更改。如果有,这意味着另一个进程进行了更新。所以你得再试一次。

希望这说明了为什么把艰苦的工作留给DBMS会更容易。OTOH,它没有看上去那么复杂,使用自己的计数器有实际的好处。

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 18:12:21

使用“计数器”表来跟踪您所描述的一个或多个ID是一种设计模式,通常会导致计数器表中的行的争用非常高,并发性问题也会很大,即使新的密钥生成率较低。

DBMS很久以前就用标识列(又称“自动增量”)和/或序列解决了这个问题。

即使使用标识或序列,当列上存储这些值的索引时,也可能以非常、非常高的插入速率遇到并发问题。标识和序列通常是单调的,因此您可能会陷入一种情况,即在存储这些值的列的“最高”索引页上写入争用会导致并发问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27035470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档