質問: ... synchronized(conn) { // データベースの更新 - 複数のSQLを実行する。 // データベースを commit/rollbackする。 } ``` データベースセッション(トランザクション)に複数スレッドが相乗りしてもよいのか?が、質問の趣旨だったということに気づきました。質問の仕方が悪かったのでしょうか、ステレオタイプな答えしか返ってこなかったので、やる気をなくしました。 少し視野を広げてConcurrencyについて自分で調べることします。皆様ありがとうございました。
回答: > > スレッドセーフとトランザクションとは分けて考えるべきでしょうか? > > > 両者は **その操作対象が異なる** ものですから、分けて考えるべきです。 * スレッドセーフ(thread safe):Java言語のオブジェクト(インスタンス)の内部状態を対象とする概念です。複数のスレッドから、あるオブジェクト(インスタンス)のメソッドを同時に呼び出すとき、何が保証されるかについて述べたものです。 * トランザクション(transaction):リレーショナルデータベース(RDB)上のデータを対象とする概念です。複数のクライアント(=スレッド, プロセス, etc.)から、RDB上のデータを同時に更新/参照しようとしたとき、何が保証されるかについて述べたものです。 > > 「java.sql.Connectionはスレッドセーフか」と聞かれたらどう答えますか。 > > > 「YES」とだけ。 > > Webで調べてみると、JDBCの仕様はスレッドセーフとしているようです。実装がどうかはわかりませんが。 > > > 他QAサイト(英語)の質問と回答"Is java.sql.Connection thread safe?"にもありますが、JDBC仕様上はスレッドセーフのようですね。仕様がそう要求している以上、それに反する実装は単にバグ扱いとなります。