[Seasar-user:9410] Re: [DBFlute]JOIN 時の lockForUpdate について

kubo [E-MAIL ADDRESS DELETED]
2007年 7月 24日 (火) 21:40:42 JST


久保です。

> >for update → 結合している全てのTableをLock
> >for update of xxx → 指定されたColumnが定義されているTableをLock
> >という認識で合っていますでしょうか?
> 
> 認識合っています。
> 
> 
> >外部結合(left outer join)を利用したSelectでも
> >「for update of xxx」は利用できますでしょうか?
> >(文法エラーになったりしないかどうか)
> 
> 利用できることを確認しました。
> 
> 
> >「for update of xxx」のxxxに指定する列は主キーでしょうか?
> >(他の列も指定できるとしても主キーを指定するのが一般的でしょう
> >か???)
> 
> ロックしたい列のどの列でもよいようですが、
> 一般的には、何でしょうね。すみません私も詳しくなくて。。
> 主キーで問題ないのではないかと思います。

ありがとうございます!
自分も調べまして、このような場合は
この指定の列は特になんでもよさそうですね。
(CURSORを直接使っているわけではないので)

PK一つの場合     → PK
PK二つ以上の場合 → PKのどちらか
PKがない場合     → 存在する列のどれか

という仕様にしたいと思います。


SqlClauseOracle:
    public SqlClause lockForUpdate() {
        _lockSqlSuffix = " for update";
        return this;
    }

    ↓↓↓

    public SqlClause lockForUpdate() {
        final DBMeta dbmeta = DBMetaInstanceHandler.getInstanceByTableMultiName(_tableName);
        if (dbmeta.hasPrimaryKey()) {
            final String primaryKeyColumnName = dbmeta.getPrimaryKeyColumnDbNameOnlyFirstOne();
            _lockSqlSuffix = _lockSqlSuffix + " for update of " + _tableName + "." + primaryKeyColumnName;
        } else {
            final String randomColumnName = (String)dbmeta.getColumnDbNameList().get(0);
            _lockSqlSuffix = _lockSqlSuffix + " for update of " + _tableName + "." + randomColumnName;
        }
        return this;
    }






Seasar-user メーリングリストの案内