- PR -

スレッド内でのDB処理のロックについて

1
投稿者投稿内容
ebi
会議室デビュー日: 2007/08/21
投稿数: 7
投稿日時: 2007-09-06 02:09
こんにちわ。

スレッド内でDB処理を行うプログラムを作っているのですが、
レコードのロックについて気になる点が有り、質問させて頂きます。

複数のスレッドが更新を行うレコードに対して、
更新前に「SELECT 〜 FOR UPDATE」を使ってロックをかけるようにしているのですが、
このSQLを発行する時点でデッドロックが発生してしまうことはあるのでしょうか?
SQLを発行する部分をsynchronizedで同期を取るようにするべきか悩んでいます。
// 現在はsynchronizedを使わずに動かしています。

JavaよりもDBよりな質問となってしまっていますが、よろしくお願いします。

環境
j2sdk1.5.0_12
oracle10g
ojdbc14.jar
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-09-06 09:50
引用:

ebiさんの書き込み (2007-09-06 02:09) より:
複数のスレッドが更新を行うレコードに対して、
更新前に「SELECT 〜 FOR UPDATE」を使ってロックをかけるようにしているのですが、
このSQLを発行する時点でデッドロックが発生してしまうことはあるのでしょうか?


ないです。
Oracleはデッドロックの発生を検知する機能を持っています。デッドロックするようなSQL文を発行すると、Oracleでエラーが発生します。結果的にRollbackすることになるはずです。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-09-06 11:22
Javaの同期とDBでの同期は別世界の出来事ですからね。
まっとうなDBならACID属性を満たしているでしょうから
DBでの同期を正しく行えばJava側で同期する必要は無いはずです。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-09-06 21:33
synchronizedで同期処理をしても、DBというのはJVM以外の
接続も受け付けるわけでして、本質的な解決になりません。
nagiseさんも書いてますけど、名の通ったDBでトランザクション
処理がまともに使えるものだったら、この辺は信じてまか
せてみるのが筋かと。
ebi
会議室デビュー日: 2007/08/21
投稿数: 7
投稿日時: 2007-09-06 23:30
返信ありがとうございます!

DBに任せてこのままでいこうと思います。
ありがとうございました!
1

スキルアップ/キャリアアップ(JOB@IT)