DB2 select行隔离不起作用

DB2 select行隔离不起作用,db2,db2-luw,Db2,Db2 Luw,这样,我应该能够隔离使用select语句读取的行,但当我运行以下步骤时,它不会锁定行 创建表测试(col varchar(50)) 插入测试值('100') 从mdmsysdb中选择列。使用RS USE测试并保留独占锁或从mdmsysdb中选择列。使用RR USE测试并保留独占锁 在并行应用程序中,当我运行update语句时,它会正常运行 我的方法有什么问题?当select被定义为持有exlusive lock时,为什么在步骤4中从并行应用程序更新行?如果您使用RHEL并在shell命令行(ba

这样,我应该能够
隔离
使用select语句读取的
,但当我运行以下步骤时,它不会锁定行

  • 创建表测试(col varchar(50))
  • 插入测试值('100')
  • 从mdmsysdb中选择列。使用RS USE测试并保留独占锁

    从mdmsysdb中选择列。使用RR USE测试并保留独占锁
  • 在并行应用程序中,当我运行update语句时,它会正常运行
    我的方法有什么问题?当select被定义为持有exlusive lock时,为什么在步骤4中从并行应用程序更新行?

    如果您使用RHEL并在shell命令行(bash或ksh等)上运行SQL语句。然后您需要了解默认的自动提交行为

    注意对Db2服务器的版本和平台使用正确的SQL语法。Linux/Unix/Windows与i系列和Z/OS之间存在差异。每个平台可以有不同的行为,每个平台的不同设置可以调整锁定行为

    默认情况下,Windows/Linux/Unix上的DB2CLP将自动提交。因此,当自动提交发生时,语句获取的任何锁都会在语句完成时立即释放。这就解释了为什么(在不同的会话中)您不能强制等待锁-锁已经不存在了

    因此,观察到的行为是正确的——按照设计工作,而不是你错误地想象的。您可以通过选择性地禁用自动提交来更改默认行为

    要禁用自动提交,您有不同的选择。您可以在CLP的命令行上执行此操作以影响当前命令行(使用+c选项),也可以使用环境变量为会话永久设置它(通常是个坏主意),或者您可以通过使用c off的
    更新命令选项在脚本中动态启用/禁用自动提交
    使用c on更新命令选项命令

    要在Db2 CLP的命令行上禁用autommit(仅针对一条语句),请使用+c选项,例如:

    db2+c“从mdmsysdb.test中选择COL并使用RS使用和保留独占锁”


    禁用自动提交后,您将负责执行显式提交或回滚。如果您使用了+c选项,任何省略该选项的db2命令都将恢复为默认行为或DB2OPTIONS(如果设置)。因此,您必须知道自己在做什么,并注意进行适当的测试。

    1)日志记录是否已打开-表是否对事务有效?2) 您确定没有释放事务(例如
    COMMIT
    /
    ROLLBACK
    )?通常,您希望事务(尤其是表锁定类型的事务)尽可能短。3) 您是否正在更新
    col
    ?优化器可能足够聪明,可以意识到这里没有“冲突”。4) ... 你为什么把整张桌子都锁上了?这通常是一个糟糕的想法。您使用的是哪种DB2变体?您使用的是什么客户机?您参考了DB2forz/OS文档,但您的问题被标记为[DB2LUW]和[db-400]。是哪一个?他们的SQL方言和锁定行为可能有所不同。我一直试图通过RHEL命令提示符运行sqls。4)。。。你为什么把整张桌子都锁上了?这通常是一个糟糕的主意--我并没有试图锁定整个表,只是锁定我在select中读取的行,然后将在update语句中更新该行谢谢!!你的解决方案很好用。我需要对此进行详细测试,以处理不同的场景