You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ti...@apache.org on 2016/03/01 00:27:20 UTC

svn commit: r1732970 - in /aries/trunk/tx-control: tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/ tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/ tx-control-service-local/src/main/java/org/...

Author: timothyjward
Date: Mon Feb 29 23:27:20 2016
New Revision: 1732970

URL: http://svn.apache.org/viewvc?rev=1732970&view=rev
Log:
[tx-control] Do not prematurely finish inherited transactions

Modified:
    aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleTransactionTest.java
    aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SpringJdbcTemplateTransactionTest.java
    aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java
    aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java

Modified: aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleTransactionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleTransactionTest.java?rev=1732970&r1=1732969&r2=1732970&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleTransactionTest.java (original)
+++ aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SimpleTransactionTest.java Mon Feb 29 23:27:20 2016
@@ -163,4 +163,41 @@ public class SimpleTransactionTest exten
 			}));
 	}
 	
+	@Test
+	public void testRequiredInheritsTx() {
+		txControl.required(() -> {
+			Object key = txControl.getCurrentContext().getTransactionKey();
+			
+			connection.createStatement()
+				.execute("Insert into TEST_TABLE values ( 'Hello World!' )");
+			
+			return txControl.required(() -> {
+					assertEquals(key , txControl.getCurrentContext().getTransactionKey());
+					return connection.createStatement()
+							.execute("Insert into TEST_TABLE values ( 'Hello Nested World!' )");
+				});
+		});
+		
+		String[] results = txControl.notSupported(() -> {
+				Statement s = connection.createStatement();
+				
+				ResultSet rs = s.executeQuery("Select count(*) from TEST_TABLE");
+				rs.next();
+				int count = rs.getInt(1);
+				
+				rs = s.executeQuery("Select message from TEST_TABLE ORDER BY message");
+				
+				String[] result = new String[2];
+				rs.next();
+				result[0] = "" + count + ": " + rs.getString(1);
+				rs.next();
+				result[1] = "" + count + ": " + rs.getString(1);
+				return result;
+			});
+		
+		System.out.println(Arrays.toString(results));
+		
+		assertEquals("2: Hello Nested World!", results[0]);
+		assertEquals("2: Hello World!", results[1]);
+	}
 }

Modified: aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SpringJdbcTemplateTransactionTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SpringJdbcTemplateTransactionTest.java?rev=1732970&r1=1732969&r2=1732970&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SpringJdbcTemplateTransactionTest.java (original)
+++ aries/trunk/tx-control/tx-control-itests/src/test/java/org/apache/aries/tx/control/itests/SpringJdbcTemplateTransactionTest.java Mon Feb 29 23:27:20 2016
@@ -22,8 +22,6 @@ import static org.junit.Assert.assertEqu
 import static org.ops4j.pax.exam.CoreOptions.composite;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 
-import java.sql.ResultSet;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;

Modified: aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java?rev=1732970&r1=1732969&r2=1732970&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java (original)
+++ aries/trunk/tx-control/tx-control-provider-jdbc-local/src/main/java/org/apache/aries/tx/control/jdbc/local/impl/TxContextBindingConnection.java Mon Feb 29 23:27:20 2016
@@ -89,7 +89,7 @@ public class TxContextBindingConnection
 					conn.commit();
 				} catch (SQLException e) {
 					throw new TransactionException(
-							"An error occurred when committing the connection");
+							"An error occurred when committing the connection", e);
 				}
 			}
 
@@ -99,7 +99,7 @@ public class TxContextBindingConnection
 					conn.rollback();
 				} catch (SQLException e) {
 					throw new TransactionException(
-							"An error occurred when rolling back the connection");
+							"An error occurred when rolling back the connection", e);
 				}
 			}
 

Modified: aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java?rev=1732970&r1=1732969&r2=1732970&view=diff
==============================================================================
--- aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java (original)
+++ aries/trunk/tx-control/tx-control-service-local/src/main/java/org/apache/aries/tx/control/service/local/impl/TransactionControlImpl.java Mon Feb 29 23:27:20 2016
@@ -40,6 +40,7 @@ public class TransactionControlImpl impl
 			checkExceptions();
 			
 			Coordination currentCoord = coordinator.peek();
+			boolean endTransaction = false;
 			boolean endCoordination = false;
 
 			AbstractTransactionContextImpl currentTran = ofNullable(
@@ -56,17 +57,21 @@ public class TransactionControlImpl impl
 							"Resource-Local-Transaction.REQUIRED", 30000);
 					endCoordination = true;
 					currentTran = new TransactionContextImpl(currentCoord);
+					endTransaction = true;
 					currentCoord.getVariables().put(TransactionContextKey.class,
 							currentTran);
 				}
 			} catch (RuntimeException re) {
+				if(endTransaction) {
+					currentTran.finish();
+				}
 				if (endCoordination) {
 					currentCoord.end();
 				}
 				throw re;
 			}
 
-			return doWork(work, currentTran, currentCoord, endCoordination);
+			return doWork(work, currentTran, currentCoord, endTransaction, endCoordination);
 		}
 
 		@Override
@@ -90,7 +95,7 @@ public class TransactionControlImpl impl
 				throw re;
 			}
 
-			return doWork(work, currentTran, currentCoord, true);
+			return doWork(work, currentTran, currentCoord, true, true);
 		}
 
 		@Override
@@ -98,6 +103,7 @@ public class TransactionControlImpl impl
 			checkExceptions();
 			
 			Coordination currentCoord = coordinator.peek();
+			boolean endTransaction = false;
 			boolean endCoordination = false;
 
 			AbstractTransactionContextImpl currentTran = ofNullable(
@@ -112,17 +118,21 @@ public class TransactionControlImpl impl
 							"Resource-Local-Transaction.SUPPORTS", 30000);
 					endCoordination = true;
 					currentTran = new NoTransactionContextImpl(currentCoord);
+					endTransaction = true;
 					currentCoord.getVariables().put(TransactionContextKey.class,
 							currentTran);
 				}
 			} catch (RuntimeException re) {
+				if(endTransaction) {
+					currentTran.finish();
+				}
 				if (endCoordination) {
 					currentCoord.end();
 				}
 				throw re;
 			}
 
-			return doWork(work, currentTran, currentCoord, endCoordination);
+			return doWork(work, currentTran, currentCoord, endTransaction, endCoordination);
 		}
 
 		@Override
@@ -131,6 +141,7 @@ public class TransactionControlImpl impl
 			checkExceptions();
 			
 			Coordination currentCoord = coordinator.peek();
+			boolean endTransaction = false;
 			boolean endCoordination = false;
 
 			AbstractTransactionContextImpl currentTran = ofNullable(
@@ -147,20 +158,25 @@ public class TransactionControlImpl impl
 							"Resource-Local-Transaction.NOT_SUPPORTED", 30000);
 					endCoordination = true;
 					currentTran = new NoTransactionContextImpl(currentCoord);
+					endTransaction = true;
 					currentCoord.getVariables().put(TransactionContextKey.class,
 							currentTran);
 				}
 			} catch (RuntimeException re) {
+				if(endTransaction) {
+					currentTran.finish();
+				}
 				if (endCoordination) {
 					currentCoord.end();
 				}
 				throw re;
 			}
-			return doWork(work, currentTran, currentCoord, endCoordination);
+			return doWork(work, currentTran, currentCoord, endTransaction, endCoordination);
 		}
 
 		private <R> R doWork(Callable<R> transactionalWork,
-				AbstractTransactionContextImpl currentTran, Coordination currentCoord, boolean endCoordination) {
+				AbstractTransactionContextImpl currentTran, Coordination currentCoord, 
+				boolean endTransaction, boolean endCoordination) {
 			R result;
 			try {
 				result = transactionalWork.call();
@@ -170,10 +186,12 @@ public class TransactionControlImpl impl
 				if(requiresRollback(t)) {
 					currentCoord.fail(t);
 				}
-				try {
-					currentTran.finish();
-				} catch (Exception e) {
-					currentTran.recordFailure(e);
+				if(endTransaction) {
+					try {
+						currentTran.finish();
+					} catch (Exception e) {
+						currentTran.recordFailure(e);
+					}
 				}
 				if (endCoordination) {
 					try {
@@ -195,11 +213,13 @@ public class TransactionControlImpl impl
 				throw workException;
 			}
 			
-			try {
-				currentTran.finish();
-			} catch (Exception e) {
-				currentTran.recordFailure(e);
-				currentCoord.fail(e);
+			if(endTransaction) {
+				try {
+					currentTran.finish();
+				} catch (Exception e) {
+					currentTran.recordFailure(e);
+					currentCoord.fail(e);
+				}
 			}
 			try {
 				if (endCoordination) {