次のドメインオブジェクトがあります。
class Cat
{
String name;
int age;
}
猫のバッチ挿入を行うための次のステートメント:
void insertBulkCats(Collection<Cat> cats)
{
Connection conn = getConnection();
PreparedStatement statement = new PreparedStatement();
for(Cat cat : cats)
{
statement.setString(1, cat.getName());
statement.setInt(2, cat.getAge());
statement.addBatch();
}
statement.executeBatch();
PreparedStatement mergeStatement = conn.prepareStatement(MERGE_CATS);
mergeStatement.execute();
PreparedStatement dropStatement = conn.prepareStatement(CLEAR_CATS);
dropStatement.execute();
conn.commit();
}
これはOracleデータベースです。実行したい手順は、すべての猫を挿入し、アーカイブされた猫に対してマージを実行してから、挿入された元の猫からすべてのレコードを削除することです。私の懸念は、上記のこのアプローチは、ロールバックまたは単独の操作が発生することを保証するものではないということです。私の質問は、これがすべて1つのアトミック操作として実行されることをどのように保証するのですか?さらに、読み取りではない他の関数が(Catテーブルの更新を行うという観点から)データベースにアクセスしないことをどのように保証できますか?