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) {


Reply via email to