S2JDBC DB2DialectでのforUpdate()を調べてみた

FOR UPDATEの自動生成

DB2Dialectを指定してS2JDBCSQL自動生成でforUpdate()を使うと、「 for update with rs」が付加されたSQLが発行されます。

select T1_.KEY as C1_, T1_.VALUE as C2_ from ID_GENERATOR T1_ where T1_.KEY = 'EMPLOYEE_ID' for update with rs

Db2Dialectのソースをのぞいてみると、そのような記述があるのが確認できます。ちなみにDb2DialectはS2Tigerの中に存在します。

利用できないメソッド
  • forUpdateNowait()
  • forUpdateNowait(CharSequence... propertyNames)
  • forUpdateWait(int seconds)
  • forUpdateWait(int seconds, CharSequence... propertyNames)

これらのメソッドはDB2では利用できません。UnsupportedOperationExceptionとともに、「DBMS(db2)ではサポートされていません。」というメッセージが表示されます。

  • forUpdate(CharSequence... propertyNames)

カラムを指定したforUpdateメソッドも利用できません。ただ、「FOR UPDATE OF ...」という構文がDB2にはあります。もしかしたら実際はできるのでは。そんなわけで、他のDialectを参考にしたりして少しいじってみることに。

脱線の結果

で、なんとなくわかったこと。どうやらテーブル名のエイリアスが指定されているとダメなようです。「FOR UPDATE OF」以降をカラム名のみで組み立てるようにしたら、とりあえず通るようにはなりました。

ただ、テーブル結合を伴う場合についても考慮する必要がありますし、そもそもDB2と他のDBMSとでは異なる挙動になっているのかもしれません。自動生成に関しては、素直にカラム指定なしのforUpdate()を使っておくのがいいと思います。

いちおういじってみたコードを載せておきます。

public class MyDb2Dialect extends Db2Dialect {
    @Override
    public boolean supportsForUpdate(final SelectForUpdateType type,
            boolean withTarget) {
        return type == SelectForUpdateType.NORMAL;
    }

    @Override
    public String getForUpdateString(final SelectForUpdateType type,
            final int waitSeconds, final Pair<String, String>... aliases) {
        final StringBuilder buf = new StringBuilder(100).append(" for update");
        if (aliases.length > 0) {
            buf.append(" of ");
            for (final Pair<String, String> alias : aliases) {
                buf.append(alias.getSecond()).append(", ");
            }
            buf.setLength(buf.length() - 2);
        }
        buf.append(" with rs");
        return new String(buf);
    }
}

 

関連記事:

DB2で「SELECT ... FOR UPDATE」のロックを検証 - 130単位

转载于:https://www.cnblogs.com/aggavara/archive/2012/09/29/2708718.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值