セーブポイントの使い方を誤解していると思います。おそらく誰かが私のためにそれを片付けることができます。私がやろうとしていること、そして私が経験したこととして、私の例を提示します。
私のアプリは特定の手順を実行しています。その手順 (および関連する DB 操作) の前に、セーブポイントを作成します。その手順の間に、select for update を開始します。これにより、多数のロックが作成されます。
lock1 - 期間=トランザクション、クラス=行、タイプ=インテント 行=大きな数値
lock2 - 期間=トランザクション、クラス=行、タイプ=WriteNoPK 行=大きな数値
その Java プロシージャが成功すると、関連する DB トランザクションがコミットによって完了します。ただし、Java プロシージャが失敗した場合は、関連する DB 操作もロールバックしたいと考えています。私はこれを試みています:
conn.rollback(mySavepoint);
ただし、これはDB操作によって作成された(上記の)テーブルロックを解放していません(conn.rollback(mySavepoint);によってロールバックしただけだと思っていました)。
この動作を、Sybase と Derby の 2 つのデータベースでテストしました。
これはなぜですか?
conn.rollback(mySavepoint) の後に本当にコミットする必要がありますか??? 少し直感に反するようです。