概要
TDV上で公開されたビューに対し、TDV JDBCドライバを使用するアプリケーションから、INSERTやUPDATEなどの更新処理を行うことができます。
この記事は、TDVの公開ビューに対して更新処理を行う際の、トランザクションに関する情報をまとめたものです。
なお、JavaアプリケーションでTDVのJDBCドライバを使用する一般的な方法につきましては、以下の記事を参照ください。
JavaアプリケーションからTDVデータサービスにJDBCで接続する方法
検証環境
製品 | バージョン |
---|---|
TDV Server 及び JDBCドライバ |
8.8.0 |
トランザクションの利用方法
JDBCドライバは、デフォルトの状態では自動コミットと呼ばれるモードになっています。
自動コミットモードでは、データベースへの更新は即座に自動的にコミットされます。
このモードでは、INSERTやUPDATEなど個々のSQLステートメントは、個別のトランザクションとして処理されます。
複数の更新を1つのトランザクションとしてまとめ、一括してcommit、rollbackを行う場合には、この自動コミットモードを解除します。
自動コミットモードを解除すると、暗黙的にトランザクションが開始します。
Connection conn = DriverManager.getConnection();
conn.setAutoCommit(false); // 自動コミットを解除する(トランザクション開始)
その後、一連のSQL更新を行い、最後に commit() 又は rollback() メソッドを呼び出します。
conn.commit();
又は
conn.rollback();
使用例
public class TransactionTest {
private static final String COMPOSITE_URL = "jdbc:compositesw:dbapi@localhost:9401?domain=composite&dataSource=demo";
private static final String COMPOSITE_DRIVER = "cs.jdbc.driver.CompositeDriver";
private static final String COMPOSITE_USER = "user";
private static final String COMPOSITE_PASSWORD = "xxxxx";
public static void main(String[] args) {
try {
Class.forName(COMPOSITE_DRIVER);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
return;
}
try {
execute();
} catch (Exception ex) {
ex.printStackTrace();
return;
}
}
private static void execute() throws SQLException, InterruptedException
{
Connection conn = null;
Statement stmt = null;
try {
// コネクションの取得
conn = DriverManager.getConnection(COMPOSITE_URL, COMPOSITE_USER, COMPOSITE_PASSWORD);
// 自動コミットを解除する(トランザクション開始)
conn.setAutoCommit(false);
// 更新
stmt = conn.createStatement();
stmt.executeUpdate("update v_categories set categoryname='App10' where categoryid=10;");
stmt.executeUpdate("update v_categories set categoryname='App15' where categoryid=15;");
// コミット
conn.commit();
System.out.println("Commited");
} catch (Exception e) {
// ロールバック
conn.rollback();
System.out.println("Rollbacked");
throw e;
} finally {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
}
}
}
}
TDVビューへの更新処理
TDVは、公開されたビューへの更新処理をサポートしていますが、これには制限があります。
ビューへの INSERT、UPDATE、および DELETE は、次の条件下でサポートされています。
- ビューは次の場合にのみ更新可能です。
- ベースとなるテーブルに対する、直接の行、列のサブセットとして定義されていること。又は、他の更新可能なビューに対する、直接の行、列のサブセットとして定義されていること。
- ビューの SQL に、DISTINCT、GROUP BY、または HAVING が含まれないこと。
- ビューの FROM 句には、1 つのテーブル参照のみが指定され、且つ、そのテーブル参照はベース テーブルまたは更新可能なビューのいずれかであること。
- 派生カラムは更新できません。
- 射影に集計式を含むビューは、GROUP BY が存在するかどうかに関係なく更新できません。
詳細は、以下の公式ガイドを参照ください。
トランザクション分離レベル
一般的に、トランザクション分離レベルの指定は、JDBCドライバ側で行いますが、TDVでは、TRANSACTION_READ_UNCOMMITTED 以外の値を指定すると、実行時に警告が出ます。
// Warning: setting the transaction isolation level to '2' is not supported
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
トランザクション分離レベルは、JDBCドライバ側での指定にかかわらず、データソース定義の指定値にもとづいて扱われます。
更新対象のビューのベーステーブルに対するデータソースを開き、[接続情報] → [基本]タブ → トランザクション分離 で指定します。
データソース定義の基本タブにつきましては、以下の製品ガイドを参照ください。