# HG changeset patch # User Sascha L. Teichmann # Date 1325517238 0 # Node ID ee0c60757a9487dd75195a398acb43cd6e62944c # Parent 067341e86375d23177f3aea13d485e07c6f1aa20 Added transaction support flys-aft/trunk@3566 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 067341e86375 -r ee0c60757a94 flys-aft/ChangeLog --- a/flys-aft/ChangeLog Thu Dec 22 12:07:29 2011 +0000 +++ b/flys-aft/ChangeLog Mon Jan 02 15:13:58 2012 +0000 @@ -1,3 +1,12 @@ +2012-01-02 Sascha L. Teichmann + + * src/main/java/de/intevation/db/ConnectionBuilder.java: + Set auto commit of new connection to false to enable transaction. + + * src/main/java/de/intevation/db/ConnectedStatements.java: + Added methods to begin, commit and rollback transactions. + Relies on savepoint support which is check by database metadata. + 2011-12-22 Sascha L. Teichmann * src/main/java/de/intevation/aft/River.java: Figure out diff -r 067341e86375 -r ee0c60757a94 flys-aft/src/main/java/de/intevation/db/ConnectedStatements.java --- a/flys-aft/src/main/java/de/intevation/db/ConnectedStatements.java Thu Dec 22 12:07:29 2011 +0000 +++ b/flys-aft/src/main/java/de/intevation/db/ConnectedStatements.java Mon Jan 02 15:13:58 2012 +0000 @@ -2,9 +2,12 @@ import java.util.HashMap; import java.util.Map; +import java.util.Deque; +import java.util.ArrayDeque; import java.sql.Connection; import java.sql.SQLException; +import java.sql.Savepoint; public class ConnectedStatements { @@ -14,16 +17,27 @@ protected Map boundStatements; + protected Deque savepoints; + public ConnectedStatements( Connection connection, Map statements - ) { + ) + throws SQLException + { this.connection = connection; this.statements = statements; + checkSavePoints(); boundStatements = new HashMap(); } + protected void checkSavePoints() throws SQLException { + if (connection.getMetaData().supportsSavepoints()) { + savepoints = new ArrayDeque(); + } + } + public SymbolicStatement.Instance getStatement(String key) throws SQLException { @@ -42,12 +56,39 @@ return stmnt; } + void beginTransaction() throws SQLException { + if (savepoints != null) { + savepoints.push(connection.setSavepoint()); + } + } + + void commitTransaction() throws SQLException { + if (savepoints != null) { + savepoints.pop(); + } + connection.commit(); + } + + void rollbackTransaction() throws SQLException { + if (savepoints != null) { + Savepoint savepoint = savepoints.pop(); + connection.rollback(savepoint); + } + else { + connection.rollback(); + } + } + public void close() { for (SymbolicStatement.Instance s: boundStatements.values()) { s.close(); } try { + if (savepoints != null && !savepoints.isEmpty()) { + Savepoint savepoint = savepoints.peekFirst(); + connection.rollback(savepoint); + } connection.close(); } catch (SQLException sqle) { diff -r 067341e86375 -r ee0c60757a94 flys-aft/src/main/java/de/intevation/db/ConnectionBuilder.java --- a/flys-aft/src/main/java/de/intevation/db/ConnectionBuilder.java Thu Dec 22 12:07:29 2011 +0000 +++ b/flys-aft/src/main/java/de/intevation/db/ConnectionBuilder.java Mon Jan 02 15:13:58 2012 +0000 @@ -11,6 +11,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; +import java.sql.DatabaseMetaData; import org.apache.log4j.Logger; @@ -66,7 +67,20 @@ } } - return DriverManager.getConnection(url, user, password); + Connection connection = + DriverManager.getConnection(url, user, password); + + connection.setAutoCommit(false); + + DatabaseMetaData metaData = connection.getMetaData(); + + if (metaData.supportsTransactionIsolationLevel( + Connection.TRANSACTION_READ_UNCOMMITTED)) { + connection.setTransactionIsolation( + Connection.TRANSACTION_READ_UNCOMMITTED); + } + + return connection; } public ConnectedStatements getConnectedStatements() throws SQLException {