[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 メーリングリストの案内