You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2013/10/16 18:50:12 UTC

[01/20] New Transaction API

Updated Branches:
  refs/heads/txn-refactor [created] 7364d55cc


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/configuration/ConfigurationManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java
index 908f0d0..2d2c03d 100755
--- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java
+++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java
@@ -40,7 +40,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-
 import org.apache.cloudstack.api.command.admin.vlan.DedicatePublicIpRangeCmd;
 import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd;
 import org.apache.cloudstack.context.CallContext;
@@ -69,6 +68,7 @@ import com.cloud.user.ResourceLimitService;
 import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.net.Ip;
 
 public class ConfigurationManagerTest {
@@ -213,7 +213,7 @@ public class ConfigurationManagerTest {
     }
 
     void runDedicatePublicIpRangePostiveTest() throws Exception {
-        Transaction txn = Transaction.open("runDedicatePublicIpRangePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangePostiveTest");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 
@@ -239,7 +239,7 @@ public class ConfigurationManagerTest {
     }
 
     void runDedicatePublicIpRangeInvalidRange() throws Exception {
-        Transaction txn = Transaction.open("runDedicatePublicIpRangeInvalidRange");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeInvalidRange");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(null);
         try {
@@ -252,7 +252,7 @@ public class ConfigurationManagerTest {
     }
 
     void runDedicatePublicIpRangeDedicatedRange() throws Exception {
-        Transaction txn = Transaction.open("runDedicatePublicIpRangeDedicatedRange");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeDedicatedRange");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 
@@ -281,7 +281,7 @@ public class ConfigurationManagerTest {
     }
 
     void runDedicatePublicIpRangeInvalidZone() throws Exception {
-        Transaction txn = Transaction.open("runDedicatePublicIpRangeInvalidZone");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeInvalidZone");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 
@@ -307,7 +307,7 @@ public class ConfigurationManagerTest {
     }
 
     void runDedicatePublicIpRangeIPAdressAllocated() throws Exception {
-        Transaction txn = Transaction.open("runDedicatePublicIpRangeIPAdressAllocated");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeIPAdressAllocated");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 
@@ -334,7 +334,7 @@ public class ConfigurationManagerTest {
     }
 
     void runReleasePublicIpRangePostiveTest1() throws Exception {
-        Transaction txn = Transaction.open("runReleasePublicIpRangePostiveTest1");
+        TransactionLegacy txn = TransactionLegacy.open("runReleasePublicIpRangePostiveTest1");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 
@@ -358,7 +358,7 @@ public class ConfigurationManagerTest {
     }
 
     void runReleasePublicIpRangePostiveTest2() throws Exception {
-        Transaction txn = Transaction.open("runReleasePublicIpRangePostiveTest2");
+        TransactionLegacy txn = TransactionLegacy.open("runReleasePublicIpRangePostiveTest2");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 
@@ -392,7 +392,7 @@ public class ConfigurationManagerTest {
     }
 
     void runReleasePublicIpRangeInvalidIpRange() throws Exception {
-        Transaction txn = Transaction.open("runReleasePublicIpRangeInvalidIpRange");
+        TransactionLegacy txn = TransactionLegacy.open("runReleasePublicIpRangeInvalidIpRange");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(null);
         try {
@@ -405,7 +405,7 @@ public class ConfigurationManagerTest {
     }
 
     void runReleaseNonDedicatedPublicIpRange() throws Exception {
-        Transaction txn = Transaction.open("runReleaseNonDedicatedPublicIpRange");
+        TransactionLegacy txn = TransactionLegacy.open("runReleaseNonDedicatedPublicIpRange");
 
         when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/network/CreatePrivateNetworkTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/CreatePrivateNetworkTest.java b/server/test/com/cloud/network/CreatePrivateNetworkTest.java
index 0e57b02..9276309 100644
--- a/server/test/com/cloud/network/CreatePrivateNetworkTest.java
+++ b/server/test/com/cloud/network/CreatePrivateNetworkTest.java
@@ -36,7 +36,6 @@ import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 
@@ -63,6 +62,7 @@ import com.cloud.user.AccountManager;
 import com.cloud.user.AccountVO;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 //@Ignore("Requires database to be set up")
@@ -152,8 +152,8 @@ public class CreatePrivateNetworkTest {
     @Test
     @DB
     public void createInvalidlyHostedPrivateNetwork() {
-        Transaction __txn;
-        __txn = Transaction.open("createInvalidlyHostedPrivateNetworkTest");
+        TransactionLegacy __txn;
+        __txn = TransactionLegacy.open("createInvalidlyHostedPrivateNetworkTest");
         /* Network nw; */
         try {
             /* nw = */

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java b/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
index d6ee630..ea7167b 100644
--- a/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
+++ b/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
@@ -37,7 +37,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-
 import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
 import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd;
@@ -56,6 +55,7 @@ import com.cloud.user.AccountVO;
 import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class DedicateGuestVlanRangesTest {
 
@@ -177,7 +177,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runDedicateGuestVlanRangePostiveTest() throws Exception {
-        Transaction txn = Transaction.open("runDedicateGuestVlanRangePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangePostiveTest");
         
         Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
         dedicateVlanField.setAccessible(true);
@@ -213,7 +213,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runDedicateGuestVlanRangeInvalidFormat() throws Exception {
-        Transaction txn = Transaction.open("runDedicateGuestVlanRangeInvalidFormat");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeInvalidFormat");
 
         Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
         dedicateVlanField.setAccessible(true);
@@ -234,7 +234,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runDedicateGuestVlanRangeInvalidRangeValue() throws Exception {
-        Transaction txn = Transaction.open("runDedicateGuestVlanRangeInvalidRangeValue");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeInvalidRangeValue");
 
         Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
         dedicateVlanField.setAccessible(true);
@@ -255,7 +255,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runDedicateGuestVlanRangeAllocatedVlans() throws Exception {
-        Transaction txn = Transaction.open("runDedicateGuestVlanRangeAllocatedVlans");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeAllocatedVlans");
         
         Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
         dedicateVlanField.setAccessible(true);
@@ -281,7 +281,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runDedicateGuestVlanRangeDedicatedRange() throws Exception {
-        Transaction txn = Transaction.open("runDedicateGuestVlanRangeDedicatedRange");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeDedicatedRange");
         
         Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
         dedicateVlanField.setAccessible(true);
@@ -310,7 +310,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runDedicateGuestVlanRangePartiallyDedicated() throws Exception {
-        Transaction txn = Transaction.open("runDedicateGuestVlanRangePartiallyDedicated");
+        TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangePartiallyDedicated");
         
         Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
         dedicateVlanField.setAccessible(true);
@@ -339,7 +339,7 @@ public class DedicateGuestVlanRangesTest {
     }
     
     void runReleaseDedicatedGuestVlanRangePostiveTest() throws Exception {
-        Transaction txn = Transaction.open("runReleaseDedicatedGuestVlanRangePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runReleaseDedicatedGuestVlanRangePostiveTest");
 
         AccountGuestVlanMapVO accountGuestVlanMap = new AccountGuestVlanMapVO(1L, 1L);
         when(networkService._accountGuestVlanMapDao.findById(anyLong())).thenReturn(accountGuestVlanMap);
@@ -357,7 +357,7 @@ public class DedicateGuestVlanRangesTest {
     }
 
     void runReleaseDedicatedGuestVlanRangeInvalidRange() throws Exception {
-        Transaction txn = Transaction.open("runReleaseDedicatedGuestVlanRangeInvalidRange");
+        TransactionLegacy txn = TransactionLegacy.open("runReleaseDedicatedGuestVlanRangeInvalidRange");
 
         when(networkService._accountGuestVlanMapDao.findById(anyLong())).thenReturn(null);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java b/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
index 1c0eff6..264f91c 100644
--- a/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
+++ b/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
@@ -24,7 +24,8 @@ import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.utils.Pair;
 import com.cloud.utils.db.Transaction;
-import org.junit.Test;
+import com.cloud.utils.db.TransactionLegacy;
+
 import org.junit.*;
 import org.mockito.ArgumentCaptor;
 import org.mockito.MockitoAnnotations.*;
@@ -58,7 +59,7 @@ public class UpdatePhysicalNetworkTest {
 
     @Test
     public void updatePhysicalNetworkTest(){
-        Transaction txn = Transaction.open("updatePhysicalNetworkTest");
+        TransactionLegacy txn = TransactionLegacy.open("updatePhysicalNetworkTest");
         NetworkServiceImpl networkService = setUp();
         existingRange.add("524");
         when(_physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetworkVO);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
index d0f0951..504ab9c 100644
--- a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
+++ b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
@@ -33,7 +33,6 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
-
 import org.apache.cloudstack.api.command.user.region.ha.gslb.AssignToGlobalLoadBalancerRuleCmd;
 import org.apache.cloudstack.api.command.user.region.ha.gslb.CreateGlobalLoadBalancerRuleCmd;
 import org.apache.cloudstack.api.command.user.region.ha.gslb.DeleteGlobalLoadBalancerRuleCmd;
@@ -59,6 +58,7 @@ import com.cloud.user.AccountManager;
 import com.cloud.user.AccountVO;
 import com.cloud.user.UserVO;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.net.Ip;
 
 public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
@@ -181,7 +181,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runCreateGlobalLoadBalancerRulePostiveTest() throws Exception {
 
-        Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -246,7 +246,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runCreateGlobalLoadBalancerRuleInvalidAlgorithm() throws Exception {
 
-        Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -311,7 +311,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runCreateGlobalLoadBalancerRuleInvalidStickyMethod() throws Exception {
 
-        Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -376,7 +376,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runCreateGlobalLoadBalancerRuleInvalidServiceType() throws Exception {
 
-        Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -441,7 +441,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runCreateGlobalLoadBalancerRuleInvalidDomainName() throws Exception {
 
-        Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+        TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -507,7 +507,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runAssignToGlobalLoadBalancerRuleTest() throws Exception {
 
-        Transaction txn = Transaction.open("runAssignToGlobalLoadBalancerRuleTest");
+        TransactionLegacy txn = TransactionLegacy.open("runAssignToGlobalLoadBalancerRuleTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -570,7 +570,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runAssignToGlobalLoadBalancerRuleTestSameZoneLb() throws  Exception {
 
-        Transaction txn = Transaction.open("runAssignToGlobalLoadBalancerRuleTestSameZoneLb");
+        TransactionLegacy txn = TransactionLegacy.open("runAssignToGlobalLoadBalancerRuleTestSameZoneLb");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -655,7 +655,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runAssignToGlobalLoadBalancerRuleTestRevokedState() throws Exception {
 
-        Transaction txn = Transaction.open("runAssignToGlobalLoadBalancerRuleTestRevokedState");
+        TransactionLegacy txn = TransactionLegacy.open("runAssignToGlobalLoadBalancerRuleTestRevokedState");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -712,7 +712,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runRemoveFromGlobalLoadBalancerRuleTest() throws Exception {
 
-        Transaction txn = Transaction.open("runRemoveFromGlobalLoadBalancerRuleTest");
+        TransactionLegacy txn = TransactionLegacy.open("runRemoveFromGlobalLoadBalancerRuleTest");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -785,7 +785,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runRemoveFromGlobalLoadBalancerRuleTestUnassignedLb() throws Exception {
 
-        Transaction txn = Transaction.open("runRemoveFromGlobalLoadBalancerRuleTestUnassignedLb");
+        TransactionLegacy txn = TransactionLegacy.open("runRemoveFromGlobalLoadBalancerRuleTestUnassignedLb");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -846,7 +846,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runRemoveFromGlobalLoadBalancerRuleTestInvalidLb() throws Exception {
 
-        Transaction txn = Transaction.open("runRemoveFromGlobalLoadBalancerRuleTestInvalidLb");
+        TransactionLegacy txn = TransactionLegacy.open("runRemoveFromGlobalLoadBalancerRuleTestInvalidLb");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -890,7 +890,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runDeleteGlobalLoadBalancerRuleTestWithNoLbRules() throws Exception {
 
-        Transaction txn = Transaction.open("runDeleteGlobalLoadBalancerRuleTestWithNoLbRules");
+        TransactionLegacy txn = TransactionLegacy.open("runDeleteGlobalLoadBalancerRuleTestWithNoLbRules");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 
@@ -936,7 +936,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
 
     void runDeleteGlobalLoadBalancerRuleTestWithLbRules() throws Exception {
 
-        Transaction txn = Transaction.open("runDeleteGlobalLoadBalancerRuleTestWithLbRules");
+        TransactionLegacy txn = TransactionLegacy.open("runDeleteGlobalLoadBalancerRuleTestWithLbRules");
 
         GlobalLoadBalancingRulesServiceImpl gslbServiceImpl =  new GlobalLoadBalancingRulesServiceImpl();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/usage/src/com/cloud/usage/UsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java
index 3ff53e0..1ee21c9 100644
--- a/usage/src/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageManagerImpl.java
@@ -84,7 +84,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageManager.class})
@@ -248,7 +248,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
             m_sanity = m_sanityExecutor.scheduleAtFixedRate(new SanityCheck(), 1, m_sanityCheckInterval, TimeUnit.DAYS);
         }
 
-        Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy usageTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             if(m_heartbeatLock.lock(3)) { // 3 second timeout
                 try {
@@ -381,7 +381,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
                     s_logger.info("not parsing usage records since start time mills (" + startDateMillis + ") is on or after end time millis (" + endDateMillis + ")");
                 }
 
-                Transaction jobUpdateTxn = Transaction.open(Transaction.USAGE_DB);
+                TransactionLegacy jobUpdateTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
                 try {
                     jobUpdateTxn.start();
                     // everything seemed to work...set endDate as the last success date
@@ -411,7 +411,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
             Map<String, UsageNetworkVO> networkStats = null;
             List<VmDiskStatisticsVO> vmDiskStats = null;
             Map<String, UsageVmDiskVO> vmDiskUsages = null;
-            Transaction userTxn = Transaction.open(Transaction.CLOUD_DB);
+            TransactionLegacy userTxn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
             try {
                 Long limit = Long.valueOf(500);
                 Long offset = Long.valueOf(0);
@@ -552,7 +552,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
             List<UsageEventVO> events = _usageEventDao.getRecentEvents(new Date(endDateMillis));
 
             
-            Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
+            TransactionLegacy usageTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
             try {
                 usageTxn.start();
 
@@ -779,7 +779,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
                 usageTxn.close();
 
                 // switch back to CLOUD_DB
-                Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+                TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
                 if(!success){
                     _alertMgr.sendAlert(AlertManager.ALERT_TYPE_USAGE_SERVER_RESULT, 0, new Long(0), "Usage job failed. Job id: "+job.getId(), "Usage job failed. Job id: "+job.getId());
                 } else {
@@ -1664,7 +1664,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
     private class Heartbeat extends ManagedContextRunnable {
         @Override
         protected void runInContext() {
-            Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
+            TransactionLegacy usageTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
             try {
                 if(!m_heartbeatLock.lock(3)) { // 3 second timeout
                     if(s_logger.isTraceEnabled())
@@ -1723,7 +1723,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
         @DB
         protected boolean updateJob(Long jobId, String hostname, Integer pid, Date heartbeat, int scheduled) {
             boolean changeOwner = false;
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 txn.start();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/usage/src/com/cloud/usage/UsageSanityChecker.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageSanityChecker.java b/usage/src/com/cloud/usage/UsageSanityChecker.java
index ed78a15..35fbe81 100644
--- a/usage/src/com/cloud/usage/UsageSanityChecker.java
+++ b/usage/src/com/cloud/usage/UsageSanityChecker.java
@@ -26,7 +26,7 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class UsageSanityChecker {
     
@@ -186,7 +186,7 @@ public class UsageSanityChecker {
             // Error while reading last check id  
         }
 
-        Connection conn = Transaction.getStandaloneConnection();
+        Connection conn = TransactionLegacy.getStandaloneConnection();
         int maxId = 0;
         PreparedStatement pstmt = conn.prepareStatement("select max(id) from cloud_usage.cloud_usage");
         ResultSet rs = pstmt.executeQuery();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/utils/src/com/cloud/utils/exception/ExceptionUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/exception/ExceptionUtil.java b/utils/src/com/cloud/utils/exception/ExceptionUtil.java
index 977af92..322c23d 100644
--- a/utils/src/com/cloud/utils/exception/ExceptionUtil.java
+++ b/utils/src/com/cloud/utils/exception/ExceptionUtil.java
@@ -35,4 +35,16 @@ public class ExceptionUtil {
         }
         return writer.toString();
     }
+    
+    @SuppressWarnings("unchecked")
+    public static <T extends Throwable> void rethrow(Throwable t, Class<T> clz) throws T {
+        if ( clz.isAssignableFrom(t.getClass()) )
+            throw (T)t;
+    }
+    
+    public static <T extends Throwable> void rethrowRuntime(Throwable t) {
+        rethrow(t, RuntimeException.class);
+        rethrow(t, Error.class);
+    }
+
 }


[17/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
index 88a2b2b..301e54c 100755
--- a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
+++ b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
@@ -46,7 +46,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -186,7 +186,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     @Override
     public  List<Long> listClustersCrossingThreshold(short capacityType, Long zoneId, String configName, long compute_requested){
 
-         Transaction txn = Transaction.currentTxn();
+         TransactionLegacy txn = TransactionLegacy.currentTxn();
          PreparedStatement pstmt = null;
          List<Long> result = new ArrayList<Long>();         
          StringBuilder sql = new StringBuilder(LIST_CLUSTERS_CROSSING_THRESHOLD);
@@ -241,7 +241,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     @Override
     public  List<SummedCapacity> findCapacityBy(Integer capacityType, Long zoneId, Long podId, Long clusterId, String resource_state){
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<SummedCapacity> result = new ArrayList<SummedCapacity>();
 
@@ -291,7 +291,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     public  List<SummedCapacity> listCapacitiesGroupedByLevelAndType(Integer capacityType, Long zoneId, Long podId, Long clusterId, int level, Long limit){
 
         StringBuilder finalQuery = new StringBuilder(); 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<SummedCapacity> result = new ArrayList<SummedCapacity>();
 
@@ -378,7 +378,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     @Override
     public  List<SummedCapacity> findCapacityBy(Integer capacityType, Long zoneId, Long podId, Long clusterId){
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<SummedCapacity> result = new ArrayList<SummedCapacity>();
 
@@ -425,7 +425,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     }
 
     public void updateAllocated(Long hostId, long allocatedAmount, short capacityType, boolean add) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -458,7 +458,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
 
     @Override
     public List<Long> listClustersInZoneOrPodByHostCapacities(long id, int requiredCpu, long requiredRam, short capacityTypeForOrdering, boolean isZone){
-    Transaction txn = Transaction.currentTxn();
+    TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
 
@@ -503,7 +503,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
 
     @Override
     public List<Long> listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, Long clusterId, String hostType){
-    Transaction txn = Transaction.currentTxn();
+    TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
 
@@ -594,7 +594,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
     @Override
     public List<SummedCapacity> findByClusterPodZone(Long zoneId, Long podId, Long clusterId){
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<SummedCapacity> result = new ArrayList<SummedCapacity>();
 
@@ -706,7 +706,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
 
     @Override
     public Pair<List<Long>, Map<Long, Double>> orderClustersByAggregateCapacity(long id, short capacityTypeForOrdering, boolean isZone){
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         Map<Long, Double> clusterCapacityMap = new HashMap<Long, Double>();
@@ -759,7 +759,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
 
     @Override
     public List<Long> listPodsByHostCapacities(long zoneId, int requiredCpu, long requiredRam, short capacityType) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
 
@@ -793,7 +793,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
 
     @Override
     public Pair<List<Long>, Map<Long, Double>> orderPodsByAggregateCapacity(long zoneId, short capacityTypeForOrdering) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         Map<Long, Double> podCapacityMap = new HashMap<Long, Double>();
@@ -835,7 +835,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
 
     @Override
     public void updateCapacityState(Long dcId, Long podId, Long clusterId, Long hostId, String capacityState) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         StringBuilder sql = new StringBuilder(UPDATE_CAPACITY_STATE);
         List<Long> resourceIdList = new ArrayList<Long>();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
index 9070ff9..0d99d30 100644
--- a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
+++ b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={ResourceCountDao.class})
@@ -158,7 +158,7 @@ public class ResourceCountDaoImpl extends GenericDaoBase<ResourceCountVO, Long>
     @Override @DB
     public void createResourceCounts(long ownerId, ResourceLimit.ResourceOwnerType ownerType){
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         ResourceType[] resourceTypes = Resource.ResourceType.values();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
index f7f0f11..72ac400 100755
--- a/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value=ClusterDetailsDao.class)
 public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long> implements ClusterDetailsDao, ScopedConfigStorage {
@@ -100,7 +100,7 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
 
     @Override
     public void persist(long clusterId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<ClusterDetailsVO> sc = ClusterSearch.create();
         sc.setParameters("clusterId", clusterId);
@@ -119,7 +119,7 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
 
     @Override
     public void persist(long clusterId, String name, String value) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<ClusterDetailsVO> sc = DetailSearch.create();
         sc.setParameters("clusterId", clusterId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
index d115ce9..bd45ecd 100644
--- a/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -156,7 +156,7 @@ public class ClusterDaoImpl extends GenericDaoBase<ClusterVO, Long> implements C
 
     @Override
     public Map<Long, List<Long>> getPodClusterIdMap(List<Long> clusterIds){
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         Map<Long, List<Long>> result = new HashMap<Long, List<Long>>();
 
@@ -243,7 +243,7 @@ public class ClusterDaoImpl extends GenericDaoBase<ClusterVO, Long> implements C
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         ClusterVO cluster = createForUpdate();
         cluster.setName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
index c3d3f2a..a01af06 100644
--- a/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
@@ -26,7 +26,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value=ClusterVSMMapDao.class)
@@ -79,7 +79,7 @@ public class ClusterVSMMapDaoImpl extends GenericDaoBase<ClusterVSMMapVO, Long>
     }
     
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         ClusterVSMMapVO cluster = createForUpdate();
         //cluster.setClusterId(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
index 47b5522..e3b70a2 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
@@ -44,7 +44,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SequenceFetcher;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.net.NetUtils;
 
 /**
@@ -343,7 +343,7 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
 
     @Override @DB
     public boolean update(Long zoneId, DataCenterVO zone) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         boolean persisted = super.update(zoneId, zone);
         if (!persisted) {
@@ -408,7 +408,7 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         DataCenterVO zone = createForUpdate();
         zone.setName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
index 0ec2bb5..c2ed551 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 
@@ -52,7 +52,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase<DataCenterIpAddre
         sc.setParameters("pod", podId);
         sc.setParameters("taken", (Date)null);
         
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         DataCenterIpAddressVO  vo = lockOneRandomRow(sc, true);
         if (vo == null) {
@@ -73,7 +73,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase<DataCenterIpAddre
         sc.setParameters("dc", dcId);
         sc.setParameters("taken", (Date)null);
         
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         DataCenterIpAddressVO  vo = lockOneRandomRow(sc, true);
         if (vo == null) {
@@ -108,7 +108,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase<DataCenterIpAddre
     
     @DB
     public void addIpRange(long dcId, long podId, String start, String end) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         String insertSql = "INSERT INTO `cloud`.`op_dc_ip_address_alloc` (ip_address, data_center_id, pod_id, mac_address) VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?))";
         String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?";
         PreparedStatement stmt = null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
index 6baf04f..39d5753 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 
@@ -54,7 +54,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase<DataCent
         sc.setParameters("pod", podId);
         sc.setParameters("taken", (Date)null);
         
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         
         DataCenterLinkLocalIpAddressVO  vo = lockOneRandomRow(sc, true);
@@ -84,7 +84,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase<DataCent
         long startIP = NetUtils.ip2Long(start);
         long endIP = NetUtils.ip2Long(end);
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             stmt = txn.prepareAutoCloseStatement(insertSql);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
index 28cd027..7f65b3a 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
@@ -21,6 +21,7 @@ import java.util.List;
 import com.cloud.dc.DataCenterVnetVO;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public interface DataCenterVnetDao extends GenericDao<DataCenterVnetVO, Long> {
     public List<DataCenterVnetVO> listAllocatedVnets(long physicalNetworkId);
@@ -33,7 +34,7 @@ public interface DataCenterVnetDao extends GenericDao<DataCenterVnetVO, Long> {
     
     public void delete(long physicalNetworkId);
 
-    public void deleteVnets(Transaction txn, long dcId, long physicalNetworkId, List<String> vnets);
+    public void deleteVnets(TransactionLegacy txn, long dcId, long physicalNetworkId, List<String> vnets);
 
     public void lockRange(long dcId, long physicalNetworkId, Integer start, Integer end);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
index c052026..4e2aabf 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 /**
@@ -121,7 +121,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
     public void add(long dcId, long physicalNetworkId, List<String> vnets) {
         String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
         
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertVnet);
@@ -139,7 +139,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
     }
 
     //In the List<string> argument each string is a vlan. not a vlanRange.
-    public void deleteVnets(Transaction txn, long dcId, long physicalNetworkId, List<String> vnets) {
+    public void deleteVnets(TransactionLegacy txn, long dcId, long physicalNetworkId, List<String> vnets) {
         String deleteVnet = "DELETE FROM `cloud`.`op_dc_vnet_alloc` WHERE data_center_id=? AND physical_network_id=? AND taken IS NULL AND vnet=?";
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteVnet);
@@ -171,7 +171,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
         }
         sc.setParameters("physicalNetworkId", physicalNetworkId);
         Date now = new Date();
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         DataCenterVnetVO vo = lockOneRandomRow(sc, true);
         if (vo == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
index 88c326b..5f2b0b9 100644
--- a/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.dc.DcDetailVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value=DcDetailsDao.class)
 public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implements DcDetailsDao, ScopedConfigStorage {
@@ -106,7 +106,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implement
 
     @Override
     public void persist(long dcId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<DcDetailVO> sc = DcSearch.create();
         sc.setParameters("dcId", dcId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
index f77deda..384fa00 100644
--- a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={HostPodDao.class})
@@ -85,7 +85,7 @@ public class HostPodDaoImpl extends GenericDaoBase<HostPodVO, Long> implements H
         HashMap<Long, List<Object>> currentPodCidrSubnets = new HashMap<Long, List<Object>>();
 
         String selectSql = "SELECT id, cidr_address, cidr_size FROM host_pod_ref WHERE data_center_id=" + zoneId +" and removed IS NULL";
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
             ResultSet rs = stmt.executeQuery();
@@ -111,7 +111,7 @@ public class HostPodDaoImpl extends GenericDaoBase<HostPodVO, Long> implements H
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         HostPodVO pod = createForUpdate();
         pod.setName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
index 413f9ed..9e9a0e7 100755
--- a/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 /**
@@ -49,7 +49,7 @@ public class PodVlanDaoImpl extends GenericDaoBase<PodVlanVO, Long> implements P
     public void add(long podId, int start, int end) {
         String insertVnet = "INSERT INTO `cloud`.`op_pod_vlan_alloc` (vlan, pod_id) VALUES ( ?, ?)";
         
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertVnet);
@@ -68,7 +68,7 @@ public class PodVlanDaoImpl extends GenericDaoBase<PodVlanVO, Long> implements P
     public void delete(long podId) {
     	String deleteVnet = "DELETE FROM `cloud`.`op_pod_vlan_alloc` WHERE pod_id = ?";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteVnet);
             stmt.setLong(1, podId);
@@ -82,7 +82,7 @@ public class PodVlanDaoImpl extends GenericDaoBase<PodVlanVO, Long> implements P
         SearchCriteria<PodVlanVO> sc = FreeVlanSearch.create();
         sc.setParameters("podId", podId);
         Date now = new Date();
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             PodVlanVO vo = lockOneRandomRow(sc, true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
index a7bb9c1..d6a3879 100755
--- a/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
@@ -30,10 +30,10 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.GenericQueryBuilder;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={StorageNetworkIpAddressDao.class})
@@ -87,7 +87,7 @@ public class StorageNetworkIpAddressDaoImpl extends GenericDaoBase<StorageNetwor
     public StorageNetworkIpAddressVO takeIpAddress(long rangeId) {
 		SearchCriteria<StorageNetworkIpAddressVO> sc = untakenIp.create();
 		sc.setParameters("rangeId", rangeId);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         StorageNetworkIpAddressVO ip = lockOneRandomRow(sc, true);
         if (ip == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
index 6f5a01f..6ec819d 100755
--- a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import org.springframework.stereotype.Component;
 
@@ -301,7 +301,7 @@ public class VlanDaoImpl extends GenericDaoBase<VlanVO, Long> implements VlanDao
 
         StringBuilder sql = new StringBuilder(FindZoneWideVlans);
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql.toString());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
index 3d0588e..1b73591 100644
--- a/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
+++ b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={DomainDao.class})
@@ -117,7 +117,7 @@ public class DomainDaoImpl extends GenericDaoBase<DomainVO, Long> implements Dom
     		return null;
     	}
     	
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
     	try {
     		txn.start();
 
@@ -168,7 +168,7 @@ public class DomainDaoImpl extends GenericDaoBase<DomainVO, Long> implements Dom
         String sql1 = "SELECT * from domain where parent = " + id + " and removed is null";
 
         boolean success = false;
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
         	txn.start();
             DomainVO parentDomain = super.lockRow(domain.getParent(), true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
index e5615db..f3a11c6 100644
--- a/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
+++ b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Op;
 
 @Component
@@ -104,7 +104,7 @@ public class EventDaoImpl extends GenericDaoBase<EventVO, Long> implements Event
     @Override
     public void archiveEvents(List<EventVO> events) {
         if (events != null && !events.isEmpty()) {
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             txn.start();
             for (EventVO event : events) {
                 event = lockRow(event.getId(), true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
index 4f05bbe..4333903 100644
--- a/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
+++ b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
@@ -36,7 +36,7 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -90,7 +90,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
     public synchronized List<UsageEventVO> getRecentEvents(Date endDate) {
         long recentEventId = getMostRecentEventId();
         long maxEventId = getMaxEventId(endDate);
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         String sql = COPY_EVENTS;
         if (recentEventId == 0) {
             if (s_logger.isDebugEnabled()) {
@@ -120,7 +120,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
 
     @DB
     private long getMostRecentEventId() {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             List<UsageEventVO> latestEvents = getLatestEvent();
 
@@ -140,7 +140,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
     }
 
     private List<UsageEventVO> findRecentEvents(Date endDate) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             return listLatestEvents(endDate);
         } catch (Exception ex) {
@@ -152,7 +152,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
     }
 
     private long getMaxEventId(Date endDate) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             String sql = MAX_EVENT;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
index caf7c01..c51e2c7 100755
--- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
@@ -59,7 +59,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -490,7 +490,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
     @Override
     @DB
     public List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         if (s_logger.isDebugEnabled()) {
@@ -589,7 +589,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
     @Override
     @DB
     public List<HostVO> findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<HostVO> sc = UnmanagedApplianceSearch.create();
@@ -728,7 +728,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
     @DB
     @Override
     public List<HostVO> findLostHosts(long timeout) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<HostVO> result = new ArrayList<HostVO>();
         ResultSet rs = null;
@@ -779,7 +779,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
     public HostVO persist(HostVO host) {
         final String InsertSequenceSql = "INSERT INTO op_host(id) VALUES(?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         HostVO dbHost = super.persist(host);
@@ -805,7 +805,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
     @Override
     @DB
     public boolean update(Long hostId, HostVO host) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         boolean persisted = super.update(hostId, host);
@@ -831,7 +831,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
 
         ArrayList<RunningHostCountInfo> l = new ArrayList<RunningHostCountInfo>();
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         ;
         PreparedStatement pstmt = null;
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
index 47cdeb3..7b7267c 100644
--- a/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -96,7 +96,7 @@ public class HostDetailsDaoImpl extends GenericDaoBase<DetailVO, Long> implement
     public void persist(long hostId, Map<String, String> details) {
         final String InsertOrUpdateSql = "INSERT INTO `cloud`.`host_details` (host_id, name, value) VALUES (?,?,?) ON DUPLICATE KEY UPDATE value=?";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         for (Map.Entry<String, String> detail : details.entrySet()) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
index 0e93275..b12fd7e 100644
--- a/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
@@ -27,7 +27,7 @@ import com.cloud.host.HostTagVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value=HostTagsDao.class)
@@ -56,7 +56,7 @@ public class HostTagsDaoImpl extends GenericDaoBase<HostTagVO, Long> implements
     
     @Override
     public void persist(long hostId, List<String> hostTags) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<HostTagVO> sc = HostSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java b/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
index f53f228..370f874 100644
--- a/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
+++ b/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -74,7 +74,7 @@ public class KeystoreDaoImpl extends GenericDaoBase<KeystoreVO, Long> implements
 	@Override
 	@DB
 	public void save(String name, String certificate, String key, String domainSuffix) {
-		Transaction txn = Transaction.currentTxn();
+		TransactionLegacy txn = TransactionLegacy.currentTxn();
 		try {
 			txn.start();
 			

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
index b007e19..26f399d 100644
--- a/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value=FirewallRulesCidrsDao.class)
@@ -58,7 +58,7 @@ public class FirewallRulesCidrsDaoImpl extends GenericDaoBase<FirewallRulesCidrs
     
     @Override @DB
     public void persist(long firewallRuleId, List<String> sourceCidrs) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         for (String tag : sourceCidrs) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
index cd7878f..6aa8910 100644
--- a/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
@@ -39,7 +39,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = FirewallRulesDao.class)
@@ -220,7 +220,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
     @Override
     @DB
     public FirewallRuleVO persist(FirewallRuleVO firewallRule) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         FirewallRuleVO dbfirewallRule = super.persist(firewallRule);
@@ -309,7 +309,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         FirewallRuleVO entry = findById(id);
         if (entry != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
index 9f5f403..46a34c5 100755
--- a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.net.Ip;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -285,7 +285,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
     @Override
     @DB
     public int countIPs(long dcId, Long accountId, String vlanId, String vlanGateway, String vlanNetmask) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         int ipCount = 0;
         try {
             String sql = "SELECT count(*) FROM user_ip_address u INNER JOIN vlan v on (u.vlan_db_id = v.id AND v.data_center_id = ? AND v.vlan_id = ? AND v.vlan_gateway = ? AND v.vlan_netmask = ? AND u.account_id = ?)";
@@ -390,7 +390,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         IPAddressVO entry = findById(id);
         if (entry != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
index 72b357d..6599d6b 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
@@ -289,7 +289,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
     @Override
     @DB
     public NetworkVO persist(NetworkVO network, boolean gc, Map<String, String> serviceProviderMap) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         // 1) create network
@@ -309,7 +309,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
     @Override
     @DB
     public boolean update(Long networkId, NetworkVO network, Map<String, String> serviceProviderMap) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         super.update(networkId, network);
@@ -325,7 +325,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
     @Override
     @DB
     public void persistNetworkServiceProviders(long networkId, Map<String, String> serviceProviderMap) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         for (String service : serviceProviderMap.keySet()) {
             NetworkServiceMapVO serviceMap = new NetworkServiceMapVO(networkId, Service.getService(service), Provider.getProvider(serviceProviderMap.get(service)));
@@ -576,7 +576,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         NetworkVO entry = findById(id);
         if (entry != null) {
@@ -599,7 +599,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
     @Override
     public boolean updateState(State currentState, Event event, State nextState, Network vo, Object data) {
        // TODO: ensure this update is correct
-       Transaction txn = Transaction.currentTxn();
+       TransactionLegacy txn = TransactionLegacy.currentTxn();
        txn.start();
 
        NetworkVO networkVo = (NetworkVO) vo;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
index 2325c4a..64a846c 100644
--- a/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
@@ -29,7 +29,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -66,7 +66,7 @@ public class PortProfileDaoImpl extends GenericDaoBase<PortProfileVO, Long> impl
     	String condition = "(trunk_low_vlan_id BETWEEN " + lowVlanId + " AND " + highVlanId + ")" + " OR (trunk_high_vlan_id BETWEEN " + lowVlanId + " AND " + highVlanId + ")";
     	String selectSql = "SELECT * FROM `" + dbName + "`.`" + tableName + "` WHERE " + condition;
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
             ResultSet rs = stmt.executeQuery();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
index d82cc4a..ee8c160 100644
--- a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SecurityGroupDao.class})
@@ -109,7 +109,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase<SecurityGroupVO, Long>
 	@Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SecurityGroupVO entry = findById(id);
         if (entry != null) {
@@ -123,7 +123,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase<SecurityGroupVO, Long>
 	@Override
     @DB
     public boolean expunge(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SecurityGroupVO entry = findById(id);
         if (entry != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
index 3154ffe..98cc0d3 100644
--- a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -100,7 +100,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase<SecurityGroupWorkVO
 	@Override
 	@DB
 	public SecurityGroupWorkVO take(long serverId) {
-		final Transaction txn = Transaction.currentTxn();
+		final TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             final SearchCriteria<SecurityGroupWorkVO> sc = UntakenWorkSearch.create();
             sc.setParameters("step", Step.Scheduled);
@@ -149,7 +149,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase<SecurityGroupWorkVO
 	@Override
 	@DB
 	public void updateStep(Long vmId, Long logSequenceNumber, Step step) {
-		final Transaction txn = Transaction.currentTxn();
+		final TransactionLegacy txn = TransactionLegacy.currentTxn();
 		txn.start();
         SearchCriteria<SecurityGroupWorkVO> sc = VmIdSeqNumSearch.create();
         sc.setParameters("vmId", vmId);
@@ -180,7 +180,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase<SecurityGroupWorkVO
 	@Override
 	@DB
 	public void updateStep(Long workId, Step step) {
-		final Transaction txn = Transaction.currentTxn();
+		final TransactionLegacy txn = TransactionLegacy.currentTxn();
 		txn.start();
 
         SecurityGroupWorkVO work = lockRow(workId, true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
index 746b66f..f957439 100644
--- a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.network.security.VmRulesetLogVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={VmRulesetLogDao.class})
@@ -85,7 +85,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> im
         return createOrUpdateUsingMultiInsert(workItems);
     }
     
-    private int executeWithRetryOnDeadlock(Transaction txn, String pstmt,  List<Long> vmIds) throws SQLException {
+    private int executeWithRetryOnDeadlock(TransactionLegacy txn, String pstmt,  List<Long> vmIds) throws SQLException {
 
         int numUpdated = 0;
         final int maxTries = 3;
@@ -120,7 +120,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> im
     }
     
     protected int createOrUpdateUsingMultiInsert(Set<Long> workItems) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         int size = workItems.size();
         int count = 0;
@@ -156,7 +156,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> im
     }
     
     protected int createOrUpdateUsingBatch(Set<Long> workItems) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement stmtInsert = null;
         int [] queryResult = null;
         int count=0;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
index 5ed7fb2..7511657 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = PrivateIpDao.class)
@@ -78,7 +78,7 @@ public class PrivateIpDaoImpl extends GenericDaoBase<PrivateIpVO, Long> implemen
             sc.setParameters("ipAddress", requestedIp);
         }
         
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         PrivateIpVO  vo = lockOneRandomRow(sc, true);
         if (vo == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
index e7e006e..f5a9ed5 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
@@ -36,7 +36,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = StaticRouteDao.class)
@@ -106,7 +106,7 @@ public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> impl
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         StaticRouteVO entry = findById(id);
         if (entry != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
index 289b896..c34b551 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = VpcDao.class)
@@ -107,7 +107,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VpcVO entry = findById(id);
         if (entry != null) {
@@ -129,7 +129,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
     @Override
     @DB
     public VpcVO persist(VpcVO vpc, Map<String, List<String>> serviceProviderMap) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VpcVO newVpc = super.persist(vpc);
         persistVpcServiceProviders(vpc.getId(), serviceProviderMap);
@@ -140,7 +140,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
     @Override
     @DB
     public void persistVpcServiceProviders(long vpcId, Map<String, List<String>> serviceProviderMap) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         for (String service : serviceProviderMap.keySet()) {
             for (String provider : serviceProviderMap.get(service)) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
index b5a7e4d..3453da0 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
@@ -26,7 +26,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = VpcOfferingDao.class)
@@ -51,7 +51,7 @@ public class VpcOfferingDaoImpl extends GenericDaoBase<VpcOfferingVO, Long> impl
     @Override
     @DB
     public boolean remove(Long vpcOffId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VpcOfferingVO offering = findById(vpcOffId);
         offering.setUniqueName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
index 1c0a1d7..19290a6 100644
--- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = NetworkOfferingDao.class)
@@ -129,7 +129,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
     @Override
     @DB
     public boolean remove(Long networkOfferingId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         NetworkOfferingVO offering = findById(networkOfferingId);
         offering.setUniqueName(null);
@@ -174,7 +174,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
     @Override
     @DB
     public NetworkOfferingVO persist(NetworkOfferingVO off, Map<Detail, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         //1) persist the offering
         NetworkOfferingVO vo = super.persist(off);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java b/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
index ecf40da..fd6c802 100644
--- a/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
+++ b/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
@@ -36,7 +36,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { ProjectDao.class })
@@ -75,7 +75,7 @@ public class ProjectDaoImpl extends GenericDaoBase<ProjectVO, Long> implements P
     @DB
     public boolean remove(Long projectId) {
         boolean result = false;
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         ProjectVO projectToRemove = findById(projectId);
         projectToRemove.setName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index 91d736a..70fd570 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.service.ServiceOfferingDetailsVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value=ServiceOfferingDetailsDao.class)
@@ -82,7 +82,7 @@ public class ServiceOfferingDetailsDaoImpl extends GenericDaoBase<ServiceOfferin
 
     @Override
     public void persist(long serviceOfferingId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<ServiceOfferingDetailsVO> sc = ServiceOfferingSearch.create();
         sc.setParameters("serviceOfferingId", serviceOfferingId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
index 3e32f1a..60c87af 100644
--- a/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -69,7 +69,7 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase<LaunchPermissionVO,
 
     @Override
     public void removePermissions(long templateId, List<Long> accountIds) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -106,7 +106,7 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase<LaunchPermissionVO,
 
     @Override
     public List<VMTemplateVO> listPermittedTemplates(long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         List<VMTemplateVO> permittedTemplates = new ArrayList<VMTemplateVO>();
         PreparedStatement pstmt = null;
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
index f5319ea..94b3871 100644
--- a/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
@@ -47,7 +47,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.VMInstanceDao;
 
@@ -204,7 +204,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
     @Override
     public Long getSecHostId(long volumeId) {
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_SECHOST_ID;
         try {
@@ -221,7 +221,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
 
     @Override
     public long getLastSnapshot(long volumeId, DataStoreRole role) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_LAST_SNAPSHOT;
         try {
@@ -240,7 +240,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
 
     @Override
     public long updateSnapshotVersion(long volumeId, String from, String to) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = UPDATE_SNAPSHOT_VERSION;
         try {
@@ -258,7 +258,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
 
     @Override
     public long updateSnapshotSecHost(long dcId, long secHostId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = UPDATE_SECHOST_ID;
         try {
@@ -304,7 +304,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SnapshotVO entry = findById(id);
         if (entry != null) {
@@ -324,7 +324,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
 
     @Override
     public boolean updateState(State currentState, Event event, State nextState, SnapshotVO snapshot, Object data) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SnapshotVO snapshotVO = (SnapshotVO) snapshot;
         snapshotVO.setState(nextState);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
index f60ea17..7859ca7 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value = StoragePoolDetailsDao.class)
 public class StoragePoolDetailsDaoImpl extends GenericDaoBase<StoragePoolDetailVO, Long> implements StoragePoolDetailsDao, ScopedConfigStorage {
@@ -48,7 +48,7 @@ public class StoragePoolDetailsDaoImpl extends GenericDaoBase<StoragePoolDetailV
 
     @Override
     public void update(long poolId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         SearchCriteria<StoragePoolDetailVO> sc = PoolSearch.create();
         sc.setParameters("pool", poolId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
index 730216b..ba0c48d 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { StoragePoolHostDao.class })
@@ -104,7 +104,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
 
     @Override
     public List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<StoragePoolHostVO> result = new ArrayList<StoragePoolHostVO>();
         ResultSet rs = null;
@@ -142,7 +142,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
     public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly) {
         ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
         String sql = sharedOnly ? SHARED_STORAGE_POOL_HOST_INFO : STORAGE_POOL_HOST_INFO;
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         ;
         PreparedStatement pstmt = null;
         try {
@@ -169,7 +169,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
     public void deletePrimaryRecordsForHost(long hostId) {
         SearchCriteria<StoragePoolHostVO> sc = HostSearch.create();
         sc.setParameters("host_id", hostId);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         remove(sc);
         txn.commit();
@@ -180,7 +180,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
         SearchCriteria<StoragePoolHostVO> sc = PoolHostSearch.create();
         sc.setParameters("host_id", hostId);
         sc.setParameters("pool_id", poolId);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         remove(sc);
         txn.commit();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
index aa3e0df..df0b6f2 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -125,7 +125,7 @@ public class StoragePoolWorkDaoImpl extends GenericDaoBase<StoragePoolWorkVO, Lo
 
         StringBuilder sql = new StringBuilder(FindPoolIds);
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql.toString());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
index a96524c..9af4ae8 100755
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
@@ -57,7 +57,7 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -220,7 +220,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
 
         List<Long> l = new ArrayList<Long>();
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         PreparedStatement pstmt = null;
         try {
@@ -421,7 +421,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
      * permittedAccountsStr = permittedAccountsStr.substring(0,
      * permittedAccountsStr.length() - 1); }
      *
-     * Transaction txn = Transaction.currentTxn(); txn.start();
+     * TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start();
      *
      * Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long,
      * Long>>(); PreparedStatement pstmt = null; ResultSet rs = null; String sql
@@ -505,7 +505,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
      * permittedAccountsStr = permittedAccountsStr.substring(0,
      * permittedAccountsStr.length()-1); }
      *
-     * Transaction txn = Transaction.currentTxn(); txn.start();
+     * TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start();
      *
      * // Use LinkedHashSet here to guarantee iteration order Set<Pair<Long,
      * Long>> templateZonePairList = new LinkedHashSet<Pair<Long, Long>>();
@@ -720,7 +720,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
     @Override
     @DB
     public long addTemplateToZone(VMTemplateVO tmplt, long zoneId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VMTemplateVO tmplt2 = findById(tmplt.getId());
         if (tmplt2 == null) {
@@ -855,7 +855,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VMTemplateVO template = createForUpdate();
         template.setRemoved(new Date());
@@ -890,7 +890,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
      *
      * final String permittedAccountsStr = join(",", permittedAccounts);
      *
-     * final Transaction txn = Transaction.currentTxn(); txn.start();
+     * final TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start();
      *
      * Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long,
      * Long>>(); PreparedStatement pstmt = null; ResultSet rs = null; try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index 33b96c4..00aafba 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.storage.VMTemplateDetailVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = VMTemplateDetailsDao.class)
@@ -84,7 +84,7 @@ public class VMTemplateDetailsDaoImpl extends GenericDaoBase<VMTemplateDetailVO,
 
     @Override
     public void persist(long templateId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<VMTemplateDetailVO> sc = TemplateSearch.create();
         sc.setParameters("templateId", templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
index 85d8348..d6283b6 100755
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
@@ -46,7 +46,7 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 
 @Component
@@ -163,7 +163,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
 
     @Override
     public void update(VMTemplateHostVO instance) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             Date now = new Date();
@@ -235,7 +235,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
     @Override
     public List<VMTemplateHostVO> listByTemplateStatus(long templateId, long datacenterId,
             VMTemplateHostVO.Status downloadState) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<VMTemplateHostVO> result = new ArrayList<VMTemplateHostVO>();
         try {
@@ -267,7 +267,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
     @Override
     public List<VMTemplateHostVO> listByTemplateStatus(long templateId, long datacenterId, long podId,
             VMTemplateHostVO.Status downloadState) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<VMTemplateHostVO> result = new ArrayList<VMTemplateHostVO>();
         ResultSet rs = null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
index ba8135b..b121297 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 
 @Component
@@ -150,7 +150,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase<VMTemplateStoragePoolV
     @Override
     public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId,
             VMTemplateStoragePoolVO.Status downloadState) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
         try {
@@ -173,7 +173,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase<VMTemplateStoragePoolV
     @Override
     public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId, long podId,
             VMTemplateStoragePoolVO.Status downloadState) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
         ResultSet rs = null;
@@ -210,7 +210,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase<VMTemplateStoragePoolV
     }
 
     public List<VMTemplateStoragePoolVO> listByHostTemplate(long hostId, long templateId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
         ResultSet rs = null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
index c4a4dc7..a56959d 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
@@ -27,7 +27,7 @@ import com.cloud.storage.VMTemplateZoneVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { VMTemplateZoneDao.class })
@@ -89,7 +89,7 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase<VMTemplateZoneVO, Long
     public void deletePrimaryRecordsForTemplate(long templateId) {
         SearchCriteria<VMTemplateZoneVO> sc = TemplateSearch.create();
         sc.setParameters("template_id", templateId);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         remove(sc);
         txn.commit();


[05/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/projects/ProjectManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java
index a385739..193a49e 100755
--- a/server/src/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/com/cloud/projects/ProjectManagerImpl.java
@@ -82,6 +82,10 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.sun.mail.smtp.SMTPMessage;
 import com.sun.mail.smtp.SMTPSSLTransport;
@@ -175,7 +179,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_CREATE, eventDescription = "creating project", create=true)
     @DB
-    public Project createProject(String name, String displayText, String accountName, Long domainId) throws ResourceAllocationException{
+    public Project createProject(final String name, final String displayText, String accountName, final Long domainId) throws ResourceAllocationException{
         Account caller = CallContext.current().getCallingAccount();
         Account owner = caller;
 
@@ -201,30 +205,32 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
         //do resource limit check
         _resourceLimitMgr.checkResourceLimit(owner, ResourceType.project);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        final Account ownerFinal = owner;
+        return Transaction.execute(new TransactionCallback<Project>() {
+            @Override
+            public Project doInTransaction(TransactionStatus status) {
 
-        //Create an account associated with the project
-        StringBuilder acctNm = new StringBuilder("PrjAcct-");
-        acctNm.append(name).append("-").append(owner.getDomainId());
-
-        Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, UUID.randomUUID().toString());
-
-        Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId()));
-
-        //assign owner to the project
-        assignAccountToProject(project, owner.getId(), ProjectAccount.Role.Admin);
-
-        if (project != null) {
-            CallContext.current().setEventDetails("Project id=" + project.getId());
-        }
-
-        //Increment resource count
-        _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.project);
-
-        txn.commit();
+                //Create an account associated with the project
+                StringBuilder acctNm = new StringBuilder("PrjAcct-");
+                acctNm.append(name).append("-").append(ownerFinal.getDomainId());
+        
+                Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, UUID.randomUUID().toString());
+        
+                Project project = _projectDao.persist(new ProjectVO(name, displayText, ownerFinal.getDomainId(), projectAccount.getId()));
+        
+                //assign owner to the project
+                assignAccountToProject(project, ownerFinal.getId(), ProjectAccount.Role.Admin);
+        
+                if (project != null) {
+                    CallContext.current().setEventDetails("Project id=" + project.getId());
+                }
+        
+                //Increment resource count
+                _resourceLimitMgr.incrementResourceCount(ownerFinal.getId(), ResourceType.project);
 
-        return project;
+                return project;
+            }
+        });
     }
 
 
@@ -268,20 +274,24 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
 
     @DB
     @Override
-    public boolean deleteProject(Account caller, long callerUserId, ProjectVO project) {
+    public boolean deleteProject(Account caller, long callerUserId, final ProjectVO project) {
         //mark project as inactive first, so you can't add resources to it
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        s_logger.debug("Marking project id=" + project.getId() + " with state " + State.Disabled + " as a part of project delete...");
-        project.setState(State.Disabled);
-        boolean updateResult = _projectDao.update(project.getId(), project);
-        //owner can be already removed at this point, so adding the conditional check
-        Account projectOwner = getProjectOwner(project.getId());
-        if (projectOwner != null) {
-            _resourceLimitMgr.decrementResourceCount(projectOwner.getId(), ResourceType.project);
-        } 
+        boolean updateResult = Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                s_logger.debug("Marking project id=" + project.getId() + " with state " + State.Disabled + " as a part of project delete...");
+                project.setState(State.Disabled);
+                boolean updateResult = _projectDao.update(project.getId(), project);
+                //owner can be already removed at this point, so adding the conditional check
+                Account projectOwner = getProjectOwner(project.getId());
+                if (projectOwner != null) {
+                    _resourceLimitMgr.decrementResourceCount(projectOwner.getId(), ResourceType.project);
+                }
+
+                return updateResult;
+            }
+        });
 
-        txn.commit();
 
         if (updateResult) {
             //pass system caller when clenaup projects account
@@ -298,7 +308,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
     }
 
     @DB
-    private boolean cleanupProject(Project project, AccountVO caller, Long callerUserId) {
+    private boolean cleanupProject(final Project project, AccountVO caller, Long callerUserId) {
         boolean result=true; 
         //Delete project's account
         AccountVO account = _accountDao.findById(project.getProjectAccountId());
@@ -308,20 +318,22 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
 
         if (result) {
             //Unassign all users from the project
-
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-
-            s_logger.debug("Unassigning all accounts from project " + project + " as a part of project cleanup...");
-            List<? extends ProjectAccount> projectAccounts = _projectAccountDao.listByProjectId(project.getId());
-            for (ProjectAccount projectAccount : projectAccounts) {
-                result = result && unassignAccountFromProject(projectAccount.getProjectId(), projectAccount.getAccountId());
-            }
-
-            s_logger.debug("Removing all invitations for the project " + project + " as a part of project cleanup...");
-            _projectInvitationDao.cleanupInvitations(project.getId());
-
-            txn.commit();
+            result = Transaction.execute(new TransactionCallback<Boolean>() {
+                @Override
+                public Boolean doInTransaction(TransactionStatus status) {
+                    boolean result = true;
+                    s_logger.debug("Unassigning all accounts from project " + project + " as a part of project cleanup...");
+                    List<? extends ProjectAccount> projectAccounts = _projectAccountDao.listByProjectId(project.getId());
+                    for (ProjectAccount projectAccount : projectAccounts) {
+                        result = result && unassignAccountFromProject(projectAccount.getProjectId(), projectAccount.getAccountId());
+                    }
+        
+                    s_logger.debug("Removing all invitations for the project " + project + " as a part of project cleanup...");
+                    _projectInvitationDao.cleanupInvitations(project.getId());
+                    
+                    return result;
+                }
+            });
             if (result) {
                 s_logger.debug("Accounts are unassign successfully from project " + project + " as a part of project cleanup...");
             }
@@ -366,26 +378,28 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
     }
 
     @Override @DB
-    public boolean deleteAccountFromProject(long projectId, long accountId) {
-        boolean success = true;
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+    public boolean deleteAccountFromProject(final long projectId, final long accountId) {
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                boolean success = true;
+
+                //remove account
+                ProjectAccountVO projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountId);
+                success = _projectAccountDao.remove(projectAccount.getId());
+
+                //remove all invitations for account
+                if (success) {
+                    s_logger.debug("Removed account " + accountId + " from project " + projectId + " , cleaning up old invitations for account/project...");
+                    ProjectInvitation invite = _projectInvitationDao.findByAccountIdProjectId(accountId, projectId);
+                    if (invite != null) {
+                        success = success && _projectInvitationDao.remove(invite.getId());
+                    }
+                }
 
-        //remove account
-        ProjectAccountVO projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountId);
-        success = _projectAccountDao.remove(projectAccount.getId());
-
-        //remove all invitations for account
-        if (success) {
-            s_logger.debug("Removed account " + accountId + " from project " + projectId + " , cleaning up old invitations for account/project...");
-            ProjectInvitation invite = _projectInvitationDao.findByAccountIdProjectId(accountId, projectId);
-            if (invite != null) {
-                success = success && _projectInvitationDao.remove(invite.getId());
+                return success;
             }
-        }
-
-        txn.commit();
-        return success;
+        });
     }
 
     @Override
@@ -442,11 +456,11 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
 
     @Override @DB
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_UPDATE, eventDescription = "updating project", async=true)
-    public Project updateProject(long projectId, String displayText, String newOwnerName) throws ResourceAllocationException{
+    public Project updateProject(final long projectId, final String displayText, final String newOwnerName) throws ResourceAllocationException{
         Account caller = CallContext.current().getCallingAccount();
 
         //check that the project exists
-        ProjectVO project = getProject(projectId);
+        final ProjectVO project = getProject(projectId);
 
         if (project == null) {
             throw new InvalidParameterValueException("Unable to find the project id=" + projectId);
@@ -455,47 +469,51 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
         //verify permissions
         _accountMgr.checkAccess(caller,AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        if (displayText != null) {
-            project.setDisplayText(displayText);
-            _projectDao.update(projectId, project);
-        }
-
-        if (newOwnerName != null) {
-            //check that the new owner exists
-            Account futureOwnerAccount = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
-            if (futureOwnerAccount == null) {
-                throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
-            }
-            Account currentOwnerAccount = getProjectOwner(projectId);
-            if (currentOwnerAccount.getId() != futureOwnerAccount.getId()) {
-                ProjectAccountVO futureOwner = _projectAccountDao.findByProjectIdAccountId(projectId, futureOwnerAccount.getAccountId());
-                if (futureOwner == null) {
-                    throw new InvalidParameterValueException("Account " + newOwnerName + " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+                if (displayText != null) {
+                    project.setDisplayText(displayText);
+                    _projectDao.update(projectId, project);
                 }
-
-                //do resource limit check
-                _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(futureOwnerAccount.getId()), ResourceType.project);
-
-                //unset the role for the old owner
-                ProjectAccountVO currentOwner = _projectAccountDao.findByProjectIdAccountId(projectId, currentOwnerAccount.getId());
-                currentOwner.setAccountRole(Role.Regular);
-                _projectAccountDao.update(currentOwner.getId(), currentOwner);
-                _resourceLimitMgr.decrementResourceCount(currentOwnerAccount.getId(), ResourceType.project);
-
-                //set new owner
-                futureOwner.setAccountRole(Role.Admin);
-                _projectAccountDao.update(futureOwner.getId(), futureOwner);
-                _resourceLimitMgr.incrementResourceCount(futureOwnerAccount.getId(), ResourceType.project);
-
-
-            } else {
-                s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
+        
+                if (newOwnerName != null) {
+                    //check that the new owner exists
+                    Account futureOwnerAccount = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
+                    if (futureOwnerAccount == null) {
+                        throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
+                    }
+                    Account currentOwnerAccount = getProjectOwner(projectId);
+                    if (currentOwnerAccount.getId() != futureOwnerAccount.getId()) {
+                        ProjectAccountVO futureOwner = _projectAccountDao.findByProjectIdAccountId(projectId, futureOwnerAccount.getAccountId());
+                        if (futureOwner == null) {
+                            throw new InvalidParameterValueException("Account " + newOwnerName + " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+                        }
+        
+                        //do resource limit check
+                        _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(futureOwnerAccount.getId()), ResourceType.project);
+        
+                        //unset the role for the old owner
+                        ProjectAccountVO currentOwner = _projectAccountDao.findByProjectIdAccountId(projectId, currentOwnerAccount.getId());
+                        currentOwner.setAccountRole(Role.Regular);
+                        _projectAccountDao.update(currentOwner.getId(), currentOwner);
+                        _resourceLimitMgr.decrementResourceCount(currentOwnerAccount.getId(), ResourceType.project);
+        
+                        //set new owner
+                        futureOwner.setAccountRole(Role.Admin);
+                        _projectAccountDao.update(futureOwner.getId(), futureOwner);
+                        _resourceLimitMgr.incrementResourceCount(futureOwnerAccount.getId(), ResourceType.project);
+        
+        
+                    } else {
+                        s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
+                    }
+               }
+                
+                return null;
             }
-        }
+        }, ResourceAllocationException.class);
 
-        txn.commit();
 
         return _projectDao.findById(projectId);
 
@@ -649,37 +667,40 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
     }
 
     @DB
-    public boolean activeInviteExists(Project project, Long accountId, String email) {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        //verify if the invitation was already generated
-        ProjectInvitationVO invite = null;
-        if (accountId != null) {
-            invite = _projectInvitationDao.findByAccountIdProjectId(accountId, project.getId());
-        } else if (email != null) {
-            invite = _projectInvitationDao.findByEmailAndProjectId(email, project.getId());
-        }
-
-        if (invite != null) {
-            if (invite.getState() == ProjectInvitation.State.Completed || 
-                    (invite.getState() == ProjectInvitation.State.Pending && _projectInvitationDao.isActive(invite.getId(), _invitationTimeOut))) {
-                return true;
-            } else {
-                if (invite.getState() == ProjectInvitation.State.Pending) {
-                    expireInvitation(invite);
-                }
-                //remove the expired/declined invitation
+    public boolean activeInviteExists(final Project project, final Long accountId, final String email) {
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                //verify if the invitation was already generated
+                ProjectInvitationVO invite = null;
                 if (accountId != null) {
-                    s_logger.debug("Removing invitation in state " + invite.getState() + " for account id=" + accountId + " to project " + project);
+                    invite = _projectInvitationDao.findByAccountIdProjectId(accountId, project.getId());
                 } else if (email != null) {
-                    s_logger.debug("Removing invitation in state " + invite.getState() + " for email " + email + " to project " + project);
+                    invite = _projectInvitationDao.findByEmailAndProjectId(email, project.getId());
+                }
+
+                if (invite != null) {
+                    if (invite.getState() == ProjectInvitation.State.Completed || 
+                            (invite.getState() == ProjectInvitation.State.Pending && _projectInvitationDao.isActive(invite.getId(), _invitationTimeOut))) {
+                        return true;
+                    } else {
+                        if (invite.getState() == ProjectInvitation.State.Pending) {
+                            expireInvitation(invite);
+                        }
+                        //remove the expired/declined invitation
+                        if (accountId != null) {
+                            s_logger.debug("Removing invitation in state " + invite.getState() + " for account id=" + accountId + " to project " + project);
+                        } else if (email != null) {
+                            s_logger.debug("Removing invitation in state " + invite.getState() + " for email " + email + " to project " + project);
+                        }
+
+                        _projectInvitationDao.expunge(invite.getId());
+                    }
                 }
 
-                _projectInvitationDao.expunge(invite.getId());
+                return false;
             }
-        }
-        txn.commit();
-        return false;
+        });
     }
 
     public ProjectInvitation generateTokenBasedInvitation(Project project, String email, String token) {
@@ -710,7 +731,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
 
     @Override @DB
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_INVITATION_UPDATE, eventDescription = "updating project invitation", async=true)
-    public boolean updateInvitation(long projectId, String accountName, String token, boolean accept) {
+    public boolean updateInvitation(final long projectId, String accountName, String token, final boolean accept) {
         Account caller = CallContext.current().getCallingAccount();
         Long accountId = null;
         boolean result = true;
@@ -721,7 +742,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
         }
 
         //check that the project exists
-        Project project = getProject(projectId);
+        final Project project = getProject(projectId);
 
         if (project == null) {
             throw new InvalidParameterValueException("Unable to find the project id=" + projectId);
@@ -755,29 +776,37 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
                 expireInvitation(invite);
                 throw new InvalidParameterValueException("Invitation is expired for account id=" + accountName + " to the project id=" + projectId);
             } else {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-
-                ProjectInvitation.State newState = accept ? ProjectInvitation.State.Completed : ProjectInvitation.State.Declined;
-
-                //update invitation
-                s_logger.debug("Marking invitation " + invite + " with state " + newState);
-                invite.setState(newState);
-                result = _projectInvitationDao.update(invite.getId(), invite);
-
-                if (result && accept) {
-                    //check if account already exists for the project (was added before invitation got accepted)
-                    ProjectAccount projectAccount =  _projectAccountDao.findByProjectIdAccountId(projectId, accountId);
-                    if (projectAccount != null) {
-                        s_logger.debug("Account " + accountName + " already added to the project id=" + projectId);
-                    } else {
-                        assignAccountToProject(project, accountId, ProjectAccount.Role.Regular); 
+                
+                final ProjectInvitationVO inviteFinal = invite;
+                final Long accountIdFinal = accountId;
+                final String accountNameFinal = accountName;
+                result = Transaction.execute(new TransactionCallback<Boolean>() {
+                    @Override
+                    public Boolean doInTransaction(TransactionStatus status) {
+                        boolean result = true;
+                        
+                        ProjectInvitation.State newState = accept ? ProjectInvitation.State.Completed : ProjectInvitation.State.Declined;
+        
+                        //update invitation
+                        s_logger.debug("Marking invitation " + inviteFinal + " with state " + newState);
+                        inviteFinal.setState(newState);
+                        result = _projectInvitationDao.update(inviteFinal.getId(), inviteFinal);
+        
+                        if (result && accept) {
+                            //check if account already exists for the project (was added before invitation got accepted)
+                            ProjectAccount projectAccount =  _projectAccountDao.findByProjectIdAccountId(projectId, accountIdFinal);
+                            if (projectAccount != null) {
+                                s_logger.debug("Account " + accountNameFinal + " already added to the project id=" + projectId);
+                            } else {
+                                assignAccountToProject(project, accountIdFinal, ProjectAccount.Role.Regular); 
+                            }
+                        } else {
+                            s_logger.warn("Failed to update project invitation " + inviteFinal + " with state " + newState);
+                        }
+                        
+                        return result;
                     }
-                } else {
-                    s_logger.warn("Failed to update project invitation " + invite + " with state " + newState);
-                }
-
-                txn.commit();
+                });
             }
         } else {
             throw new InvalidParameterValueException("Unable to find invitation for account name=" + accountName + " to the project id=" + projectId);
@@ -794,11 +823,11 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACTIVATE, eventDescription = "activating project")
     @DB
-    public Project activateProject(long projectId) {
+    public Project activateProject(final long projectId) {
         Account caller = CallContext.current().getCallingAccount();
 
         //check that the project exists
-        ProjectVO project = getProject(projectId);
+        final ProjectVO project = getProject(projectId);
 
         if (project == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find project with specified id");
@@ -821,15 +850,15 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
             throw new InvalidParameterValueException("Can't activate the project in " + currentState + " state");
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        project.setState(Project.State.Active);
-        _projectDao.update(projectId, project);
-
-        _accountMgr.enableAccount(project.getProjectAccountId());
-
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                project.setState(Project.State.Active);
+                _projectDao.update(projectId, project);
+        
+                _accountMgr.enableAccount(project.getProjectAccountId());
+            }
+        });
 
         return _projectDao.findById(projectId);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java
index 7a9343c..2a245f1 100755
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@ -143,6 +143,9 @@ import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
@@ -783,10 +786,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
     }
 
     @DB
-    protected boolean doDeleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage) {
+    protected boolean doDeleteHost(final long hostId, boolean isForced, final boolean isForceDeleteStorage) {
         User caller = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
         // Verify that host exists
-        HostVO host = _hostDao.findById(hostId);
+        final HostVO host = _hostDao.findById(hostId);
         if (host == null) {
             throw new InvalidParameterValueException("Host with id " + hostId + " doesn't exist");
         }
@@ -799,7 +802,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
         // Get storage pool host mappings here because they can be removed as a
         // part of handleDisconnect later
         // TODO: find out the bad boy, what's a buggy logic!
-        List<StoragePoolHostVO> pools = _storagePoolHostDao.listByHostIdIncludingRemoved(hostId);
+        final List<StoragePoolHostVO> pools = _storagePoolHostDao.listByHostIdIncludingRemoved(hostId);
 
         ResourceStateAdapter.DeleteHostAnswer answer = (ResourceStateAdapter.DeleteHostAnswer)dispatchToStateAdapters(ResourceStateAdapter.Event.DELETE_HOST, false, host,
             new Boolean(isForced), new Boolean(isForceDeleteStorage));
@@ -817,74 +820,77 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
             return true;
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null);
-        _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove);
-
-        // delete host details
-        _hostDetailsDao.deleteDetails(hostId);
-
-        host.setGuid(null);
-        Long clusterId = host.getClusterId();
-        host.setClusterId(null);
-        _hostDao.update(host.getId(), host);
-
-        _hostDao.remove(hostId);
-        if (clusterId != null) {
-            List<HostVO> hosts = listAllHostsInCluster(clusterId);
-            if (hosts.size() == 0) {
-                ClusterVO cluster = _clusterDao.findById(clusterId);
-                cluster.setGuid(null);
-                _clusterDao.update(clusterId, cluster);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+
+                _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null);
+                _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove);
+        
+                // delete host details
+                _hostDetailsDao.deleteDetails(hostId);
+        
+                host.setGuid(null);
+                Long clusterId = host.getClusterId();
+                host.setClusterId(null);
+                _hostDao.update(host.getId(), host);
+        
+                _hostDao.remove(hostId);
+                if (clusterId != null) {
+                    List<HostVO> hosts = listAllHostsInCluster(clusterId);
+                    if (hosts.size() == 0) {
+                        ClusterVO cluster = _clusterDao.findById(clusterId);
+                        cluster.setGuid(null);
+                        _clusterDao.update(clusterId, cluster);
+                    }
+                }
+        
+                try {
+                    resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId);
+                } catch (NoTransitionException e) {
+                    s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e);
+                }
+        
+                // Delete the associated entries in host ref table
+                _storagePoolHostDao.deletePrimaryRecordsForHost(hostId);
+        
+                // Make sure any VMs that were marked as being on this host are cleaned up
+                List<VMInstanceVO> vms = _vmDao.listByHostId(hostId);
+                for (VMInstanceVO vm : vms) {
+                    // this is how VirtualMachineManagerImpl does it when it syncs VM states
+                    vm.setState(State.Stopped);
+                    vm.setHostId(null);
+                    _vmDao.persist(vm);
+                }
+        
+                // For pool ids you got, delete local storage host entries in pool table
+                // where
+                for (StoragePoolHostVO pool : pools) {
+                    Long poolId = pool.getPoolId();
+                    StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
+                    if (storagePool.isLocal() && isForceDeleteStorage) {
+                        storagePool.setUuid(null);
+                        storagePool.setClusterId(null);
+                        _storagePoolDao.update(poolId, storagePool);
+                        _storagePoolDao.remove(poolId);
+                        s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId);
+                    }
+                }
+        
+                // delete the op_host_capacity entry
+                Object[] capacityTypes = {Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY};
+                SearchCriteria<CapacityVO> hostCapacitySC = _capacityDao.createSearchCriteria();
+                hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId);
+                hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes);
+                _capacityDao.remove(hostCapacitySC);
+                // remove from dedicated resources
+                DedicatedResourceVO dr = _dedicatedDao.findByHostId(hostId);
+                if (dr != null) {
+                    _dedicatedDao.remove(dr.getId());
+                }
             }
-        }
-
-        try {
-            resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId);
-        } catch (NoTransitionException e) {
-            s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e);
-        }
-
-        // Delete the associated entries in host ref table
-        _storagePoolHostDao.deletePrimaryRecordsForHost(hostId);
+        });
 
-        // Make sure any VMs that were marked as being on this host are cleaned up
-        List<VMInstanceVO> vms = _vmDao.listByHostId(hostId);
-        for (VMInstanceVO vm : vms) {
-            // this is how VirtualMachineManagerImpl does it when it syncs VM states
-            vm.setState(State.Stopped);
-            vm.setHostId(null);
-            _vmDao.persist(vm);
-        }
-
-        // For pool ids you got, delete local storage host entries in pool table
-        // where
-        for (StoragePoolHostVO pool : pools) {
-            Long poolId = pool.getPoolId();
-            StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
-            if (storagePool.isLocal() && isForceDeleteStorage) {
-                storagePool.setUuid(null);
-                storagePool.setClusterId(null);
-                _storagePoolDao.update(poolId, storagePool);
-                _storagePoolDao.remove(poolId);
-                s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId);
-            }
-        }
-
-        // delete the op_host_capacity entry
-        Object[] capacityTypes = {Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY};
-        SearchCriteria<CapacityVO> hostCapacitySC = _capacityDao.createSearchCriteria();
-        hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId);
-        hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes);
-        _capacityDao.remove(hostCapacitySC);
-        // remove from dedicated resources
-        DedicatedResourceVO dr = _dedicatedDao.findByHostId(hostId);
-        if (dr != null) {
-            _dedicatedDao.remove(dr.getId());
-        }
-        txn.commit();
         return true;
     }
 
@@ -904,63 +910,61 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
 
     @Override
     @DB
-    public boolean deleteCluster(DeleteClusterCmd cmd) {
-        Transaction txn = Transaction.currentTxn();
+    public boolean deleteCluster(final DeleteClusterCmd cmd) {
         try {
-            txn.start();
-            ClusterVO cluster = _clusterDao.lockRow(cmd.getId(), true);
-            if (cluster == null) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Cluster: " + cmd.getId() + " does not even exist.  Delete call is ignored.");
-                }
-                txn.rollback();
-                throw new CloudRuntimeException("Cluster: " + cmd.getId() + " does not exist");
-            }
-
-            Hypervisor.HypervisorType hypervisorType = cluster.getHypervisorType();
-
-            List<HostVO> hosts = listAllHostsInCluster(cmd.getId());
-            if (hosts.size() > 0) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Cluster: " + cmd.getId() + " still has hosts, can't remove");
-                }
-                txn.rollback();
-                throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has hosts");
-            }
-
-            // don't allow to remove the cluster if it has non-removed storage
-            // pools
-            List<StoragePoolVO> storagePools = _storagePoolDao.listPoolsByCluster(cmd.getId());
-            if (storagePools.size() > 0) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Cluster: " + cmd.getId() + " still has storage pools, can't remove");
-                }
-                txn.rollback();
-                throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has storage pools");
-            }
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    ClusterVO cluster = _clusterDao.lockRow(cmd.getId(), true);
+                    if (cluster == null) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Cluster: " + cmd.getId() + " does not even exist.  Delete call is ignored.");
+                        }
+                        throw new CloudRuntimeException("Cluster: " + cmd.getId() + " does not exist");
+                    }
+        
+                    Hypervisor.HypervisorType hypervisorType = cluster.getHypervisorType();
+        
+                    List<HostVO> hosts = listAllHostsInCluster(cmd.getId());
+                    if (hosts.size() > 0) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Cluster: " + cmd.getId() + " still has hosts, can't remove");
+                        }
+                        throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has hosts");
+                    }
+        
+                    // don't allow to remove the cluster if it has non-removed storage
+                    // pools
+                    List<StoragePoolVO> storagePools = _storagePoolDao.listPoolsByCluster(cmd.getId());
+                    if (storagePools.size() > 0) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Cluster: " + cmd.getId() + " still has storage pools, can't remove");
+                        }
+                        throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has storage pools");
+                    }
+        
+                    if (_clusterDao.remove(cmd.getId())) {
+                        _capacityDao.removeBy(null, null, null, cluster.getId(), null);
+                        // If this cluster is of type vmware, and if the nexus vswitch
+                        // global parameter setting is turned
+                        // on, remove the row in cluster_vsm_map for this cluster id.
+                        if (hypervisorType == HypervisorType.VMware && Boolean.parseBoolean(_configDao.getValue(Config.VmwareUseNexusVSwitch.toString()))) {
+                            _clusterVSMMapDao.removeByClusterId(cmd.getId());
+                        }
+                        // remove from dedicated resources
+                        DedicatedResourceVO dr = _dedicatedDao.findByClusterId(cluster.getId());
+                        if (dr != null) {
+                            _dedicatedDao.remove(dr.getId());
+                        }
+                    }
 
-            if (_clusterDao.remove(cmd.getId())) {
-                _capacityDao.removeBy(null, null, null, cluster.getId(), null);
-                // If this cluster is of type vmware, and if the nexus vswitch
-                // global parameter setting is turned
-                // on, remove the row in cluster_vsm_map for this cluster id.
-                if (hypervisorType == HypervisorType.VMware && Boolean.parseBoolean(_configDao.getValue(Config.VmwareUseNexusVSwitch.toString()))) {
-                    _clusterVSMMapDao.removeByClusterId(cmd.getId());
-                }
-                // remove from dedicated resources
-                DedicatedResourceVO dr = _dedicatedDao.findByClusterId(cluster.getId());
-                if (dr != null) {
-                    _dedicatedDao.remove(dr.getId());
                 }
-            }
-
-            txn.commit();
+            });
             return true;
         } catch (CloudRuntimeException e) {
             throw e;
         } catch (Throwable t) {
             s_logger.error("Unable to delete cluster: " + cmd.getId(), t);
-            txn.rollback();
             return false;
         }
     }
@@ -1034,26 +1038,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
         }
 
         if (doUpdate) {
-            Transaction txn = Transaction.currentTxn();
-            try {
-                txn.start();
-                _clusterDao.update(cluster.getId(), cluster);
-                txn.commit();
-            } catch (Exception e) {
-                s_logger.error("Unable to update cluster due to " + e.getMessage(), e);
-                throw new CloudRuntimeException("Failed to update cluster. Please contact Cloud Support.");
-            }
+            _clusterDao.update(cluster.getId(), cluster);
         }
 
         if (newManagedState != null && !newManagedState.equals(oldManagedState)) {
-            Transaction txn = Transaction.currentTxn();
             if (newManagedState.equals(Managed.ManagedState.Unmanaged)) {
                 boolean success = false;
                 try {
-                    txn.start();
                     cluster.setManagedState(Managed.ManagedState.PrepareUnmanaged);
                     _clusterDao.update(cluster.getId(), cluster);
-                    txn.commit();
                     List<HostVO> hosts = listAllUpAndEnabledHosts(Host.Type.Routing, cluster.getId(), cluster.getPodId(), cluster.getDataCenterId());
                     for (HostVO host : hosts) {
                         if (host.getType().equals(Host.Type.Routing) && !host.getStatus().equals(Status.Down) && !host.getStatus().equals(Status.Disconnected) &&
@@ -1092,16 +1085,12 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
                         throw new CloudRuntimeException("PrepareUnmanaged Failed due to some hosts are still in UP status after 5 Minutes, please try later ");
                     }
                 } finally {
-                    txn.start();
                     cluster.setManagedState(success ? Managed.ManagedState.Unmanaged : Managed.ManagedState.PrepareUnmanagedError);
                     _clusterDao.update(cluster.getId(), cluster);
-                    txn.commit();
                 }
             } else if (newManagedState.equals(Managed.ManagedState.Managed)) {
-                txn.start();
                 cluster.setManagedState(Managed.ManagedState.Managed);
                 _clusterDao.update(cluster.getId(), cluster);
-                txn.commit();
             }
 
         }
@@ -2459,35 +2448,37 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_HOST_RESERVATION_RELEASE, eventDescription = "releasing host reservation", async = true)
-    public boolean releaseHostReservation(Long hostId) {
-        Transaction txn = Transaction.currentTxn();
+    public boolean releaseHostReservation(final Long hostId) {
         try {
-            txn.start();
-            PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
-            if (reservationEntry != null) {
-                long id = reservationEntry.getId();
-                PlannerHostReservationVO hostReservation = _plannerHostReserveDao.lockRow(id, true);
-                if (hostReservation == null) {
+            return Transaction.execute(new TransactionCallback<Boolean>() {
+                @Override
+                public Boolean doInTransaction(TransactionStatus status) {
+                    PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
+                    if (reservationEntry != null) {
+                        long id = reservationEntry.getId();
+                        PlannerHostReservationVO hostReservation = _plannerHostReserveDao.lockRow(id, true);
+                        if (hostReservation == null) {
+                            if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("Host reservation for host: " + hostId + " does not even exist.  Release reservartion call is ignored.");
+                            }
+                            return false;
+                        }
+                        hostReservation.setResourceUsage(null);
+                        _plannerHostReserveDao.persist(hostReservation);
+                        return true;
+                    }
+
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug("Host reservation for host: " + hostId + " does not even exist.  Release reservartion call is ignored.");
                     }
-                    txn.rollback();
+
                     return false;
                 }
-                hostReservation.setResourceUsage(null);
-                _plannerHostReserveDao.persist(hostReservation);
-                txn.commit();
-                return true;
-            }
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Host reservation for host: " + hostId + " does not even exist.  Release reservartion call is ignored.");
-            }
-            return false;
+            });
         } catch (CloudRuntimeException e) {
             throw e;
         } catch (Throwable t) {
             s_logger.error("Unable to release host reservation for host: " + hostId, t);
-            txn.rollback();
             return false;
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
index 1f8713a..bfe32ec 100755
--- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -90,6 +90,10 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
@@ -361,8 +365,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
 
     @Override
     @DB
-    public void checkResourceLimit(Account account, ResourceType type, long... count) throws ResourceAllocationException {
-        long numResources = ((count.length == 0) ? 1 : count[0]);
+    public void checkResourceLimit(final Account account, final ResourceType type, long... count) throws ResourceAllocationException {
+        final long numResources = ((count.length == 0) ? 1 : count[0]);
         Project project = null;
 
         // Don't place any limits on system or root admin accounts
@@ -374,53 +378,55 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
             project = _projectDao.findByProjectAccountId(account.getId());
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        try {
-            // Lock all rows first so nobody else can read it
-            Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(account.getId(), ResourceOwnerType.Account, type);
-            SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
-            sc.setParameters("id", rowIdsToLock.toArray());
-            _resourceCountDao.lockRows(sc, null, true);
-
-            // Check account limits
-            long accountLimit = findCorrectResourceLimitForAccount(account, type);
-            long potentialCount = _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type) + numResources;
-            if (accountLimit != Resource.RESOURCE_UNLIMITED && potentialCount > accountLimit) {
-                String message = "Maximum number of resources of type '" + type + "' for account name=" + account.getAccountName()
-                        + " in domain id=" + account.getDomainId() + " has been exceeded.";
-                if (project != null) {
-                    message = "Maximum number of resources of type '" + type + "' for project name=" + project.getName()
+        final Project projectFinal = project;
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+                // Lock all rows first so nobody else can read it
+                Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(account.getId(), ResourceOwnerType.Account, type);
+                SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+                sc.setParameters("id", rowIdsToLock.toArray());
+                _resourceCountDao.lockRows(sc, null, true);
+    
+                // Check account limits
+                long accountLimit = findCorrectResourceLimitForAccount(account, type);
+                long potentialCount = _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type) + numResources;
+                if (accountLimit != Resource.RESOURCE_UNLIMITED && potentialCount > accountLimit) {
+                    String message = "Maximum number of resources of type '" + type + "' for account name=" + account.getAccountName()
                             + " in domain id=" + account.getDomainId() + " has been exceeded.";
+                    if (projectFinal != null) {
+                        message = "Maximum number of resources of type '" + type + "' for project name=" + projectFinal.getName()
+                                + " in domain id=" + account.getDomainId() + " has been exceeded.";
+                    }
+                    throw new ResourceAllocationException(message, type);
                 }
-                throw new ResourceAllocationException(message, type);
-            }
-
-            // check all domains in the account's domain hierarchy
-            Long domainId = null;
-            if (project != null) {
-                domainId = project.getDomainId();
-            } else {
-                domainId = account.getDomainId();
-            }
-
-            while (domainId != null) {
-                DomainVO domain = _domainDao.findById(domainId);
-                // no limit check if it is ROOT domain
-                if (domainId != Domain.ROOT_DOMAIN) {
-                    ResourceLimitVO domainLimit = _resourceLimitDao.findByOwnerIdAndType(domainId, ResourceOwnerType.Domain, type);
-                    if (domainLimit != null && domainLimit.getMax().longValue() != Resource.RESOURCE_UNLIMITED) {
-                        long domainCount = _resourceCountDao.getResourceCount(domainId, ResourceOwnerType.Domain, type);
-                        if ((domainCount + numResources) > domainLimit.getMax().longValue()) {
-                            throw new ResourceAllocationException("Maximum number of resources of type '" + type + "' for domain id=" + domainId + " has been exceeded.", type);
+    
+                // check all domains in the account's domain hierarchy
+                Long domainId = null;
+                if (projectFinal != null) {
+                    domainId = projectFinal.getDomainId();
+                } else {
+                    domainId = account.getDomainId();
+                }
+    
+                while (domainId != null) {
+                    DomainVO domain = _domainDao.findById(domainId);
+                    // no limit check if it is ROOT domain
+                    if (domainId != Domain.ROOT_DOMAIN) {
+                        ResourceLimitVO domainLimit = _resourceLimitDao.findByOwnerIdAndType(domainId, ResourceOwnerType.Domain, type);
+                        if (domainLimit != null && domainLimit.getMax().longValue() != Resource.RESOURCE_UNLIMITED) {
+                            long domainCount = _resourceCountDao.getResourceCount(domainId, ResourceOwnerType.Domain, type);
+                            if ((domainCount + numResources) > domainLimit.getMax().longValue()) {
+                                throw new ResourceAllocationException("Maximum number of resources of type '" + type + "' for domain id=" + domainId + " has been exceeded.", type);
+                            }
                         }
                     }
+                    domainId = domain.getParent();
                 }
-                domainId = domain.getParent();
+                
+                return null;
             }
-        } finally {
-            txn.commit();
-        }
+        }, ResourceAllocationException.class);
     }
 
     @Override
@@ -716,143 +722,143 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
     }
 
     @DB
-    protected boolean updateResourceCountForAccount(long accountId, ResourceType type, boolean increment, long delta) {
-        boolean result = true;
+    protected boolean updateResourceCountForAccount(final long accountId, final ResourceType type, final boolean increment, final long delta) {
         try {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-
-            Set<Long> rowsToLock = _resourceCountDao.listAllRowsToUpdate(accountId, ResourceOwnerType.Account, type);
-
-            // Lock rows first
-            SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
-            sc.setParameters("id", rowsToLock.toArray());
-            List<ResourceCountVO> rowsToUpdate = _resourceCountDao.lockRows(sc, null, true);
-
-            for (ResourceCountVO rowToUpdate : rowsToUpdate) {
-                if (!_resourceCountDao.updateById(rowToUpdate.getId(), increment, delta)) {
-                    s_logger.trace("Unable to update resource count for the row " + rowToUpdate);
-                    result = false;
+            return Transaction.execute(new TransactionCallback<Boolean>() {
+                @Override
+                public Boolean doInTransaction(TransactionStatus status) {
+                    boolean result = true;
+                    Set<Long> rowsToLock = _resourceCountDao.listAllRowsToUpdate(accountId, ResourceOwnerType.Account, type);
+        
+                    // Lock rows first
+                    SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+                    sc.setParameters("id", rowsToLock.toArray());
+                    List<ResourceCountVO> rowsToUpdate = _resourceCountDao.lockRows(sc, null, true);
+        
+                    for (ResourceCountVO rowToUpdate : rowsToUpdate) {
+                        if (!_resourceCountDao.updateById(rowToUpdate.getId(), increment, delta)) {
+                            s_logger.trace("Unable to update resource count for the row " + rowToUpdate);
+                            result = false;
+                        }
+                    }
+                    
+                    return result;
                 }
-            }
-
-            txn.commit();
+            });
         } catch (Exception ex) {
             s_logger.error("Failed to update resource count for account id=" + accountId);
-            result = false;
+            return false;
         }
-        return result;
     }
 
     @DB
-    protected long recalculateDomainResourceCount(long domainId, ResourceType type) {
-        long newCount = 0;
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        try {
-            // Lock all rows first so nobody else can read it
-            Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(domainId, ResourceOwnerType.Domain, type);
-            SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
-            sc.setParameters("id", rowIdsToLock.toArray());
-            _resourceCountDao.lockRows(sc, null, true);
-
-            ResourceCountVO domainRC = _resourceCountDao.findByOwnerAndType(domainId, ResourceOwnerType.Domain, type);
-            long oldCount = domainRC.getCount();
-
-            List<DomainVO> domainChildren = _domainDao.findImmediateChildrenForParent(domainId);
-            // for each child domain update the resource count
-            if (type.supportsOwner(ResourceOwnerType.Domain)) {
-
-                // calculate project count here
-                if (type == ResourceType.project) {
-                    newCount = newCount + _projectDao.countProjectsForDomain(domainId);
+    protected long recalculateDomainResourceCount(final long domainId, final ResourceType type) {
+        return Transaction.execute(new TransactionCallback<Long>() {
+            @Override
+            public Long doInTransaction(TransactionStatus status) {
+                long newCount = 0;
+
+                // Lock all rows first so nobody else can read it
+                Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(domainId, ResourceOwnerType.Domain, type);
+                SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+                sc.setParameters("id", rowIdsToLock.toArray());
+                _resourceCountDao.lockRows(sc, null, true);
+    
+                ResourceCountVO domainRC = _resourceCountDao.findByOwnerAndType(domainId, ResourceOwnerType.Domain, type);
+                long oldCount = domainRC.getCount();
+    
+                List<DomainVO> domainChildren = _domainDao.findImmediateChildrenForParent(domainId);
+                // for each child domain update the resource count
+                if (type.supportsOwner(ResourceOwnerType.Domain)) {
+    
+                    // calculate project count here
+                    if (type == ResourceType.project) {
+                        newCount = newCount + _projectDao.countProjectsForDomain(domainId);
+                    }
+    
+                    for (DomainVO domainChild : domainChildren) {
+                        long domainCount = recalculateDomainResourceCount(domainChild.getId(), type);
+                        newCount = newCount + domainCount; // add the child domain count to parent domain count
+                    }
                 }
-
-                for (DomainVO domainChild : domainChildren) {
-                    long domainCount = recalculateDomainResourceCount(domainChild.getId(), type);
-                    newCount = newCount + domainCount; // add the child domain count to parent domain count
+    
+                if (type.supportsOwner(ResourceOwnerType.Account)) {
+                    List<AccountVO> accounts = _accountDao.findActiveAccountsForDomain(domainId);
+                    for (AccountVO account : accounts) {
+                        long accountCount = recalculateAccountResourceCount(account.getId(), type);
+                        newCount = newCount + accountCount; // add account's resource count to parent domain count
+                    }
                 }
-            }
-
-            if (type.supportsOwner(ResourceOwnerType.Account)) {
-                List<AccountVO> accounts = _accountDao.findActiveAccountsForDomain(domainId);
-                for (AccountVO account : accounts) {
-                    long accountCount = recalculateAccountResourceCount(account.getId(), type);
-                    newCount = newCount + accountCount; // add account's resource count to parent domain count
+                _resourceCountDao.setResourceCount(domainId, ResourceOwnerType.Domain, type, newCount);
+    
+                if (oldCount != newCount) {
+                    s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
+                            newCount + ") for type " + type + " for domain ID " + domainId + " is fixed during resource count recalculation.");
                 }
+                
+                return newCount;
             }
-            _resourceCountDao.setResourceCount(domainId, ResourceOwnerType.Domain, type, newCount);
-
-            if (oldCount != newCount) {
-                s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
-                        newCount + ") for type " + type + " for domain ID " + domainId + " is fixed during resource count recalculation.");
-            }
-        } catch (Exception e) {
-            throw new CloudRuntimeException("Failed to update resource count for domain with Id " + domainId);
-        } finally {
-            txn.commit();
-        }
-
-        return newCount;
+        });
     }
 
     @DB
-    protected long recalculateAccountResourceCount(long accountId, ResourceType type) {
-        Long newCount = null;
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        // this lock guards against the updates to user_vm, volume, snapshot, public _ip and template table
-        // as any resource creation precedes with the resourceLimitExceeded check which needs this lock too
-        SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
-        sc.setParameters("accountId", accountId);
-        _resourceCountDao.lockRows(sc, null, true);
-
-        ResourceCountVO accountRC = _resourceCountDao.findByOwnerAndType(accountId, ResourceOwnerType.Account, type);
-        long oldCount = 0;
-        if (accountRC != null)
-            oldCount = accountRC.getCount();
-
-        if (type == Resource.ResourceType.user_vm) {
-            newCount = _userVmDao.countAllocatedVMsForAccount(accountId);
-        } else if (type == Resource.ResourceType.volume) {
-            newCount = _volumeDao.countAllocatedVolumesForAccount(accountId);
-            long virtualRouterCount = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId).size();
-            newCount = newCount - virtualRouterCount; // don't count the volumes of virtual router
-        } else if (type == Resource.ResourceType.snapshot) {
-            newCount = _snapshotDao.countSnapshotsForAccount(accountId);
-        } else if (type == Resource.ResourceType.public_ip) {
-            newCount = calculatePublicIpForAccount(accountId);
-        } else if (type == Resource.ResourceType.template) {
-            newCount = _vmTemplateDao.countTemplatesForAccount(accountId);
-        } else if (type == Resource.ResourceType.project) {
-            newCount = _projectAccountDao.countByAccountIdAndRole(accountId, Role.Admin);
-        } else if (type == Resource.ResourceType.network) {
-            newCount = _networkDao.countNetworksUserCanCreate(accountId);
-        } else if (type == Resource.ResourceType.vpc) {
-            newCount = _vpcDao.countByAccountId(accountId);
-        } else if (type == Resource.ResourceType.cpu) {
-            newCount = countCpusForAccount(accountId);
-        } else if (type == Resource.ResourceType.memory) {
-            newCount = calculateMemoryForAccount(accountId);
-        } else if (type == Resource.ResourceType.primary_storage) {
-            List<Long> virtualRouters = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId);
-            newCount = _volumeDao.primaryStorageUsedForAccount(accountId, virtualRouters);
-        } else if (type == Resource.ResourceType.secondary_storage) {
-            newCount = calculateSecondaryStorageForAccount(accountId);
-        } else {
-            throw new InvalidParameterValueException("Unsupported resource type " + type);
-        }
-        _resourceCountDao.setResourceCount(accountId, ResourceOwnerType.Account, type, (newCount == null) ? 0 : newCount.longValue());
-
-        if (oldCount != newCount) {
-            s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
-                    newCount + ") for type " + type + " for account ID " + accountId + " is fixed during resource count recalculation.");
-        }
-        txn.commit();
+    protected long recalculateAccountResourceCount(final long accountId, final ResourceType type) {
+        Long newCount = Transaction.execute(new TransactionCallback<Long>() {
+            @Override
+            public Long doInTransaction(TransactionStatus status) {
+                Long newCount = null;
+
+                // this lock guards against the updates to user_vm, volume, snapshot, public _ip and template table
+                // as any resource creation precedes with the resourceLimitExceeded check which needs this lock too
+                SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+                sc.setParameters("accountId", accountId);
+                _resourceCountDao.lockRows(sc, null, true);
+        
+                ResourceCountVO accountRC = _resourceCountDao.findByOwnerAndType(accountId, ResourceOwnerType.Account, type);
+                long oldCount = 0;
+                if (accountRC != null)
+                    oldCount = accountRC.getCount();
+        
+                if (type == Resource.ResourceType.user_vm) {
+                    newCount = _userVmDao.countAllocatedVMsForAccount(accountId);
+                } else if (type == Resource.ResourceType.volume) {
+                    newCount = _volumeDao.countAllocatedVolumesForAccount(accountId);
+                    long virtualRouterCount = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId).size();
+                    newCount = newCount - virtualRouterCount; // don't count the volumes of virtual router
+                } else if (type == Resource.ResourceType.snapshot) {
+                    newCount = _snapshotDao.countSnapshotsForAccount(accountId);
+                } else if (type == Resource.ResourceType.public_ip) {
+                    newCount = calculatePublicIpForAccount(accountId);
+                } else if (type == Resource.ResourceType.template) {
+                    newCount = _vmTemplateDao.countTemplatesForAccount(accountId);
+                } else if (type == Resource.ResourceType.project) {
+                    newCount = _projectAccountDao.countByAccountIdAndRole(accountId, Role.Admin);
+                } else if (type == Resource.ResourceType.network) {
+                    newCount = _networkDao.countNetworksUserCanCreate(accountId);
+                } else if (type == Resource.ResourceType.vpc) {
+                    newCount = _vpcDao.countByAccountId(accountId);
+                } else if (type == Resource.ResourceType.cpu) {
+                    newCount = countCpusForAccount(accountId);
+                } else if (type == Resource.ResourceType.memory) {
+                    newCount = calculateMemoryForAccount(accountId);
+                } else if (type == Resource.ResourceType.primary_storage) {
+                    List<Long> virtualRouters = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId);
+                    newCount = _volumeDao.primaryStorageUsedForAccount(accountId, virtualRouters);
+                } else if (type == Resource.ResourceType.secondary_storage) {
+                    newCount = calculateSecondaryStorageForAccount(accountId);
+                } else {
+                    throw new InvalidParameterValueException("Unsupported resource type " + type);
+                }
+                _resourceCountDao.setResourceCount(accountId, ResourceOwnerType.Account, type, (newCount == null) ? 0 : newCount.longValue());
+        
+                if (oldCount != newCount) {
+                    s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
+                            newCount + ") for type " + type + " for account ID " + accountId + " is fixed during resource count recalculation.");
+                }
+                
+                return newCount;
+            }
+        });
 
         return (newCount == null) ? 0 : newCount.longValue();
     }


[20/20] git commit: updated refs/heads/txn-refactor to 7364d55

Posted by da...@apache.org.
Removed unneeded method


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7364d55c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7364d55c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7364d55c

Branch: refs/heads/txn-refactor
Commit: 7364d55ccdb97e0bcb9c04566f86a26aa6cbd678
Parents: f62e28c
Author: Darren Shepherd <da...@gmail.com>
Authored: Wed Oct 16 09:48:19 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Wed Oct 16 09:48:19 2013 -0700

----------------------------------------------------------------------
 framework/db/src/com/cloud/utils/db/Transaction.java | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7364d55c/framework/db/src/com/cloud/utils/db/Transaction.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/Transaction.java b/framework/db/src/com/cloud/utils/db/Transaction.java
index 0ca1cc7..4f8e5c7 100755
--- a/framework/db/src/com/cloud/utils/db/Transaction.java
+++ b/framework/db/src/com/cloud/utils/db/Transaction.java
@@ -57,9 +57,5 @@ public class Transaction {
             throw e;
         }
     }
-    
-    public static Object startTransaction() {
-    	return null;
-    }
-    
+
 }


[02/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 6e87916..5053a97 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -35,7 +35,6 @@ import javax.naming.ConfigurationException;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -239,8 +238,12 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExecutionException;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -1375,11 +1378,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     public UserVm recoverVirtualMachine(RecoverVMCmd cmd)
             throws ResourceAllocationException, CloudRuntimeException {
 
-        Long vmId = cmd.getId();
+        final Long vmId = cmd.getId();
         Account caller = CallContext.current().getCallingAccount();
 
         // Verify input parameters
-        UserVmVO vm = _vmDao.findById(vmId.longValue());
+        final UserVmVO vm = _vmDao.findById(vmId.longValue());
 
         if (vm == null) {
             throw new InvalidParameterValueException(
@@ -1409,68 +1412,72 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             s_logger.debug("Recovering vm " + vmId);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        AccountVO account = null;
-        txn.start();
-
-        account = _accountDao.lockRow(vm.getAccountId(), true);
-
-        // if the account is deleted, throw error
-        if (account.getRemoved() != null) {
-            throw new CloudRuntimeException(
-                    "Unable to recover VM as the account is deleted");
-        }
-
-        // Get serviceOffering for Virtual Machine
-        ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
-
-        // First check that the maximum number of UserVMs, CPU and Memory limit for the given
-        // accountId will not be exceeded
-        resourceLimitCheck(account, new Long(serviceOffering.getCpu()), new Long(serviceOffering.getRamSize()));
-
-        _haMgr.cancelDestroy(vm, vm.getHostId());
-
-        try {
-            if (!_itMgr.stateTransitTo(vm,
-                    VirtualMachine.Event.RecoveryRequested, null)) {
-                s_logger.debug("Unable to recover the vm because it is not in the correct state: "
-                        + vmId);
-                throw new InvalidParameterValueException(
-                        "Unable to recover the vm because it is not in the correct state: "
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+        
+                Account account = _accountDao.lockRow(vm.getAccountId(), true);
+        
+                // if the account is deleted, throw error
+                if (account.getRemoved() != null) {
+                    throw new CloudRuntimeException(
+                            "Unable to recover VM as the account is deleted");
+                }
+        
+                // Get serviceOffering for Virtual Machine
+                ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
+        
+                // First check that the maximum number of UserVMs, CPU and Memory limit for the given
+                // accountId will not be exceeded
+                resourceLimitCheck(account, new Long(serviceOffering.getCpu()), new Long(serviceOffering.getRamSize()));
+        
+                _haMgr.cancelDestroy(vm, vm.getHostId());
+        
+                try {
+                    if (!_itMgr.stateTransitTo(vm,
+                            VirtualMachine.Event.RecoveryRequested, null)) {
+                        s_logger.debug("Unable to recover the vm because it is not in the correct state: "
                                 + vmId);
-            }
-        } catch (NoTransitionException e) {
-            throw new InvalidParameterValueException(
-                    "Unable to recover the vm because it is not in the correct state: "
-                            + vmId);
-        }
-
-        // Recover the VM's disks
-        List<VolumeVO> volumes = _volsDao.findByInstance(vmId);
-        for (VolumeVO volume : volumes) {
-            if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
-                // Create an event
-                Long templateId = volume.getTemplateId();
-                Long diskOfferingId = volume.getDiskOfferingId();
-                Long offeringId = null;
-                if (diskOfferingId != null) {
-                    DiskOfferingVO offering = _diskOfferingDao
-                            .findById(diskOfferingId);
-                    if (offering != null
-                            && (offering.getType() == DiskOfferingVO.Type.Disk)) {
-                        offeringId = offering.getId();
+                        throw new InvalidParameterValueException(
+                                "Unable to recover the vm because it is not in the correct state: "
+                                        + vmId);
+                    }
+                } catch (NoTransitionException e) {
+                    throw new InvalidParameterValueException(
+                            "Unable to recover the vm because it is not in the correct state: "
+                                    + vmId);
+                }
+        
+                // Recover the VM's disks
+                List<VolumeVO> volumes = _volsDao.findByInstance(vmId);
+                for (VolumeVO volume : volumes) {
+                    if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
+                        // Create an event
+                        Long templateId = volume.getTemplateId();
+                        Long diskOfferingId = volume.getDiskOfferingId();
+                        Long offeringId = null;
+                        if (diskOfferingId != null) {
+                            DiskOfferingVO offering = _diskOfferingDao
+                                    .findById(diskOfferingId);
+                            if (offering != null
+                                    && (offering.getType() == DiskOfferingVO.Type.Disk)) {
+                                offeringId = offering.getId();
+                            }
+                        }
+                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
+                                volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId, templateId,
+                                volume.getSize(), Volume.class.getName(), volume.getUuid());
                     }
                 }
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
-                        volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId, templateId,
-                        volume.getSize(), Volume.class.getName(), volume.getUuid());
+        
+                //Update Resource Count for the given account
+                resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()),
+                        new Long(serviceOffering.getRamSize()));
+                
+                return null;
             }
-        }
+        }, ResourceAllocationException.class);
 
-        //Update Resource Count for the given account
-        resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()),
-                new Long(serviceOffering.getRamSize()));
-        txn.commit();
 
         return _vmDao.findById(vmId);
     }
@@ -1965,8 +1972,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     @DB
     protected InstanceGroupVO createVmGroup(String groupName, long accountId) {
         Account account = null;
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
         try {
             account = _accountDao.acquireInLockTable(accountId); // to ensure
             // duplicate
@@ -1989,7 +1994,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             if (account != null) {
                 _accountDao.releaseFromLockTable(accountId);
             }
-            txn.commit();
         }
     }
 
@@ -2032,7 +2036,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
     @Override
     @DB
-    public boolean addInstanceToGroup(long userVmId, String groupName) {
+    public boolean addInstanceToGroup(final long userVmId, String groupName) {
         UserVmVO vm = _vmDao.findById(userVmId);
 
         InstanceGroupVO group = _vmGroupDao.findByAccountAndName(
@@ -2043,43 +2047,47 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         }
 
         if (group != null) {
-            final Transaction txn = Transaction.currentTxn();
-            txn.start();
             UserVm userVm = _vmDao.acquireInLockTable(userVmId);
             if (userVm == null) {
                 s_logger.warn("Failed to acquire lock on user vm id="
                         + userVmId);
             }
             try {
-                // don't let the group be deleted when we are assigning vm to
-                // it.
-                InstanceGroupVO ngrpLock = _vmGroupDao.lockRow(group.getId(),
-                        false);
-                if (ngrpLock == null) {
-                    s_logger.warn("Failed to acquire lock on vm group id="
-                            + group.getId() + " name=" + group.getName());
-                    txn.rollback();
-                    return false;
-                }
+                final InstanceGroupVO groupFinal = group;
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        // don't let the group be deleted when we are assigning vm to
+                        // it.
+                        InstanceGroupVO ngrpLock = _vmGroupDao.lockRow(groupFinal.getId(),
+                                false);
+                        if (ngrpLock == null) {
+                            s_logger.warn("Failed to acquire lock on vm group id="
+                                    + groupFinal.getId() + " name=" + groupFinal.getName());
+                            throw new CloudRuntimeException("Failed to acquire lock on vm group id="
+                                    + groupFinal.getId() + " name=" + groupFinal.getName());
+                        }
+        
+                        // Currently don't allow to assign a vm to more than one group
+                        if (_groupVMMapDao.listByInstanceId(userVmId) != null) {
+                            // Delete all mappings from group_vm_map table
+                            List<InstanceGroupVMMapVO> groupVmMaps = _groupVMMapDao
+                                    .listByInstanceId(userVmId);
+                            for (InstanceGroupVMMapVO groupMap : groupVmMaps) {
+                                SearchCriteria<InstanceGroupVMMapVO> sc = _groupVMMapDao
+                                        .createSearchCriteria();
+                                sc.addAnd("instanceId", SearchCriteria.Op.EQ,
+                                        groupMap.getInstanceId());
+                                _groupVMMapDao.expunge(sc);
+                            }
+                        }
+                        InstanceGroupVMMapVO groupVmMapVO = new InstanceGroupVMMapVO(
+                                groupFinal.getId(), userVmId);
+                        _groupVMMapDao.persist(groupVmMapVO);
 
-                // Currently don't allow to assign a vm to more than one group
-                if (_groupVMMapDao.listByInstanceId(userVmId) != null) {
-                    // Delete all mappings from group_vm_map table
-                    List<InstanceGroupVMMapVO> groupVmMaps = _groupVMMapDao
-                            .listByInstanceId(userVmId);
-                    for (InstanceGroupVMMapVO groupMap : groupVmMaps) {
-                        SearchCriteria<InstanceGroupVMMapVO> sc = _groupVMMapDao
-                                .createSearchCriteria();
-                        sc.addAnd("instanceId", SearchCriteria.Op.EQ,
-                                groupMap.getInstanceId());
-                        _groupVMMapDao.expunge(sc);
                     }
-                }
-                InstanceGroupVMMapVO groupVmMapVO = new InstanceGroupVMMapVO(
-                        group.getId(), userVmId);
-                _groupVMMapDao.persist(groupVmMapVO);
+                });
 
-                txn.commit();
                 return true;
             } finally {
                 if (userVm != null) {
@@ -2744,98 +2752,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             hypervisorType = template.getHypervisorType();
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        UserVmVO vm = new UserVmVO(id, instanceName, displayName,
-                template.getId(), hypervisorType, template.getGuestOSId(),
-                offering.getOfferHA(), offering.getLimitCpuUse(),
-                owner.getDomainId(), owner.getId(), offering.getId(), userData,
-                hostName, diskOfferingId);
-        vm.setUuid(uuidName);
-        vm.setDynamicallyScalable(template.isDynamicallyScalable());
-        if (sshPublicKey != null) {
-            vm.setDetail("SSH.PublicKey", sshPublicKey);
-        }
-
-        if (keyboard != null && !keyboard.isEmpty())
-            vm.setDetail(VmDetailConstants.KEYBOARD, keyboard);
-
-        if (isIso) {
-            vm.setIsoId(template.getId());
-        }
-
-        if(isDisplayVmEnabled != null){
-            if(!_accountMgr.isRootAdmin(caller.getType())){
-                throw new PermissionDeniedException( "Cannot update parameter displayvm, only admin permitted ");
-            }
-            vm.setDisplayVm(isDisplayVmEnabled);
-        }else {
-            vm.setDisplayVm(true);
-        }
-
-        // If hypervisor is vSphere, check for clone type setting.
-        if (hypervisorType.equals(HypervisorType.VMware)) {
-            // retrieve clone flag.
-            UserVmCloneType cloneType = UserVmCloneType.linked;
-            String value = _configDao.getValue(Config.VmwareCreateFullClone.key());
-            if (value != null) {
-                if (Boolean.parseBoolean(value) == true)
-                    cloneType = UserVmCloneType.full;
-            }
-            UserVmCloneSettingVO vmCloneSettingVO = new UserVmCloneSettingVO(id, cloneType.toString());
-            _vmCloneSettingDao.persist(vmCloneSettingVO);
-        }
-
-        long guestOSId = template.getGuestOSId();
-        GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
-        long guestOSCategoryId = guestOS.getCategoryId();
-        GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
-
-
-        // If hypervisor is vSphere and OS is OS X, set special settings.
-        if (hypervisorType.equals(HypervisorType.VMware)) {
-            if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")){
-                vm.setDetail("smc.present", "TRUE");
-                vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
-                vm.setDetail("firmware", "efi");
-                s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi");
-            }
-       }
-
-        _vmDao.persist(vm);
-        _vmDao.saveDetails(vm);
-
-        s_logger.debug("Allocating in the DB for vm");
-        DataCenterDeployment plan = new DataCenterDeployment(zone.getId());
-
-        List<String> computeTags = new ArrayList<String>();
-        computeTags.add(offering.getHostTag());
-
-        List<String> rootDiskTags =	new ArrayList<String>();
-        rootDiskTags.add(offering.getTags());
-
-        if(isIso){
-            VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachineFromScratch(vm.getUuid(), Long.toString(owner.getAccountId()), vm.getIsoId().toString(), hostName, displayName, hypervisor.name(), guestOSCategory.getName(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize,  computeTags, rootDiskTags, networkNicMap, plan);
-        }else {
-            VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachine(vm.getUuid(), Long.toString(owner.getAccountId()), Long.toString(template.getId()), hostName, displayName, hypervisor.name(), offering.getCpu(),  offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan);
-        }
-
-
-
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Successfully allocated DB entry for " + vm);
-        }
-        CallContext.current().setEventDetails("Vm Id: " + vm.getId());
-
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, zone.getId(), vm.getId(),
-                vm.getHostName(), offering.getId(), template.getId(), hypervisorType.toString(),
-                VirtualMachine.class.getName(), vm.getUuid());
-
-        //Update Resource Count for the given account
-        resourceCountIncrement(accountId, new Long(offering.getCpu()),
-                new Long(offering.getRamSize()));
-
-        txn.commit();
+        UserVmVO vm = commitUserVm(zone, template, hostName, displayName, owner, diskOfferingId, diskSize, userData,
+                hypervisor, caller, isDisplayVmEnabled, keyboard, accountId, offering, isIso, sshPublicKey,
+                networkNicMap, id, instanceName, uuidName, hypervisorType);
 
         // Assign instance to the group
         try {
@@ -2860,6 +2779,108 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         return vm;
     }
 
+    private UserVmVO commitUserVm(final DataCenter zone, final VirtualMachineTemplate template, final String hostName,
+            final String displayName, final Account owner, final Long diskOfferingId, final Long diskSize, final String userData,
+            final HypervisorType hypervisor, final Account caller, final Boolean isDisplayVmEnabled, final String keyboard, final long accountId,
+            final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey,
+            final LinkedHashMap<String, NicProfile> networkNicMap, final long id, final String instanceName, final String uuidName,
+            final HypervisorType hypervisorType) throws InsufficientCapacityException {
+        return Transaction.executeWithException(new TransactionCallbackWithException<UserVmVO>() {
+            @Override
+            public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+                UserVmVO vm = new UserVmVO(id, instanceName, displayName,
+                        template.getId(), hypervisorType, template.getGuestOSId(),
+                        offering.getOfferHA(), offering.getLimitCpuUse(),
+                        owner.getDomainId(), owner.getId(), offering.getId(), userData,
+                        hostName, diskOfferingId);
+                vm.setUuid(uuidName);
+                vm.setDynamicallyScalable(template.isDynamicallyScalable());
+                if (sshPublicKey != null) {
+                    vm.setDetail("SSH.PublicKey", sshPublicKey);
+                }
+        
+                if (keyboard != null && !keyboard.isEmpty())
+                    vm.setDetail(VmDetailConstants.KEYBOARD, keyboard);
+        
+                if (isIso) {
+                    vm.setIsoId(template.getId());
+                }
+        
+                if(isDisplayVmEnabled != null){
+                    if(!_accountMgr.isRootAdmin(caller.getType())){
+                        throw new PermissionDeniedException( "Cannot update parameter displayvm, only admin permitted ");
+                    }
+                    vm.setDisplayVm(isDisplayVmEnabled);
+                }else {
+                    vm.setDisplayVm(true);
+                }
+        
+                // If hypervisor is vSphere, check for clone type setting.
+                if (hypervisorType.equals(HypervisorType.VMware)) {
+                    // retrieve clone flag.
+                    UserVmCloneType cloneType = UserVmCloneType.linked;
+                    String value = _configDao.getValue(Config.VmwareCreateFullClone.key());
+                    if (value != null) {
+                        if (Boolean.parseBoolean(value) == true)
+                            cloneType = UserVmCloneType.full;
+                    }
+                    UserVmCloneSettingVO vmCloneSettingVO = new UserVmCloneSettingVO(id, cloneType.toString());
+                    _vmCloneSettingDao.persist(vmCloneSettingVO);
+                }
+        
+                long guestOSId = template.getGuestOSId();
+                GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
+                long guestOSCategoryId = guestOS.getCategoryId();
+                GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
+        
+        
+                // If hypervisor is vSphere and OS is OS X, set special settings.
+                if (hypervisorType.equals(HypervisorType.VMware)) {
+                    if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")){
+                        vm.setDetail("smc.present", "TRUE");
+                        vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
+                        vm.setDetail("firmware", "efi");
+                        s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi");
+                    }
+               }
+        
+                _vmDao.persist(vm);
+                _vmDao.saveDetails(vm);
+        
+                s_logger.debug("Allocating in the DB for vm");
+                DataCenterDeployment plan = new DataCenterDeployment(zone.getId());
+        
+                List<String> computeTags = new ArrayList<String>();
+                computeTags.add(offering.getHostTag());
+        
+                List<String> rootDiskTags =	new ArrayList<String>();
+                rootDiskTags.add(offering.getTags());
+        
+                if(isIso){
+                    VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachineFromScratch(vm.getUuid(), Long.toString(owner.getAccountId()), vm.getIsoId().toString(), hostName, displayName, hypervisor.name(), guestOSCategory.getName(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize,  computeTags, rootDiskTags, networkNicMap, plan);
+                }else {
+                    VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachine(vm.getUuid(), Long.toString(owner.getAccountId()), Long.toString(template.getId()), hostName, displayName, hypervisor.name(), offering.getCpu(),  offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan);
+                }
+        
+        
+        
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Successfully allocated DB entry for " + vm);
+                }
+                CallContext.current().setEventDetails("Vm Id: " + vm.getId());
+        
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, zone.getId(), vm.getId(),
+                        vm.getHostName(), offering.getId(), template.getId(), hypervisorType.toString(),
+                        VirtualMachine.class.getName(), vm.getUuid());
+        
+                //Update Resource Count for the given account
+                resourceCountIncrement(accountId, new Long(offering.getCpu()),
+                        new Long(offering.getRamSize()));
+                return vm;
+            }
+        }, InsufficientCapacityException.class);
+    }
+
     private void validateUserData(String userData, HTTPMethod httpmethod) {
         byte[] decodedUserData = null;
         if (userData != null) {
@@ -3417,7 +3438,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     }
 
     @Override
-    public void collectVmDiskStatistics (UserVmVO userVm) {
+    public void collectVmDiskStatistics (final UserVmVO userVm) {
         // support KVM only util 2013.06.25
         if (!userVm.getHypervisorType().equals(HypervisorType.KVM))
             return;
@@ -3425,7 +3446,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     	long hostId = userVm.getHostId();
     	List<String> vmNames = new ArrayList<String>();
     	vmNames.add(userVm.getInstanceName());
-    	HostVO host = _hostDao.findById(hostId);
+    	final HostVO host = _hostDao.findById(hostId);
 
     	GetVmDiskStatsAnswer diskStatsAnswer = null;
     	try {
@@ -3439,98 +3460,98 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
                 s_logger.warn("Error while collecting disk stats vm: " + userVm.getHostName() + " from host: " + host.getName() + "; details: " + diskStatsAnswer.getDetails());
                 return;
             }
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
             try {
-                txn.start();
-                HashMap<String, List<VmDiskStatsEntry>> vmDiskStatsByName = diskStatsAnswer.getVmDiskStatsMap();
-                if (vmDiskStatsByName == null)
-                    return;
-                List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsByName.get(userVm.getInstanceName());
-                if (vmDiskStats == null)
-		    return;
-
-	        for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
-                    SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
-                    sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
-                    VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
-	            VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
-	            VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
-
-	                if ((vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0) && (vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)) {
-	                    s_logger.debug("Read/Write of IO and Bytes are both 0. Not updating vm_disk_statistics");
-	                    continue;
-	                }
-
-	                if (vmDiskStat_lock == null) {
-	                    s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
-	                    continue;
-	                }
-
-	                if (previousVmDiskStats != null
-	                        && ((previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
-	                        || ((previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite())
-	                        || (previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
-	    	                || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())))) {
-	                    s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
-	                            "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-	                            " IO Read: " + vmDiskStat.getIORead() + " IO Write: " + vmDiskStat.getIOWrite() +
-	                            " Bytes Read: " + vmDiskStat.getBytesRead() + " Bytes Write: " + vmDiskStat.getBytesWrite());
-	                    continue;
-	                }
-
-	                if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
-	                    if (s_logger.isDebugEnabled()) {
-	                        s_logger.debug("Read # of IO that's less than the last one.  " +
-	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-	                                " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
-	                    }
-	                    vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
-	                }
-	                vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
-	                if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
-	                    if (s_logger.isDebugEnabled()) {
-	                        s_logger.debug("Write # of IO that's less than the last one.  " +
-	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-	                                " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
-	                    }
-	                    vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
-	                }
-	                vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
-	                if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
-	                    if (s_logger.isDebugEnabled()) {
-	                        s_logger.debug("Read # of Bytes that's less than the last one.  " +
-	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-	                                " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
-	                    }
-	                    vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
-	                }
-	                vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
-	                if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
-	                    if (s_logger.isDebugEnabled()) {
-	                        s_logger.debug("Write # of Bytes that's less than the last one.  " +
-	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-	                                " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
-	                    }
-	                    vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
-	                }
-	                vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
-
-	                if (! _dailyOrHourly) {
-	                    //update agg bytes
-	                	vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
-	                	vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
-	                	vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
-	                	vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
-	                }
-
-	                _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
-	        	}
-	        	txn.commit();
+                final GetVmDiskStatsAnswer diskStatsAnswerFinal = diskStatsAnswer;
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        HashMap<String, List<VmDiskStatsEntry>> vmDiskStatsByName = diskStatsAnswerFinal.getVmDiskStatsMap();
+                        if (vmDiskStatsByName == null)
+                            return;
+                        List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsByName.get(userVm.getInstanceName());
+                        if (vmDiskStats == null)
+                            return;
+        
+            	        for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
+                                SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
+                                sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
+                                VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
+            	            VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
+            	            VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
+        
+        	                if ((vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0) && (vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)) {
+        	                    s_logger.debug("Read/Write of IO and Bytes are both 0. Not updating vm_disk_statistics");
+        	                    continue;
+        	                }
+        
+        	                if (vmDiskStat_lock == null) {
+        	                    s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
+        	                    continue;
+        	                }
+        
+        	                if (previousVmDiskStats != null
+        	                        && ((previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
+        	                        || ((previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite())
+        	                        || (previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
+        	    	                || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())))) {
+        	                    s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
+        	                            "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+        	                            " IO Read: " + vmDiskStat.getIORead() + " IO Write: " + vmDiskStat.getIOWrite() +
+        	                            " Bytes Read: " + vmDiskStat.getBytesRead() + " Bytes Write: " + vmDiskStat.getBytesWrite());
+        	                    continue;
+        	                }
+        
+        	                if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
+        	                    if (s_logger.isDebugEnabled()) {
+        	                        s_logger.debug("Read # of IO that's less than the last one.  " +
+        	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+        	                                " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+        	                    }
+        	                    vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+        	                }
+        	                vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
+        	                if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
+        	                    if (s_logger.isDebugEnabled()) {
+        	                        s_logger.debug("Write # of IO that's less than the last one.  " +
+        	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+        	                                " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
+        	                    }
+        	                    vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+        	                }
+        	                vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
+        	                if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
+        	                    if (s_logger.isDebugEnabled()) {
+        	                        s_logger.debug("Read # of Bytes that's less than the last one.  " +
+        	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+        	                                " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
+        	                    }
+        	                    vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+        	                }
+        	                vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
+        	                if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
+        	                    if (s_logger.isDebugEnabled()) {
+        	                        s_logger.debug("Write # of Bytes that's less than the last one.  " +
+        	                                "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+        	                                " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
+        	                    }
+        	                    vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+        	                }
+        	                vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
+        
+        	                if (! _dailyOrHourly) {
+        	                    //update agg bytes
+        	                	vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+        	                	vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+        	                	vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+        	                	vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+        	                }
+        
+        	                _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
+        	        	}
+                    }
+                });
             } catch (Exception e) {
-                txn.rollback();
                 s_logger.warn("Unable to update vm disk statistics for vm: " + userVm.getId() + " from host: " + hostId, e);
-            } finally {
-                txn.close();
             }
         }
     }
@@ -4271,7 +4292,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     @DB
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_MOVE, eventDescription = "move VM to another user", async = false)
-    public UserVm moveVMToUser(AssignVMCmd cmd)
+    public UserVm moveVMToUser(final AssignVMCmd cmd)
             throws ResourceAllocationException, ConcurrentOperationException,
             ResourceUnavailableException, InsufficientCapacityException {
         // VERIFICATIONS and VALIDATIONS
@@ -4291,7 +4312,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         }
 
         // get and check the valid VM
-        UserVmVO vm = _vmDao.findById(cmd.getVmId());
+        final UserVmVO vm = _vmDao.findById(cmd.getVmId());
         if (vm == null) {
             throw new InvalidParameterValueException(
                     "There is no vm by that id " + cmd.getVmId());
@@ -4306,7 +4327,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             throw ex;
         }
 
-        Account oldAccount = _accountService.getActiveAccountById(vm
+        final Account oldAccount = _accountService.getActiveAccountById(vm
                 .getAccountId());
         if (oldAccount == null) {
             throw new InvalidParameterValueException("Invalid account for VM "
@@ -4319,7 +4340,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             ex.addProxyObject(vm.getUuid(), "vmId");
             throw ex;
         }
-        Account newAccount = _accountService.getActiveAccountByName(
+        final Account newAccount = _accountService.getActiveAccountByName(
                 cmd.getAccountName(), cmd.getDomainId());
         if (newAccount == null
                 || newAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) {
@@ -4376,8 +4397,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         DataCenterVO zone = _dcDao.findById(vm.getDataCenterId());
 
         // Get serviceOffering and Volumes for Virtual Machine
-        ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId());
-        List<VolumeVO> volumes = _volsDao.findByInstance(cmd.getVmId());
+        final ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId());
+        final List<VolumeVO> volumes = _volsDao.findByInstance(cmd.getVmId());
 
         //Remove vm from instance group
         removeInstanceFromInstanceGroup(cmd.getVmId());
@@ -4407,55 +4428,57 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         DomainVO domain = _domainDao.findById(cmd.getDomainId());
         _accountMgr.checkAccess(newAccount, domain);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        //generate destroy vm event for usage
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
-                vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
-                VirtualMachine.class.getName(), vm.getUuid());
-
-        // update resource counts for old account
-        resourceCountDecrement(oldAccount.getAccountId(), new Long(offering.getCpu()),
-                new Long(offering.getRamSize()));
-
-        // OWNERSHIP STEP 1: update the vm owner
-        vm.setAccountId(newAccount.getAccountId());
-        vm.setDomainId(cmd.getDomainId());
-        _vmDao.persist(vm);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                //generate destroy vm event for usage
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
+                        vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
+                        VirtualMachine.class.getName(), vm.getUuid());
+        
+                // update resource counts for old account
+                resourceCountDecrement(oldAccount.getAccountId(), new Long(offering.getCpu()),
+                        new Long(offering.getRamSize()));
+        
+                // OWNERSHIP STEP 1: update the vm owner
+                vm.setAccountId(newAccount.getAccountId());
+                vm.setDomainId(cmd.getDomainId());
+                _vmDao.persist(vm);
+        
+                // OS 2: update volume
+                for (VolumeVO volume : volumes) {
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(),
+                            volume.getDataCenterId(), volume.getId(), volume.getName(), Volume.class.getName(), volume.getUuid());
+                    _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.volume);
+                    _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.primary_storage,
+                            new Long(volume.getSize()));
+                    volume.setAccountId(newAccount.getAccountId());
+                    volume.setDomainId(newAccount.getDomainId());
+                    _volsDao.persist(volume);
+                    _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.volume);
+                    _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.primary_storage,
+                            new Long(volume.getSize()));
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
+                            volume.getDataCenterId(), volume.getId(), volume.getName(),
+                            volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(),
+                            volume.getUuid());
+                    //snapshots: mark these removed in db
+                    List<SnapshotVO> snapshots = _snapshotDao.listByVolumeIdIncludingRemoved(volume.getId());
+                    for (SnapshotVO snapshot: snapshots){
+                        _snapshotDao.remove(snapshot.getId());
+                    }
+                }
+        
+                //update resource count of new account
+                resourceCountIncrement(newAccount.getAccountId(), new Long(offering.getCpu()), new Long(offering.getRamSize()));
+        
+                //generate usage events to account for this change
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
+                        vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
+                        VirtualMachine.class.getName(), vm.getUuid());
+            }
+        });
 
-        // OS 2: update volume
-        for (VolumeVO volume : volumes) {
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(),
-                    volume.getDataCenterId(), volume.getId(), volume.getName(), Volume.class.getName(), volume.getUuid());
-            _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.volume);
-            _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.primary_storage,
-                    new Long(volume.getSize()));
-            volume.setAccountId(newAccount.getAccountId());
-            volume.setDomainId(newAccount.getDomainId());
-            _volsDao.persist(volume);
-            _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.volume);
-            _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.primary_storage,
-                    new Long(volume.getSize()));
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
-                    volume.getDataCenterId(), volume.getId(), volume.getName(),
-                    volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(),
-                    volume.getUuid());
-            //snapshots: mark these removed in db
-            List<SnapshotVO> snapshots = _snapshotDao.listByVolumeIdIncludingRemoved(volume.getId());
-            for (SnapshotVO snapshot: snapshots){
-                _snapshotDao.remove(snapshot.getId());
-            }
-        }
-
-        //update resource count of new account
-        resourceCountIncrement(newAccount.getAccountId(), new Long(offering.getCpu()), new Long(offering.getRamSize()));
-
-        //generate usage events to account for this change
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
-                vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
-                VirtualMachine.class.getName(), vm.getUuid());
-
-        txn.commit();
 
         VirtualMachine vmoi = _itMgr.findById(vm.getId());
         VirtualMachineProfileImpl vmOldProfile = new VirtualMachineProfileImpl(vmoi);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index aa772fe..18f17b8 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -29,7 +29,6 @@ import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -90,6 +89,10 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
@@ -482,31 +485,32 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
     }
     
     @DB
-    protected void processAnswer(VMSnapshotVO vmSnapshot, UserVmVO  userVm, Answer as, Long hostId) {
-        final Transaction txn = Transaction.currentTxn();
+    protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVmVO  userVm, final Answer as, Long hostId) {
         try {
-            txn.start();
-            if (as instanceof CreateVMSnapshotAnswer) {
-                CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
-                finalizeCreate(vmSnapshot, answer.getVolumeTOs());
-                vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
-            } else if (as instanceof RevertToVMSnapshotAnswer) {
-                RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
-                finalizeRevert(vmSnapshot, answer.getVolumeTOs());
-                vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
-            } else if (as instanceof DeleteVMSnapshotAnswer) {
-                DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
-                finalizeDelete(vmSnapshot, answer.getVolumeTOs());
-                _vmSnapshotDao.remove(vmSnapshot.getId());
-            }
-            txn.commit();
+            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                @Override
+                public Object doInTransaction(TransactionStatus status) throws NoTransitionException {
+                    if (as instanceof CreateVMSnapshotAnswer) {
+                        CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
+                        finalizeCreate(vmSnapshot, answer.getVolumeTOs());
+                        vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+                    } else if (as instanceof RevertToVMSnapshotAnswer) {
+                        RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
+                        finalizeRevert(vmSnapshot, answer.getVolumeTOs());
+                        vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+                    } else if (as instanceof DeleteVMSnapshotAnswer) {
+                        DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
+                        finalizeDelete(vmSnapshot, answer.getVolumeTOs());
+                        _vmSnapshotDao.remove(vmSnapshot.getId());
+                    }
+                    
+                    return null;
+                }
+            }, NoTransitionException.class);
         } catch (Exception e) {
             String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage();
             s_logger.error(errMsg, e);
-            txn.rollback();
             throw new CloudRuntimeException(errMsg);
-        } finally {
-            txn.close();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
index 8f2caad..b7b51c9 100644
--- a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
+++ b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
@@ -34,12 +34,16 @@ import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.context.CallContext;
-
 import org.apache.log4j.Logger;
 import org.springframework.context.annotation.Primary;
 
 
 
+
+
+
+
+
 import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;
@@ -65,6 +69,9 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.vm.UserVmVO;
@@ -142,8 +149,8 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
 
     @DB
     @Override
-    public AffinityGroup createAffinityGroupInternal(String account, Long domainId, String affinityGroupName,
-            String affinityGroupType, String description) {
+    public AffinityGroup createAffinityGroupInternal(String account, final Long domainId, final String affinityGroupName,
+            final String affinityGroupType, final String description) {
 
         Account caller = CallContext.current().getCallingAccount();
 
@@ -159,7 +166,7 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
                     "Unable to create affinity group, no Affinity Group Types configured");
         }
 
-        AffinityGroupProcessor processor = typeProcessorMap.get(affinityGroupType);
+        final AffinityGroupProcessor processor = typeProcessorMap.get(affinityGroupType);
 
         if (processor.isAdminControlledGroup() && !_accountMgr.isRootAdmin(caller.getType())) {
             throw new PermissionDeniedException("Cannot create the affinity group");
@@ -210,21 +217,26 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
                     + affinityGroupName + " already exisits under the domain.");
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        AffinityGroupVO group = new AffinityGroupVO(affinityGroupName, affinityGroupType, description, owner.getDomainId(),
-                owner.getId(), aclType);
-        _affinityGroupDao.persist(group);
-
-        if (domainId != null && aclType == ACLType.Domain) {
-            boolean subDomainAccess = false;
-            subDomainAccess = processor.subDomainAccess();
-            AffinityGroupDomainMapVO domainMap = new AffinityGroupDomainMapVO(group.getId(), domainId, subDomainAccess);
-            _affinityGroupDomainMapDao.persist(domainMap);
-        }
+        final Account ownerFinal = owner;
+        final ControlledEntity.ACLType aclTypeFinal = aclType;
+        AffinityGroupVO group = Transaction.execute(new TransactionCallback<AffinityGroupVO>() {
+            @Override
+            public AffinityGroupVO doInTransaction(TransactionStatus status) {
+                AffinityGroupVO group = new AffinityGroupVO(affinityGroupName, affinityGroupType, description, ownerFinal.getDomainId(),
+                        ownerFinal.getId(), aclTypeFinal);
+                _affinityGroupDao.persist(group);
+
+                if (domainId != null && aclTypeFinal == ACLType.Domain) {
+                    boolean subDomainAccess = false;
+                    subDomainAccess = processor.subDomainAccess();
+                    AffinityGroupDomainMapVO domainMap = new AffinityGroupDomainMapVO(group.getId(), domainId, subDomainAccess);
+                    _affinityGroupDomainMapDao.persist(domainMap);
+                }
 
-        txn.commit();
+                return group;
+            }
+        });
+        
 
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Created affinity group =" + affinityGroupName);
@@ -265,35 +277,38 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
         // check permissions
         _accountMgr.checkAccess(caller, AccessType.ModifyEntry, true, group);
 
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        group = _affinityGroupDao.lockRow(affinityGroupId, true);
-        if (group == null) {
-            throw new InvalidParameterValueException("Unable to find affinity group by id " + affinityGroupId);
-        }
-
-        List<AffinityGroupVMMapVO> affinityGroupVmMap = _affinityGroupVMMapDao.listByAffinityGroup(affinityGroupId);
-        if (!affinityGroupVmMap.isEmpty()) {
-            SearchBuilder<AffinityGroupVMMapVO> listByAffinityGroup = _affinityGroupVMMapDao.createSearchBuilder();
-            listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
-                    SearchCriteria.Op.EQ);
-            listByAffinityGroup.done();
-            SearchCriteria<AffinityGroupVMMapVO> sc = listByAffinityGroup.create();
-            sc.setParameters("affinityGroupId", affinityGroupId);
-
-            _affinityGroupVMMapDao.lockRows(sc, null, true);
-            _affinityGroupVMMapDao.remove(sc);
-        }
+        final Long affinityGroupIdFinal = affinityGroupId;
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
 
-        // call processor to handle the group delete
-        AffinityGroupProcessor processor = getAffinityGroupProcessorForType(group.getType());
-        if (processor != null) {
-            processor.handleDeleteGroup(group);
-        }
-
-        _affinityGroupDao.expunge(affinityGroupId);
-        txn.commit();
+                AffinityGroupVO group = _affinityGroupDao.lockRow(affinityGroupIdFinal, true);
+                if (group == null) {
+                    throw new InvalidParameterValueException("Unable to find affinity group by id " + affinityGroupIdFinal);
+                }
+        
+                List<AffinityGroupVMMapVO> affinityGroupVmMap = _affinityGroupVMMapDao.listByAffinityGroup(affinityGroupIdFinal);
+                if (!affinityGroupVmMap.isEmpty()) {
+                    SearchBuilder<AffinityGroupVMMapVO> listByAffinityGroup = _affinityGroupVMMapDao.createSearchBuilder();
+                    listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
+                            SearchCriteria.Op.EQ);
+                    listByAffinityGroup.done();
+                    SearchCriteria<AffinityGroupVMMapVO> sc = listByAffinityGroup.create();
+                    sc.setParameters("affinityGroupId", affinityGroupIdFinal);
+        
+                    _affinityGroupVMMapDao.lockRows(sc, null, true);
+                    _affinityGroupVMMapDao.remove(sc);
+                }
+        
+                // call processor to handle the group delete
+                AffinityGroupProcessor processor = getAffinityGroupProcessorForType(group.getType());
+                if (processor != null) {
+                    processor.handleDeleteGroup(group);
+                }
+        
+                _affinityGroupDao.expunge(affinityGroupIdFinal);
+            }
+        });
 
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Deleted affinity group id=" + affinityGroupId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
index 2385edc..c9db371 100644
--- a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
+++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd;
 import org.apache.cloudstack.context.CallContext;
@@ -72,6 +71,9 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
@@ -156,30 +158,33 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
 
     
     @DB
-    protected ApplicationLoadBalancerRule persistLbRule(ApplicationLoadBalancerRuleVO newRule) throws NetworkRuleConflictException {
-        
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        //1) Persist the rule
-        newRule = _lbDao.persist(newRule);
+    protected ApplicationLoadBalancerRule persistLbRule(final ApplicationLoadBalancerRuleVO newRuleFinal) throws NetworkRuleConflictException {
         boolean success = true;
-
+        ApplicationLoadBalancerRuleVO newRule = null;
         try {
-            //2) Detect conflicts
-            detectLbRulesConflicts(newRule);
-            if (!_firewallDao.setStateToAdd(newRule)) {
-                throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
-            }
-            s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + newRule.getSourceIp().addr() + ", source port "
-                    + newRule.getSourcePortStart() + ", instance port " + newRule.getDefaultPortStart() + " is added successfully.");
-            CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
-            Network ntwk = _networkModel.getNetwork(newRule.getNetworkId());
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, newRule.getAccountId(),
-                    ntwk.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
-                    newRule.getUuid());
-            txn.commit();
-
+            newRule = Transaction.executeWithException(new TransactionCallbackWithException<ApplicationLoadBalancerRuleVO>() {
+                @Override
+                public ApplicationLoadBalancerRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                    //1) Persist the rule
+                    ApplicationLoadBalancerRuleVO newRule = _lbDao.persist(newRuleFinal);
+
+                    //2) Detect conflicts
+                    detectLbRulesConflicts(newRule);
+                    if (!_firewallDao.setStateToAdd(newRule)) {
+                        throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+                    }
+                    s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + newRule.getSourceIp().addr() + ", source port "
+                            + newRule.getSourcePortStart() + ", instance port " + newRule.getDefaultPortStart() + " is added successfully.");
+                    CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
+                    Network ntwk = _networkModel.getNetwork(newRule.getNetworkId());
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, newRule.getAccountId(),
+                            ntwk.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
+                            newRule.getUuid());
+                    
+                    return newRule;
+                }
+            }, NetworkRuleConflictException.class);
+            
             return newRule;
         } catch (Exception e) {
             success = false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
index 25a40ee..62b9748 100644
--- a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
+++ b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
@@ -37,6 +37,9 @@ import com.cloud.user.AccountManager;
 import com.cloud.utils.Pair;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 
@@ -46,7 +49,6 @@ import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.region.Region;
 import org.apache.cloudstack.region.dao.RegionDao;
-
 import org.apache.log4j.Logger;
 
 import javax.ejb.Local;
@@ -94,15 +96,15 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             "balancer rule", create = true)
     public GlobalLoadBalancerRule createGlobalLoadBalancerRule(CreateGlobalLoadBalancerRuleCmd newRule) {
 
-        Integer regionId = newRule.getRegionId();
-        String algorithm = newRule.getAlgorithm();
-        String stickyMethod = newRule.getStickyMethod();
-        String name = newRule.getName();
-        String description = newRule.getDescription();
-        String domainName = newRule.getServiceDomainName();
-        String serviceType = newRule.getServiceType();
+        final Integer regionId = newRule.getRegionId();
+        final String algorithm = newRule.getAlgorithm();
+        final String stickyMethod = newRule.getStickyMethod();
+        final String name = newRule.getName();
+        final String description = newRule.getDescription();
+        final String domainName = newRule.getServiceDomainName();
+        final String serviceType = newRule.getServiceType();
 
-        Account gslbOwner = _accountMgr.getAccount(newRule.getEntityOwnerId());
+        final Account gslbOwner = _accountMgr.getAccount(newRule.getEntityOwnerId());
 
         if (!GlobalLoadBalancerRule.Algorithm.isValidAlgorithm(algorithm)) {
             throw new InvalidParameterValueException("Invalid Algorithm: " + algorithm);
@@ -135,18 +137,21 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             throw new CloudRuntimeException("GSLB service is not enabled in region : " + region.getName());
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        GlobalLoadBalancerRuleVO newGslbRule = new GlobalLoadBalancerRuleVO(name, description, domainName, algorithm,
-                stickyMethod, serviceType, regionId, gslbOwner.getId(), gslbOwner.getDomainId(),
-                GlobalLoadBalancerRule.State.Staged);
-        _gslbRuleDao.persist(newGslbRule);
+        GlobalLoadBalancerRuleVO newGslbRule = Transaction.execute(new TransactionCallback<GlobalLoadBalancerRuleVO>() {
+            @Override
+            public GlobalLoadBalancerRuleVO doInTransaction(TransactionStatus status) {
+                GlobalLoadBalancerRuleVO newGslbRule = new GlobalLoadBalancerRuleVO(name, description, domainName, algorithm,
+                        stickyMethod, serviceType, regionId, gslbOwner.getId(), gslbOwner.getDomainId(),
+                        GlobalLoadBalancerRule.State.Staged);
+                _gslbRuleDao.persist(newGslbRule);
 
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_CREATE, newGslbRule.getAccountId(),
-                0, newGslbRule.getId(), name, GlobalLoadBalancerRule.class.getName(),
-                newGslbRule.getUuid());
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_CREATE, newGslbRule.getAccountId(),
+                        0, newGslbRule.getId(), name, GlobalLoadBalancerRule.class.getName(),
+                        newGslbRule.getUuid());
 
-        txn.commit();
+                return newGslbRule;
+            }
+        });
 
         s_logger.debug("successfully created new global load balancer rule for the account " + gslbOwner.getId());
 
@@ -162,8 +167,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
         CallContext ctx = CallContext.current();
         Account caller = ctx.getCallingAccount();
 
-        long gslbRuleId =  assignToGslbCmd.getGlobalLoadBalancerRuleId();
-        GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+        final long gslbRuleId =  assignToGslbCmd.getGlobalLoadBalancerRuleId();
+        final GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
         if (gslbRule == null) {
             throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
         }
@@ -175,7 +180,7 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
                     + " is in revoked state");
         }
 
-        List<Long> newLbRuleIds = assignToGslbCmd.getLoadBalancerRulesIds();
+        final List<Long> newLbRuleIds = assignToGslbCmd.getLoadBalancerRulesIds();
         if (newLbRuleIds == null || newLbRuleIds.isEmpty()) {
             throw new InvalidParameterValueException("empty list of load balancer rule Ids specified to be assigned"
             + " global load balancer rule");
@@ -244,30 +249,31 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             }
         }
 
-        Map<Long, Long> lbRuleWeightMap = assignToGslbCmd.getLoadBalancerRuleWeightMap();
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        // persist the mapping for the new Lb rule that needs to assigned to a gslb rule
-        for (Long lbRuleId : newLbRuleIds) {
-            GlobalLoadBalancerLbRuleMapVO newGslbLbMap = new GlobalLoadBalancerLbRuleMapVO();
-            newGslbLbMap.setGslbLoadBalancerId(gslbRuleId);
-            newGslbLbMap.setLoadBalancerId(lbRuleId);
-            if (lbRuleWeightMap != null && lbRuleWeightMap.get(lbRuleId) != null) {
-                newGslbLbMap.setWeight(lbRuleWeightMap.get(lbRuleId));
+        final Map<Long, Long> lbRuleWeightMap = assignToGslbCmd.getLoadBalancerRuleWeightMap();
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                // persist the mapping for the new Lb rule that needs to assigned to a gslb rule
+                for (Long lbRuleId : newLbRuleIds) {
+                    GlobalLoadBalancerLbRuleMapVO newGslbLbMap = new GlobalLoadBalancerLbRuleMapVO();
+                    newGslbLbMap.setGslbLoadBalancerId(gslbRuleId);
+                    newGslbLbMap.setLoadBalancerId(lbRuleId);
+                    if (lbRuleWeightMap != null && lbRuleWeightMap.get(lbRuleId) != null) {
+                        newGslbLbMap.setWeight(lbRuleWeightMap.get(lbRuleId));
+                    }
+                    _gslbLbMapDao.persist(newGslbLbMap);
+                }
+        
+                // mark the gslb rule state as add
+                if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged || gslbRule.getState() ==
+                        GlobalLoadBalancerRule.State.Active ) {
+                    gslbRule.setState(GlobalLoadBalancerRule.State.Add);
+                    _gslbRuleDao.update(gslbRule.getId(), gslbRule);
+                }
             }
-            _gslbLbMapDao.persist(newGslbLbMap);
-        }
-
-        // mark the gslb rule state as add
-        if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged || gslbRule.getState() ==
-                GlobalLoadBalancerRule.State.Active ) {
-            gslbRule.setState(GlobalLoadBalancerRule.State.Add);
-            _gslbRuleDao.update(gslbRule.getId(), gslbRule);
-        }
+        });
 
-        txn.commit();
 
         boolean success = false;
         try {
@@ -304,8 +310,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
         CallContext ctx = CallContext.current();
         Account caller = ctx.getCallingAccount();
 
-        long gslbRuleId =  removeFromGslbCmd.getGlobalLoadBalancerRuleId();
-        GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+        final long gslbRuleId =  removeFromGslbCmd.getGlobalLoadBalancerRuleId();
+        final GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
         if (gslbRule == null) {
             throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
         }
@@ -316,7 +322,7 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             throw new InvalidParameterValueException("global load balancer rule id: " + gslbRuleId + " is already in revoked state");
         }
 
-        List<Long> lbRuleIdsToremove = removeFromGslbCmd.getLoadBalancerRulesIds();
+        final List<Long> lbRuleIdsToremove = removeFromGslbCmd.getLoadBalancerRulesIds();
         if (lbRuleIdsToremove == null || lbRuleIdsToremove.isEmpty()) {
             throw new InvalidParameterValueException("empty list of load balancer rule Ids specified to be un-assigned"
                     + " to global load balancer rule");
@@ -356,23 +362,24 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        // update the mapping of gslb rule to Lb rule, to revoke state
-        for (Long lbRuleId : lbRuleIdsToremove) {
-            GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
-            removeGslbLbMap.setRevoke(true);
-            _gslbLbMapDao.update(removeGslbLbMap.getId(), removeGslbLbMap);
-        }
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                // update the mapping of gslb rule to Lb rule, to revoke state
+                for (Long lbRuleId : lbRuleIdsToremove) {
+                    GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
+                    removeGslbLbMap.setRevoke(true);
+                    _gslbLbMapDao.update(removeGslbLbMap.getId(), removeGslbLbMap);
+                }
 
-        // mark the gslb rule state as add
-        if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged) {
-            gslbRule.setState(GlobalLoadBalancerRule.State.Add);
-            _gslbRuleDao.update(gslbRule.getId(), gslbRule);
-        }
+                // mark the gslb rule state as add
+                if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged) {
+                    gslbRule.setState(GlobalLoadBalancerRule.State.Add);
+                    _gslbRuleDao.update(gslbRule.getId(), gslbRule);
+                }
 
-        txn.commit();
+            }
+        });
 
         boolean success = false;
         try {
@@ -387,19 +394,21 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
                 throw ex;
             }
 
-            txn.start();
-
-            // remove the mappings of gslb rule to Lb rule that are in revoked state
-            for (Long lbRuleId : lbRuleIdsToremove) {
-                GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
-                _gslbLbMapDao.remove(removeGslbLbMap.getId());
-            }
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    // remove the mappings of gslb rule to Lb rule that are in revoked state
+                    for (Long lbRuleId : lbRuleIdsToremove) {
+                        GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
+                        _gslbLbMapDao.remove(removeGslbLbMap.getId());
+                    }
 
-            // on success set state back to Active
-            gslbRule.setState(GlobalLoadBalancerRule.State.Active);
-            _gslbRuleDao.update(gslbRule.getId(), gslbRule);
+                    // on success set state back to Active
+                    gslbRule.setState(GlobalLoadBalancerRule.State.Active);
+                    _gslbRuleDao.update(gslbRule.getId(), gslbRule);
 
-            txn.commit();
+                }
+            });
 
             success = true;
         } catch (ResourceUnavailableException e) {
@@ -429,9 +438,9 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
     }
 
     @DB
-    private void revokeGslbRule(long gslbRuleId, Account caller) {
+    private void revokeGslbRule(final long gslbRuleId, Account caller) {
 
-        GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+        final GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
 
         if (gslbRule == null) {
             throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
@@ -454,19 +463,21 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             _gslbRuleDao.update(gslbRuleId, gslbRule);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        List<GlobalLoadBalancerLbRuleMapVO> gslbLbMapVos = _gslbLbMapDao.listByGslbRuleId(gslbRuleId);
-        if (gslbLbMapVos != null) {
-            //mark all the GSLB-LB mapping to be in revoke state
-            for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
-                gslbLbMap.setRevoke(true);
-                _gslbLbMapDao.update(gslbLbMap.getId(), gslbLbMap);
+        final List<GlobalLoadBalancerLbRuleMapVO> gslbLbMapVos = Transaction.execute(new TransactionCallback<List<GlobalLoadBalancerLbRuleMapVO>>() {
+            @Override
+            public List<GlobalLoadBalancerLbRuleMapVO> doInTransaction(TransactionStatus status) {
+                List<GlobalLoadBalancerLbRuleMapVO> gslbLbMapVos = _gslbLbMapDao.listByGslbRuleId(gslbRuleId);
+                if (gslbLbMapVos != null) {
+                    //mark all the GSLB-LB mapping to be in revoke state
+                    for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
+                        gslbLbMap.setRevoke(true);
+                        _gslbLbMapDao.update(gslbLbMap.getId(), gslbLbMap);
+                    }
+                }
+                
+                return gslbLbMapVos;
             }
-        }
-
-        txn.commit();
+        });
 
         boolean success = false;
         try {
@@ -478,22 +489,25 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             throw new CloudRuntimeException("Failed to update the gloabal load balancer");
         }
 
-        txn.start();
-        //remove all mappings between GSLB rule and load balancer rules
-        if (gslbLbMapVos != null) {
-            for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
-                _gslbLbMapDao.remove(gslbLbMap.getId());
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                //remove all mappings between GSLB rule and load balancer rules
+                if (gslbLbMapVos != null) {
+                    for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
+                        _gslbLbMapDao.remove(gslbLbMap.getId());
+                    }
+                }
+        
+                //remove the GSLB rule itself
+                _gslbRuleDao.remove(gslbRuleId);
+        
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_DELETE, gslbRule.getAccountId(),
+                        0, gslbRule.getId(), gslbRule.getName(), GlobalLoadBalancerRule.class.getName(),
+                        gslbRule.getUuid());
             }
-        }
-
-        //remove the GSLB rule itself
-        _gslbRuleDao.remove(gslbRuleId);
-
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_DELETE, gslbRule.getAccountId(),
-                0, gslbRule.getId(), gslbRule.getName(), GlobalLoadBalancerRule.class.getName(),
-                gslbRule.getUuid());
+        });
 
-        txn.commit();
     }
 
     @Override
@@ -523,8 +537,6 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
             throw new InvalidParameterValueException("Invalid persistence: " + stickyMethod);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
         if (algorithm != null) {
             gslbRule.setAlgorithm(algorithm);
         }
@@ -536,7 +548,6 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
         }
         gslbRule.setState(GlobalLoadBalancerRule.State.Add);
         _gslbRuleDao.update(gslbRule.getId(), gslbRule);
-        txn.commit();
 
         try {
             s_logger.debug("Updating global load balancer with id " + gslbRule.getUuid());


[14/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionLegacy.java b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
new file mode 100755
index 0000000..b191491
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
@@ -0,0 +1,1174 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.utils.db;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.dbcp.ConnectionFactory;
+import org.apache.commons.dbcp.DriverManagerConnectionFactory;
+import org.apache.commons.dbcp.PoolableConnectionFactory;
+import org.apache.commons.dbcp.PoolingDataSource;
+import org.apache.commons.pool.KeyedObjectPoolFactory;
+import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool.impl.StackKeyedObjectPoolFactory;
+import org.apache.log4j.Logger;
+import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
+import org.jasypt.properties.EncryptableProperties;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.PropertiesUtil;
+import com.cloud.utils.crypt.EncryptionSecretKeyChecker;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.mgmt.JmxUtil;
+
+/**
+ * Transaction abstracts away the Connection object in JDBC.  It allows the
+ * following things that the Connection object does not.
+ * 
+ *   1. Transaction can be started at an entry point and whether the DB
+ *      actions should be auto-commit or not determined at that point.
+ *   2. DB Connection is allocated only when it is needed.
+ *   3. Code does not need to know if a transaction has been started or not.
+ *      It just starts/ends a transaction and we resolve it correctly with
+ *      the previous actions.
+ *
+ * Note that this class is not synchronous but it doesn't need to be because
+ * it is stored with TLS and is one per thread.  Use appropriately.
+ */
+public class TransactionLegacy {
+    private static final Logger s_logger = Logger.getLogger(Transaction.class.getName() + "." + "Transaction");
+    private static final Logger s_stmtLogger = Logger.getLogger(Transaction.class.getName() + "." + "Statement");
+    private static final Logger s_lockLogger = Logger.getLogger(Transaction.class.getName() + "." + "Lock");
+    private static final Logger s_connLogger = Logger.getLogger(Transaction.class.getName() + "." + "Connection");
+
+    private static final ThreadLocal<TransactionLegacy> tls = new ThreadLocal<TransactionLegacy>();
+    private static final String START_TXN = "start_txn";
+    private static final String CURRENT_TXN = "current_txn";
+    private static final String CREATE_TXN = "create_txn";
+    private static final String CREATE_CONN = "create_conn";
+    private static final String STATEMENT = "statement";
+    private static final String ATTACHMENT = "attachment";
+
+    public static final short CLOUD_DB = 0;
+    public static final short USAGE_DB = 1;
+    public static final short AWSAPI_DB = 2;
+    public static final short SIMULATOR_DB = 3;
+
+    public static final short CONNECTED_DB = -1;
+
+    private static AtomicLong s_id = new AtomicLong();
+    private static final TransactionMBeanImpl s_mbean = new TransactionMBeanImpl();
+    static {
+        try {
+            JmxUtil.registerMBean("Transaction", "Transaction", s_mbean);
+        } catch (Exception e) {
+            s_logger.error("Unable to register mbean for transaction", e);
+        }
+        
+        /* FIXME: We need a better solution for this
+         * Initialize encryption if we need it for db.properties
+         */ 
+        EncryptionSecretKeyChecker enc = new EncryptionSecretKeyChecker();
+        enc.check();  
+    }
+
+    private final LinkedList<StackElement> _stack;
+    private long _id;
+
+    private final LinkedList<Pair<String, Long>> _lockTimes = new LinkedList<Pair<String, Long>>();
+
+    private String _name;
+    private Connection _conn;
+    private boolean _txn;
+    private short _dbId;
+    private long _txnTime;
+    private Statement _stmt;
+    private String _creator;
+
+    private TransactionLegacy _prev = null;
+
+    public static TransactionLegacy currentTxn() {
+        TransactionLegacy txn = tls.get();
+        assert txn != null : "No Transaction on stack.  Did you mark the method with @DB?";
+
+        assert checkAnnotation(3, txn) : "Did you even read the guide to use Transaction...IOW...other people's code? Try method can't be private.  What about @DB? hmmm... could that be it? " + txn;
+        return txn;
+    }
+
+    public static TransactionLegacy open(final short databaseId) {
+        String name = buildName();
+        if (name == null) {
+            name = CURRENT_TXN;
+        }
+        return open(name, databaseId, true);
+    }
+
+    //
+    // Usage of this transaction setup should be limited, it will always open a new transaction context regardless of whether or not there is other
+    // transaction context in the stack. It is used in special use cases that we want to control DB connection explicitly and in the mean time utilize
+    // the existing DAO features
+    //
+    public void transitToUserManagedConnection(Connection conn) {
+        assert(_conn == null /*&& _stack.size() <= 1*/) : "Can't change to a user managed connection unless the stack is empty and the db connection is null, you may have forgotten to invoke transitToAutoManagedConnection to close out the DB connection: " + toString();
+        _conn = conn;
+        _dbId = CONNECTED_DB;
+    }
+
+    public void transitToAutoManagedConnection(short dbId) {
+        // assert(_stack.size() <= 1) : "Can't change to auto managed connection unless your stack is empty";
+        _dbId = dbId;
+        _conn = null;
+    }
+
+    public static TransactionLegacy open(final String name) {
+        return open(name, TransactionLegacy.CLOUD_DB, false);
+    }
+
+    public static TransactionLegacy open(final String name, final short databaseId, final boolean forceDbChange) {
+        TransactionLegacy txn = tls.get();
+        boolean isNew = false;
+        if (txn == null) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Creating the transaction: " + name);
+            }
+            txn = new TransactionLegacy(name, false, databaseId);
+            tls.set(txn);
+            isNew = true;
+        } else if (forceDbChange) {
+            final short currentDbId = txn.getDatabaseId();
+            if (currentDbId != databaseId) {
+                // we need to end the current transaction and switch databases
+                txn.close(txn.getName());
+
+                txn = new TransactionLegacy(name, false, databaseId);
+                tls.set(txn);
+                isNew = true;
+            }
+        }
+
+        txn.takeOver(name, false);
+        if (isNew) {
+            s_mbean.addTransaction(txn);
+        }
+        return txn;
+    }
+
+    protected StackElement peekInStack(Object obj) {
+        final Iterator<StackElement> it = _stack.iterator();
+        while (it.hasNext()) {
+            StackElement next = it.next();
+            if (next.type == obj) {
+                return next;
+            }
+        }
+        return null;
+    }
+
+    public void registerLock(String sql) {
+        if (_txn && s_lockLogger.isDebugEnabled()) {
+            Pair<String, Long> time = new Pair<String, Long>(sql, System.currentTimeMillis());
+            _lockTimes.add(time);
+        }
+    }
+
+    public boolean dbTxnStarted() {
+        return _txn;
+    }
+
+    public static Connection getStandaloneConnectionWithException() throws SQLException {
+        Connection conn = s_ds.getConnection();
+        if (s_connLogger.isTraceEnabled()) {
+            s_connLogger.trace("Retrieving a standalone connection: dbconn" + System.identityHashCode(conn));
+        }
+        return conn;
+    }
+
+    public static Connection getStandaloneConnection() {
+        try {
+            return getStandaloneConnectionWithException();
+        } catch (SQLException e) {
+            s_logger.error("Unexpected exception: ", e);
+            return null;
+        }
+    }
+
+    public static Connection getStandaloneUsageConnection() {
+        try {
+            Connection conn = s_usageDS.getConnection();
+            if (s_connLogger.isTraceEnabled()) {
+                s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
+            }
+            return conn;
+        } catch (SQLException e) {
+            s_logger.warn("Unexpected exception: ", e);
+            return null;
+        }
+    }
+
+    public static Connection getStandaloneAwsapiConnection() {
+        try {
+            Connection conn = s_awsapiDS.getConnection();
+            if (s_connLogger.isTraceEnabled()) {
+                s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
+            }
+            return conn;
+        } catch (SQLException e) {
+            s_logger.warn("Unexpected exception: ", e);
+            return null;
+        }
+    }
+    
+    public static Connection getStandaloneSimulatorConnection() {
+    	try {
+    		Connection conn = s_simulatorDS.getConnection();
+    		if (s_connLogger.isTraceEnabled()) {
+                s_connLogger.trace("Retrieving a standalone connection for simulator: dbconn" + System.identityHashCode(conn));
+            }
+            return conn;
+        } catch (SQLException e) {
+            s_logger.warn("Unexpected exception: ", e);
+            return null;
+        }
+    }
+
+    protected void attach(TransactionAttachment value) {
+        _stack.push(new StackElement(ATTACHMENT, value));
+    }
+
+    protected TransactionAttachment detach(String name) {
+        Iterator<StackElement> it = _stack.descendingIterator();
+        while (it.hasNext()) {
+            StackElement element = it.next();
+            if (element.type == ATTACHMENT) {
+                TransactionAttachment att = (TransactionAttachment)element.ref;
+                if (name.equals(att.getName())) {
+                    it.remove();
+                    return att;
+                }
+            }
+        }
+        assert false : "Are you sure you attached this: " + name;
+        return null;
+    }
+
+    public static void attachToTxn(TransactionAttachment value) {
+        TransactionLegacy txn = tls.get();
+        assert txn != null && txn.peekInStack(CURRENT_TXN) != null: "Come on....how can we attach something to the transaction if you haven't started it?";
+
+        txn.attach(value);
+    }
+
+    public static TransactionAttachment detachFromTxn(String name) {
+        TransactionLegacy txn = tls.get();
+        assert txn != null : "No Transaction in TLS";
+        return txn.detach(name);
+    }
+
+    protected static boolean checkAnnotation(int stack, TransactionLegacy txn) {
+        final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
+        StackElement se = txn.peekInStack(CURRENT_TXN);
+        if (se == null) {
+            return false;
+        }
+        
+        StringBuffer sb = new StringBuffer();
+        for (; stack < stacks.length; stack++) {
+            String methodName = stacks[stack].getMethodName();
+            sb.append(" ").append(methodName);
+            if (methodName.equals(se.ref)){
+                return true;
+            }
+        }
+        
+        // relax stack structure for several places that @DB required injection is not in place
+        s_logger.warn("Non-standard stack context that Transaction context is manaully placed into the calling chain. Stack chain: " + sb);
+        return true;
+    }
+
+    protected static String buildName() {
+        if (s_logger.isDebugEnabled()) {
+            final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
+            final StringBuilder str = new StringBuilder();
+            int i = 3, j = 3;
+            while (j < 15 && i < stacks.length) {
+                StackTraceElement element = stacks[i];
+                String filename = element.getFileName();
+                String method = element.getMethodName();
+                if ((filename != null && filename.equals("<generated>")) || (method != null && method.equals("invokeSuper"))) {
+                    i++;
+                    continue;
+                }
+
+                str.append("-").append(stacks[i].getClassName().substring(stacks[i].getClassName().lastIndexOf(".") + 1)).append(".").append(stacks[i].getMethodName()).append(":").append(stacks[i].getLineNumber());
+                j++;
+                i++;
+            }
+            return str.toString();
+        }
+
+        return "";
+    }
+
+    public TransactionLegacy(final String name, final boolean forLocking, final short databaseId) {
+        _name = name;
+        _conn = null;
+        _stack = new LinkedList<StackElement>();
+        _txn = false;
+        _dbId = databaseId;
+        _id = s_id.incrementAndGet();
+        _creator = Thread.currentThread().getName();
+    }
+
+    public String getCreator() {
+        return _creator;
+    }
+
+    public long getId() {
+        return _id;
+    }
+
+    public String getName() {
+        return _name;
+    }
+
+    public Short getDatabaseId() {
+        return _dbId;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder str = new StringBuilder((_name != null ? _name : ""));
+        str.append(" : ");
+        for (final StackElement se : _stack) {
+            if (se.type == CURRENT_TXN) {
+                str.append(se.ref).append(", ");
+            }
+        }
+
+        return str.toString();
+    }
+
+    protected void mark(final String name) {
+        _stack.push(new StackElement(CURRENT_TXN, name));
+    }
+
+    public boolean lock(final String name, final int timeoutSeconds) {
+        Merovingian2 lockMaster = Merovingian2.getLockMaster();
+        if (lockMaster == null) {
+            throw new CloudRuntimeException("There's no support for locking yet");
+        }
+        return lockMaster.acquire(name, timeoutSeconds);
+    }
+
+    public boolean release(final String name) {
+        Merovingian2 lockMaster = Merovingian2.getLockMaster();
+        if (lockMaster == null) {
+            throw new CloudRuntimeException("There's no support for locking yet");
+        }
+        return lockMaster.release(name);
+    }
+
+    public void start() {
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace("txn: start requested by: " + buildName());
+        }
+
+        _stack.push(new StackElement(START_TXN, null));
+
+        if (_txn) {
+            s_logger.trace("txn: has already been started.");
+            return;
+        }
+
+        _txn = true;
+
+        _txnTime = System.currentTimeMillis();
+        if (_conn != null) {
+            try {
+                s_logger.trace("txn: set auto commit to false");
+                _conn.setAutoCommit(false);
+            } catch (final SQLException e) {
+                s_logger.warn("Unable to set auto commit: ", e);
+                throw new CloudRuntimeException("Unable to set auto commit: ", e);
+            }
+        }
+    }
+
+    protected void closePreviousStatement() {
+        if (_stmt != null) {
+            try {
+                if (s_stmtLogger.isTraceEnabled()) {
+                    s_stmtLogger.trace("Closing: " + _stmt.toString());
+                }
+                try {
+                    ResultSet rs = _stmt.getResultSet();
+                    if (rs != null && _stmt.getResultSetHoldability() != ResultSet.HOLD_CURSORS_OVER_COMMIT) {
+                        rs.close();
+                    }
+                } catch(SQLException e) {
+                    s_stmtLogger.trace("Unable to close resultset");
+                }
+                _stmt.close();
+            } catch (final SQLException e) {
+                s_stmtLogger.trace("Unable to close statement: " + _stmt.toString());
+            } finally {
+                _stmt = null;
+            }
+        }
+    }
+
+    /**
+     * Prepares an auto close statement.  The statement is closed automatically if it is
+     * retrieved with this method.
+     * 
+     * @param sql sql String
+     * @return PreparedStatement
+     * @throws SQLException if problem with JDBC layer.
+     * 
+     * @see java.sql.Connection
+     */
+    public PreparedStatement prepareAutoCloseStatement(final String sql) throws SQLException {
+        PreparedStatement stmt = prepareStatement(sql);
+        closePreviousStatement();
+        _stmt = stmt;
+        return stmt;
+    }
+
+    public PreparedStatement prepareStatement(final String sql) throws SQLException {
+        final Connection conn = getConnection();
+        final PreparedStatement pstmt = conn.prepareStatement(sql);
+        if (s_stmtLogger.isTraceEnabled()) {
+            s_stmtLogger.trace("Preparing: " + sql);
+        }
+        return pstmt;
+    }
+
+    /**
+     * Prepares an auto close statement.  The statement is closed automatically if it is
+     * retrieved with this method.
+     * 
+     * @param sql sql String
+     * @param autoGeneratedKeys keys that are generated
+     * @return PreparedStatement
+     * @throws SQLException if problem with JDBC layer.
+     * 
+     * @see java.sql.Connection
+     */
+    public PreparedStatement prepareAutoCloseStatement(final String sql, final int autoGeneratedKeys) throws SQLException {
+        final Connection conn = getConnection();
+        final PreparedStatement pstmt = conn.prepareStatement(sql, autoGeneratedKeys);
+        if (s_stmtLogger.isTraceEnabled()) {
+            s_stmtLogger.trace("Preparing: " + sql);
+        }
+        closePreviousStatement();
+        _stmt = pstmt;
+        return pstmt;
+    }
+
+    /**
+     * Prepares an auto close statement.  The statement is closed automatically if it is
+     * retrieved with this method.
+     * 
+     * @param sql sql String
+     * @param columnNames names of the columns
+     * @return PreparedStatement
+     * @throws SQLException if problem with JDBC layer.
+     * 
+     * @see java.sql.Connection
+     */
+    public PreparedStatement prepareAutoCloseStatement(final String sql, final String[] columnNames) throws SQLException {
+        final Connection conn = getConnection();
+        final PreparedStatement pstmt = conn.prepareStatement(sql, columnNames);
+        if (s_stmtLogger.isTraceEnabled()) {
+            s_stmtLogger.trace("Preparing: " + sql);
+        }
+        closePreviousStatement();
+        _stmt = pstmt;
+        return pstmt;
+    }
+
+    /**
+     * Prepares an auto close statement.  The statement is closed automatically if it is
+     * retrieved with this method.
+     * 
+     * @param sql sql String
+     * @return PreparedStatement
+     * @throws SQLException if problem with JDBC layer.
+     * 
+     * @see java.sql.Connection
+     */
+    public PreparedStatement prepareAutoCloseStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        final Connection conn = getConnection();
+        final PreparedStatement pstmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
+        if (s_stmtLogger.isTraceEnabled()) {
+            s_stmtLogger.trace("Preparing: " + sql);
+        }
+        closePreviousStatement();
+        _stmt = pstmt;
+        return pstmt;
+    }
+
+    /**
+     * Returns the db connection.
+     * 
+     * Note: that you can call getConnection() but beaware that
+     * all prepare statements from the Connection are not garbage
+     * collected!
+     * 
+     * @return DB Connection but make sure you understand that
+     *         you are responsible for closing the PreparedStatement.
+     * @throws SQLException
+     */
+    public Connection getConnection() throws SQLException {
+        if (_conn == null) {
+            switch (_dbId) {
+            case CLOUD_DB:
+                if(s_ds != null) {
+                    _conn = s_ds.getConnection();
+                } else {
+                    s_logger.warn("A static-initialized variable becomes null, process is dying?");
+                    throw new CloudRuntimeException("Database is not initialized, process is dying?");
+                }
+                break;
+            case USAGE_DB:
+                if(s_usageDS != null) {
+                    _conn = s_usageDS.getConnection();
+                } else {
+                    s_logger.warn("A static-initialized variable becomes null, process is dying?");
+                    throw new CloudRuntimeException("Database is not initialized, process is dying?");
+                }
+                break;
+            case AWSAPI_DB:
+        	if(s_awsapiDS != null) {
+        	    _conn = s_awsapiDS.getConnection();
+        	} else {
+        	    s_logger.warn("A static-initialized variable becomes null, process is dying?");
+                throw new CloudRuntimeException("Database is not initialized, process is dying?");
+        	}
+                break;
+
+            case SIMULATOR_DB:
+                if(s_simulatorDS != null) {
+                    _conn = s_simulatorDS.getConnection();
+                } else {
+                    s_logger.warn("A static-initialized variable becomes null, process is dying?");
+                    throw new CloudRuntimeException("Database is not initialized, process is dying?");
+                }
+                break;
+            default:
+
+        	throw new CloudRuntimeException("No database selected for the transaction");
+            }
+            _conn.setAutoCommit(!_txn);
+
+            //
+            // MySQL default transaction isolation level is REPEATABLE READ,
+            // to reduce chances of DB deadlock, we will use READ COMMITED isolation level instead
+            // see http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html
+            //
+            _stack.push(new StackElement(CREATE_CONN, null));
+            if (s_connLogger.isTraceEnabled()) {
+                s_connLogger.trace("Creating a DB connection with " + (_txn ? " txn: " : " no txn: ") + " for " + _dbId + ": dbconn" + System.identityHashCode(_conn) + ". Stack: " + buildName());
+            }
+        } else {
+            s_logger.trace("conn: Using existing DB connection");
+        }
+
+        return _conn;
+    }
+
+    protected boolean takeOver(final String name, final boolean create) {
+        if (_stack.size() != 0) {
+            if (!create) {
+                // If it is not a create transaction, then let's just use the current one.
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace("Using current transaction: " + toString());
+                }
+                mark(name);
+                return false;
+            }
+
+            final StackElement se = _stack.getFirst();
+            if (se.type == CREATE_TXN) {
+                // This create is called inside of another create.  Which is ok?
+                // We will let that create be responsible for cleaning up.
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace("Create using current transaction: " + toString());
+                }
+                mark(name);
+                return false;
+            }
+
+            s_logger.warn("Encountered a transaction that has leaked.  Cleaning up. " + toString());
+            cleanup();
+        }
+
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace("Took over the transaction: " + name);
+        }
+        _stack.push(new StackElement(create ? CREATE_TXN : CURRENT_TXN, name));
+        _name = name;
+        return true;
+    }
+
+    public void cleanup() {
+        closePreviousStatement();
+
+        removeUpTo(null, null);
+        if (_txn) {
+            rollbackTransaction();
+        }
+        _txn = false;
+        _name = null;
+
+        closeConnection();
+
+        _stack.clear();
+        Merovingian2 lockMaster = Merovingian2.getLockMaster();
+        if (lockMaster != null) {
+            lockMaster.cleanupThread();
+        }
+    }
+
+    public void close() {
+        removeUpTo(CURRENT_TXN, null);
+
+        if (_stack.size() == 0) {
+            s_logger.trace("Transaction is done");
+            cleanup();
+        }
+    }
+
+    /**
+     * close() is used by endTxn to close the connection.  This method only
+     * closes the connection if the name is the same as what's stored.
+     * 
+     * @param name
+     * @return true if this close actually closes the connection.  false if not.
+     */
+    public boolean close(final String name) {
+        if (_name == null) {    // Already cleaned up.
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Already cleaned up." + buildName());
+            }
+            return true;
+        }
+
+        if (!_name.equals(name)) {
+            close();
+            return false;
+        }
+
+        if (s_logger.isDebugEnabled() && _stack.size() > 2) {
+            s_logger.debug("Transaction is not closed properly: " + toString() + ".  Called by " + buildName());
+        }
+
+        cleanup();
+
+        s_logger.trace("All done");
+        return true;
+    }
+
+    protected boolean hasTxnInStack() {
+        return peekInStack(START_TXN) != null;
+    }
+
+    protected void clearLockTimes() {
+        if (s_lockLogger.isDebugEnabled()) {
+            for (Pair<String, Long> time : _lockTimes) {
+                s_lockLogger.trace("SQL " + time.first() + " took " + (System.currentTimeMillis() - time.second()));
+            }
+            _lockTimes.clear();
+        }
+    }
+
+    public boolean commit() {
+        if (!_txn) {
+            s_logger.warn("txn: Commit called when it is not a transaction: " + buildName());
+            return false;
+        }
+
+        Iterator<StackElement> it = _stack.iterator();
+        while (it.hasNext()) {
+            StackElement st = it.next();
+            if (st.type == START_TXN) {
+                it.remove();
+                break;
+            }
+        }
+
+        if (hasTxnInStack()) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("txn: Not committing because transaction started elsewhere: " + buildName() + " / " + toString());
+            }
+            return false;
+        }
+
+        _txn = false;
+        try {
+            if (_conn != null) {
+                _conn.commit();
+                s_logger.trace("txn: DB Changes committed. Time = " + (System.currentTimeMillis() - _txnTime));
+                clearLockTimes();
+                closeConnection();
+            }
+            return true;
+        } catch (final SQLException e) {
+            rollbackTransaction();
+            throw new CloudRuntimeException("Unable to commit or close the connection. ", e);
+        }
+    }
+
+    protected void closeConnection() {
+        closePreviousStatement();
+
+        if (_conn == null) {
+            return;
+        }
+
+        if (_txn) {
+            s_connLogger.trace("txn: Not closing DB connection because we're still in a transaction.");
+            return;
+        }
+
+        try {
+            // we should only close db connection when it is not user managed
+            if (this._dbId != CONNECTED_DB) {
+                if (s_connLogger.isTraceEnabled()) {
+                    s_connLogger.trace("Closing DB connection: dbconn" + System.identityHashCode(_conn));
+                }                                
+                _conn.close();
+                _conn = null;  
+            }
+
+        } catch (final SQLException e) {
+            s_logger.warn("Unable to close connection", e);
+        }
+    }
+
+    protected void removeUpTo(String type, Object ref) {
+        boolean rollback = false;
+        Iterator<StackElement> it = _stack.iterator();
+        while (it.hasNext()) {
+            StackElement item = it.next();
+
+            it.remove();
+
+            try {
+                if (item.type == type && (ref == null || item.ref == ref)) {
+                    break;
+                }
+
+                if (item.type == CURRENT_TXN) {
+                    if (s_logger.isTraceEnabled()) {
+                        s_logger.trace("Releasing the current txn: " + (item.ref != null ? item.ref : ""));
+                    }
+                } else if (item.type == CREATE_CONN) {
+                    closeConnection();
+                } else if (item.type == START_TXN) {
+                    if (item.ref == null) {
+                        rollback = true;
+                    } else {
+                        try {
+                            _conn.rollback((Savepoint)ref);
+                            rollback = false;
+                        } catch (final SQLException e) {
+                            s_logger.warn("Unable to rollback Txn.", e);
+                        }
+                    }
+                } else if (item.type == STATEMENT) {
+                    try {
+                        if (s_stmtLogger.isTraceEnabled()) {
+                            s_stmtLogger.trace("Closing: " + ref.toString());
+                        }
+                        Statement stmt = (Statement)ref;
+                        try {
+                            ResultSet rs = stmt.getResultSet();
+                            if (rs != null) {
+                                rs.close();
+                            }
+                        } catch(SQLException e) {
+                            s_stmtLogger.trace("Unable to close resultset");
+                        }
+                        stmt.close();
+                    } catch (final SQLException e) {
+                        s_stmtLogger.trace("Unable to close statement: " + item);
+                    }
+                } else if (item.type == ATTACHMENT) {
+                    TransactionAttachment att = (TransactionAttachment)item.ref;
+                    if (s_logger.isTraceEnabled()) {
+                        s_logger.trace("Cleaning up " + att.getName());
+                    }
+                    att.cleanup();
+                }
+            } catch(Exception e) {
+                s_logger.error("Unable to clean up " + item, e);
+            }
+        }
+
+        if (rollback) {
+            rollback();
+        }
+    }
+
+    protected void rollbackTransaction() {
+        closePreviousStatement();
+        if (!_txn) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Rollback called for " + _name + " when there's no transaction: " + buildName());
+            }
+            return;
+        }
+        assert (!hasTxnInStack()) : "Who's rolling back transaction when there's still txn in stack?";
+        _txn = false;
+        try {
+            if (_conn != null) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Rolling back the transaction: Time = " + (System.currentTimeMillis() - _txnTime) + " Name =  " + _name + "; called by " + buildName());
+                }
+                _conn.rollback();
+            }
+            clearLockTimes();
+            closeConnection();
+        } catch(final SQLException e) {
+            s_logger.warn("Unable to rollback", e);
+        }
+    }
+
+    protected void rollbackSavepoint(Savepoint sp) {
+        try {
+            if (_conn != null) {
+                _conn.rollback(sp);
+            }
+        } catch (SQLException e) {
+            s_logger.warn("Unable to rollback to savepoint " + sp);
+        }
+
+        if (!hasTxnInStack()) {
+            _txn = false;
+            closeConnection();
+        }
+    }
+
+    public void rollback() {
+        Iterator<StackElement> it = _stack.iterator();
+        while (it.hasNext()) {
+            StackElement st = it.next();
+            if (st.type == START_TXN) {
+                if (st.ref == null) {
+                    it.remove();
+                } else  {
+                    rollback((Savepoint)st.ref);
+                    return;
+                }
+            }
+        }
+
+        rollbackTransaction();
+    }
+
+    public Savepoint setSavepoint() throws SQLException {
+        _txn = true;
+        StackElement st = new StackElement(START_TXN, null);
+        _stack.push(st);
+        final Connection conn = getConnection();
+        final Savepoint sp = conn.setSavepoint();
+        st.ref = sp;
+
+        return sp;
+    }
+
+    public Savepoint setSavepoint(final String name) throws SQLException {
+        _txn = true;
+        StackElement st = new StackElement(START_TXN, null);
+        _stack.push(st);
+        final Connection conn = getConnection();
+        final Savepoint sp = conn.setSavepoint(name);
+        st.ref = sp;
+
+        return sp;
+    }
+
+    public void releaseSavepoint(final Savepoint sp) throws SQLException {
+        removeTxn(sp);
+        if (_conn != null) {
+            _conn.releaseSavepoint(sp);
+        }
+
+        if (!hasTxnInStack()) {
+            _txn = false;
+            closeConnection();
+        }
+    }
+
+    protected boolean hasSavepointInStack(Savepoint sp) {
+        Iterator<StackElement> it = _stack.iterator();
+        while (it.hasNext()) {
+            StackElement se = it.next();
+            if (se.type == START_TXN && se.ref == sp) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected void removeTxn(Savepoint sp) {
+        assert hasSavepointInStack(sp) : "Removing a save point that's not in the stack";
+
+        if (!hasSavepointInStack(sp)) {
+            return;
+        }
+
+        Iterator<StackElement> it = _stack.iterator();
+        while (it.hasNext()) {
+            StackElement se = it.next();
+            if (se.type == START_TXN) {
+                it.remove();
+                if (se.ref == sp) {
+                    return;
+                }
+            }
+        }
+    }
+
+    public void rollback(final Savepoint sp) {
+        removeTxn(sp);
+
+        rollbackSavepoint(sp);
+    }
+
+    public Connection getCurrentConnection() {
+        return _conn;
+    }
+
+    public List<StackElement> getStack() {
+        return _stack;
+    }
+
+    protected TransactionLegacy() {
+        _name = null;
+        _conn = null;
+        _stack = null;
+        _txn = false;
+        _dbId = -1;
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        if (!(_conn == null && (_stack == null || _stack.size() == 0))) {
+            assert (false) : "Oh Alex oh alex...something is wrong with how we're doing this";
+            s_logger.error("Something went wrong that a transaction is orphaned before db connection is closed");
+            cleanup();
+        }
+    }
+
+    protected class StackElement {
+        public String type;
+        public Object ref;
+
+        public StackElement (String type, Object ref) {
+            this.type = type;
+            this.ref = ref;
+        }
+
+        @Override
+        public String toString() {
+            return type + "-" + ref;
+        }
+    }
+
+    private static DataSource s_ds;
+    private static DataSource s_usageDS;
+    private static DataSource s_awsapiDS;
+    private static DataSource s_simulatorDS;
+
+    static {
+        // Initialize with assumed db.properties file
+        initDataSource("db.properties");
+    }
+
+    public static void initDataSource(String propsFileName) {
+        try {
+            File dbPropsFile = PropertiesUtil.findConfigFile(propsFileName);
+            final Properties dbProps;
+            if (EncryptionSecretKeyChecker.useEncryption()) {
+                StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor();
+                dbProps = new EncryptableProperties(encryptor);
+            } else {
+                dbProps = new Properties();
+            }
+            try {
+                dbProps.load(new FileInputStream(dbPropsFile));
+            } catch (IOException e) {
+                s_logger.fatal("Unable to load db properties file, pl. check the classpath and file path configuration", e);
+                return;
+            } catch (NullPointerException e) {
+                s_logger.fatal("Unable to locate db properties file within classpath or absolute path: " + propsFileName);
+                return;
+            }
+
+            // FIXME:  If params are missing...default them????
+            final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive"));
+            final int cloudMaxIdle = Integer.parseInt(dbProps.getProperty("db.cloud.maxIdle"));
+            final long cloudMaxWait = Long.parseLong(dbProps.getProperty("db.cloud.maxWait"));
+            final String cloudUsername = dbProps.getProperty("db.cloud.username");
+            final String cloudPassword = dbProps.getProperty("db.cloud.password");
+            final String cloudHost = dbProps.getProperty("db.cloud.host");
+            final int cloudPort = Integer.parseInt(dbProps.getProperty("db.cloud.port"));
+            final String cloudDbName = dbProps.getProperty("db.cloud.name");
+            final boolean cloudAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.cloud.autoReconnect"));
+            final String cloudValidationQuery = dbProps.getProperty("db.cloud.validationQuery");
+            final String cloudIsolationLevel = dbProps.getProperty("db.cloud.isolation.level");
+
+            int isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
+            if (cloudIsolationLevel == null) {
+                isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
+            } else if (cloudIsolationLevel.equalsIgnoreCase("readcommitted")) {
+                isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
+            } else if (cloudIsolationLevel.equalsIgnoreCase("repeatableread")) {
+                isolationLevel = Connection.TRANSACTION_REPEATABLE_READ;
+            } else if (cloudIsolationLevel.equalsIgnoreCase("serializable")) {
+                isolationLevel = Connection.TRANSACTION_SERIALIZABLE;
+            } else if (cloudIsolationLevel.equalsIgnoreCase("readuncommitted")) {
+                isolationLevel = Connection.TRANSACTION_READ_UNCOMMITTED;
+            } else {
+                s_logger.warn("Unknown isolation level " + cloudIsolationLevel + ".  Using read uncommitted");
+            }
+
+            final boolean cloudTestOnBorrow = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testOnBorrow"));
+            final boolean cloudTestWhileIdle = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testWhileIdle"));
+            final long cloudTimeBtwEvictionRunsMillis = Long.parseLong(dbProps.getProperty("db.cloud.timeBetweenEvictionRunsMillis"));
+            final long cloudMinEvcitableIdleTimeMillis = Long.parseLong(dbProps.getProperty("db.cloud.minEvictableIdleTimeMillis"));
+            final boolean cloudPoolPreparedStatements = Boolean.parseBoolean(dbProps.getProperty("db.cloud.poolPreparedStatements"));
+            final String url = dbProps.getProperty("db.cloud.url.params");
+
+            final boolean useSSL = Boolean.parseBoolean(dbProps.getProperty("db.cloud.useSSL"));
+            if (useSSL) {
+                System.setProperty("javax.net.ssl.keyStore", dbProps.getProperty("db.cloud.keyStore"));
+                System.setProperty("javax.net.ssl.keyStorePassword", dbProps.getProperty("db.cloud.keyStorePassword"));
+                System.setProperty("javax.net.ssl.trustStore", dbProps.getProperty("db.cloud.trustStore"));
+                System.setProperty("javax.net.ssl.trustStorePassword", dbProps.getProperty("db.cloud.trustStorePassword"));
+            }
+
+            final GenericObjectPool cloudConnectionPool = new GenericObjectPool(null, cloudMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+                    cloudMaxWait, cloudMaxIdle, cloudTestOnBorrow, false, cloudTimeBtwEvictionRunsMillis, 1, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle);
+
+            final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + cloudDbName +
+                    "?autoReconnect=" + cloudAutoReconnect + (url != null ? "&" + url : "") + (useSSL ? "&useSSL=true" : ""), cloudUsername, cloudPassword);
+
+            final KeyedObjectPoolFactory poolableObjFactory = (cloudPoolPreparedStatements ? new StackKeyedObjectPoolFactory() : null);
+
+            final PoolableConnectionFactory cloudPoolableConnectionFactory = new PoolableConnectionFactory(cloudConnectionFactory, cloudConnectionPool, poolableObjFactory,
+                    cloudValidationQuery, false, false, isolationLevel);
+
+            // Default Data Source for CloudStack
+            s_ds = new PoolingDataSource(cloudPoolableConnectionFactory.getPool());
+
+            // Configure the usage db
+            final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive"));
+            final int usageMaxIdle = Integer.parseInt(dbProps.getProperty("db.usage.maxIdle"));
+            final long usageMaxWait = Long.parseLong(dbProps.getProperty("db.usage.maxWait"));
+            final String usageUsername = dbProps.getProperty("db.usage.username");
+            final String usagePassword = dbProps.getProperty("db.usage.password");
+            final String usageHost = dbProps.getProperty("db.usage.host");
+            final int usagePort = Integer.parseInt(dbProps.getProperty("db.usage.port"));
+            final String usageDbName = dbProps.getProperty("db.usage.name");
+            final boolean usageAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.usage.autoReconnect"));
+            final String usageUrl = dbProps.getProperty("db.usage.url.params");
+
+            final GenericObjectPool usageConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+                    usageMaxWait, usageMaxIdle);
+
+            final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + usageHost + ":" + usagePort + "/" + usageDbName +
+                    "?autoReconnect=" + usageAutoReconnect + (usageUrl != null ? "&" + usageUrl : ""), usageUsername, usagePassword);
+
+            final PoolableConnectionFactory usagePoolableConnectionFactory = new PoolableConnectionFactory(usageConnectionFactory, usageConnectionPool,
+                    new StackKeyedObjectPoolFactory(), null, false, false);
+
+            // Data Source for usage server
+            s_usageDS = new PoolingDataSource(usagePoolableConnectionFactory.getPool());
+
+            // Configure awsapi db
+            final String awsapiDbName = dbProps.getProperty("db.awsapi.name");
+            final GenericObjectPool awsapiConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+                    usageMaxWait, usageMaxIdle);
+            final ConnectionFactory awsapiConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + awsapiDbName +
+                    "?autoReconnect=" + usageAutoReconnect, cloudUsername, cloudPassword);
+            final PoolableConnectionFactory awsapiPoolableConnectionFactory = new PoolableConnectionFactory(awsapiConnectionFactory, awsapiConnectionPool,
+                    new StackKeyedObjectPoolFactory(), null, false, false);
+
+            // Data Source for awsapi
+            s_awsapiDS = new PoolingDataSource(awsapiPoolableConnectionFactory.getPool());
+
+            try {
+                // Configure the simulator db
+                final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive"));
+                final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle"));
+                final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait"));
+                final String simulatorUsername = dbProps.getProperty("db.simulator.username");
+                final String simulatorPassword = dbProps.getProperty("db.simulator.password");
+                final String simulatorHost = dbProps.getProperty("db.simulator.host");
+                final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port"));
+                final String simulatorDbName = dbProps.getProperty("db.simulator.name");
+                final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect"));
+
+                final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+                        simulatorMaxWait, simulatorMaxIdle);
+
+                final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + simulatorHost + ":" + simulatorPort + "/" + simulatorDbName +
+                        "?autoReconnect=" + simulatorAutoReconnect, simulatorUsername, simulatorPassword);
+
+                final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool,
+                        new StackKeyedObjectPoolFactory(), null, false, false);
+                s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool());
+            } catch (Exception e) {
+                s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS");
+            }
+        } catch (final Exception e) {
+            s_ds = getDefaultDataSource("cloud");
+            s_usageDS = getDefaultDataSource("cloud_usage");
+            s_simulatorDS = getDefaultDataSource("cloud_simulator");
+            s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Falling back on assumed datasource on localhost:3306 using username:password=cloud:cloud. Please check your configuration", e);
+        }
+    }
+
+    private static DataSource getDefaultDataSource(final String database) {
+        final GenericObjectPool connectionPool = new GenericObjectPool(null, 5);
+        final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
+           "jdbc:mysql://localhost:3306/" + database, "cloud", "cloud");
+        final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
+           connectionFactory, connectionPool, null, null, false, true);
+        return new PoolingDataSource(
+           /* connectionPool */poolableConnectionFactory.getPool());
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java b/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
index d51a9bd..73511b1 100644
--- a/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
@@ -25,21 +25,21 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import javax.management.StandardMBean;
 
-import com.cloud.utils.db.Transaction.StackElement;
+import com.cloud.utils.db.TransactionLegacy.StackElement;
 
 public class TransactionMBeanImpl extends StandardMBean implements TransactionMBean {
     
-    Map<Long, Transaction> _txns = new ConcurrentHashMap<Long, Transaction>();
+    Map<Long, TransactionLegacy> _txns = new ConcurrentHashMap<Long, TransactionLegacy>();
     
     public TransactionMBeanImpl() {
         super(TransactionMBean.class, false);
     }
     
-    public void addTransaction(Transaction txn) {
+    public void addTransaction(TransactionLegacy txn) {
         _txns.put(txn.getId(), txn);
     }
     
-    public void removeTransaction(Transaction txn) {
+    public void removeTransaction(TransactionLegacy txn) {
         _txns.remove(txn.getId());
     }
     
@@ -53,7 +53,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
         int[] count = new int[2];
         count[0] = 0;
         count[1] = 0;
-        for (Transaction txn : _txns.values()) {
+        for (TransactionLegacy txn : _txns.values()) {
             if (txn.getStack().size() > 0) {
                 count[0]++;
             }
@@ -67,7 +67,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
     @Override
     public List<Map<String, String>> getTransactions() {
         ArrayList<Map<String, String>> txns = new ArrayList<Map<String, String>>();
-        for (Transaction info : _txns.values()) {
+        for (TransactionLegacy info : _txns.values()) {
             txns.add(toMap(info));
         }
         return txns;
@@ -76,7 +76,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
     @Override
     public List<Map<String, String>> getActiveTransactions() {
         ArrayList<Map<String, String>> txns = new ArrayList<Map<String, String>>();
-        for (Transaction txn : _txns.values()) {
+        for (TransactionLegacy txn : _txns.values()) {
             if (txn.getStack().size() > 0 || txn.getCurrentConnection() != null) {
                 txns.add(toMap(txn));
             }
@@ -84,7 +84,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
         return txns;
     }
     
-    protected Map<String, String> toMap(Transaction txn) {
+    protected Map<String, String> toMap(TransactionLegacy txn) {
         Map<String, String> map = new HashMap<String, String>();
         map.put("name", txn.getName());
         map.put("id", Long.toString(txn.getId()));
@@ -103,7 +103,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
     @Override
     public List<Map<String, String>> getTransactionsWithDatabaseConnection() {
         ArrayList<Map<String, String>> txns = new ArrayList<Map<String, String>>();
-        for (Transaction txn : _txns.values()) {
+        for (TransactionLegacy txn : _txns.values()) {
             if (txn.getCurrentConnection() != null) {
                 txns.add(toMap(txn));
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionStatus.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionStatus.java b/framework/db/src/com/cloud/utils/db/TransactionStatus.java
new file mode 100644
index 0000000..a167797
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionStatus.java
@@ -0,0 +1,7 @@
+package com.cloud.utils.db;
+
+/**
+ * Placeholder for possible future features
+ */
+public interface TransactionStatus {
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java b/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
new file mode 100644
index 0000000..70d4c16
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.cloud.utils.db;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class TransactionWrappedExeception extends CloudRuntimeException {
+
+    private static final long serialVersionUID = -3254037624055143300L;
+
+    Exception e;
+
+    public TransactionWrappedExeception(Exception e) {
+        this.e = e;
+    }
+
+    public Exception getWrapped() {
+        return e;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/test/com/cloud/utils/db/DbTestDao.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/DbTestDao.java b/framework/db/test/com/cloud/utils/db/DbTestDao.java
index 9530b3b..7db5ba8 100644
--- a/framework/db/test/com/cloud/utils/db/DbTestDao.java
+++ b/framework/db/test/com/cloud/utils/db/DbTestDao.java
@@ -29,7 +29,7 @@ public class DbTestDao extends GenericDaoBase<DbTestVO, Long> implements Generic
 
     @DB
     public void create(int fldInt, long fldLong, String fldString) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -48,7 +48,7 @@ public class DbTestDao extends GenericDaoBase<DbTestVO, Long> implements Generic
 
     @DB
     public void update(int fldInt, long fldLong, String fldString) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/test/com/cloud/utils/db/DbTestUtils.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/DbTestUtils.java b/framework/db/test/com/cloud/utils/db/DbTestUtils.java
index 11ae1aa..2458b8c 100644
--- a/framework/db/test/com/cloud/utils/db/DbTestUtils.java
+++ b/framework/db/test/com/cloud/utils/db/DbTestUtils.java
@@ -33,7 +33,7 @@ public class DbTestUtils {
             throw new RuntimeException("Unable to clean the database because I can't find " + file);
         }
         
-        Connection conn = Transaction.getStandaloneConnection();
+        Connection conn = TransactionLegacy.getStandaloneConnection();
         
         ScriptRunner runner = new ScriptRunner(conn, autoCommit, stopOnError);
         FileReader reader;
@@ -63,7 +63,7 @@ public class DbTestUtils {
             throw new RuntimeException("Unable to clean the database because I can't find " + file);
         }
         
-        Connection conn = Transaction.getStandaloneUsageConnection();
+        Connection conn = TransactionLegacy.getStandaloneUsageConnection();
         
         ScriptRunner runner = new ScriptRunner(conn, autoCommit, stopOnError);
         FileReader reader;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/test/com/cloud/utils/db/TransactionTest.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/TransactionTest.java b/framework/db/test/com/cloud/utils/db/TransactionTest.java
index 101a533..92b2f36 100644
--- a/framework/db/test/com/cloud/utils/db/TransactionTest.java
+++ b/framework/db/test/com/cloud/utils/db/TransactionTest.java
@@ -41,7 +41,7 @@ public class TransactionTest {
         Connection conn = null;
         PreparedStatement pstmt = null;
         try {
-            conn = Transaction.getStandaloneConnection();
+            conn = TransactionLegacy.getStandaloneConnection();
 
             pstmt = conn.prepareStatement("CREATE TABLE `cloud`.`test` ("
                     + "`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT," + "`fld_int` int unsigned,"
@@ -75,27 +75,27 @@ public class TransactionTest {
      */
     public void testUserManagedConnection() {
         DbTestDao testDao = ComponentContext.inject(DbTestDao.class);
-        Transaction txn = Transaction.open("SingleConnectionThread");
+        TransactionLegacy txn = TransactionLegacy.open("SingleConnectionThread");
         Connection conn = null;
         try {
-            conn = Transaction.getStandaloneConnectionWithException();
+            conn = TransactionLegacy.getStandaloneConnectionWithException();
             txn.transitToUserManagedConnection(conn);
             // try two SQLs to make sure that they are using the same connection
             // acquired above.
             testDao.create(1, 1, "Record 1");
-            Connection checkConn = Transaction.currentTxn().getConnection();
+            Connection checkConn = TransactionLegacy.currentTxn().getConnection();
             if (checkConn != conn) {
                 Assert.fail("A new db connection is acquired instead of using old one after create sql");
             }
             testDao.update(2, 2, "Record 1");
-            Connection checkConn2 = Transaction.currentTxn().getConnection();
+            Connection checkConn2 = TransactionLegacy.currentTxn().getConnection();
             if (checkConn2 != conn) {
                 Assert.fail("A new db connection is acquired instead of using old one after update sql");
             }
         } catch (SQLException e) {
             Assert.fail(e.getMessage());
         } finally {
-            txn.transitToAutoManagedConnection(Transaction.CLOUD_DB);
+            txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
             txn.close();
 
             if (conn != null) {
@@ -117,28 +117,28 @@ public class TransactionTest {
         // acquire a db connection and keep it
         Connection conn = null;
         try {
-            conn = Transaction.getStandaloneConnectionWithException();
+            conn = TransactionLegacy.getStandaloneConnectionWithException();
         } catch (SQLException ex) {
             throw new CloudRuntimeException("Problem with getting db connection", ex);
         }
 
         // start heartbeat loop, make sure that each loop still use the same
         // connection
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         for (int i = 0; i < 3; i++) {
-            txn = Transaction.open("HeartbeatSimulator");
+            txn = TransactionLegacy.open("HeartbeatSimulator");
             try {
 
                 txn.transitToUserManagedConnection(conn);
                 testDao.create(i, i, "Record " + i);
-                Connection checkConn = Transaction.currentTxn().getConnection();
+                Connection checkConn = TransactionLegacy.currentTxn().getConnection();
                 if (checkConn != conn) {
                     Assert.fail("A new db connection is acquired instead of using old one in loop " + i);
                 }
             } catch (SQLException e) {
                 Assert.fail(e.getMessage());
             } finally {
-                txn.transitToAutoManagedConnection(Transaction.CLOUD_DB);
+                txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
                 txn.close();
             }
         }
@@ -161,7 +161,7 @@ public class TransactionTest {
         Connection conn = null;
         PreparedStatement pstmt = null;
         try {
-            conn = Transaction.getStandaloneConnection();
+            conn = TransactionLegacy.getStandaloneConnection();
 
             pstmt = conn.prepareStatement("truncate table `cloud`.`test`");
             pstmt.execute();
@@ -189,7 +189,7 @@ public class TransactionTest {
         Connection conn = null;
         PreparedStatement pstmt = null;
         try {
-            conn = Transaction.getStandaloneConnection();
+            conn = TransactionLegacy.getStandaloneConnection();
 
             pstmt = conn.prepareStatement("DROP TABLE IF EXISTS `cloud`.`test`");
             pstmt.execute();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
index fb3845c..ed161e7 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class AsyncJobDaoImpl extends GenericDaoBase<AsyncJobVO, Long> implements AsyncJobDao {
     private static final Logger s_logger = Logger.getLogger(AsyncJobDaoImpl.class.getName());
@@ -182,7 +182,7 @@ public class AsyncJobDaoImpl extends GenericDaoBase<AsyncJobVO, Long> implements
                 + ", job_result='" + jobResultMessage + "' where job_status=" + JobInfo.Status.IN_PROGRESS.ordinal()
                 + " AND (job_executing_msid=? OR (job_executing_msid IS NULL AND job_init_msid=?))";
 		
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
index 20d8ba6..d4ca0d7 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -157,7 +157,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
 //
 //		Date cutDate = DateUtil.currentGMTTime();
 //
-//		Transaction txn = Transaction.currentTxn();
+//		TransactionLegacy txn = TransactionLegacy.currentTxn();
 //        PreparedStatement pstmt = null;
 //        try {
 //			txn.start();
@@ -213,7 +213,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
     public List<Long> findJobsToWake(long joinedJobId) {
         // TODO: We should fix this.  We shouldn't be crossing daos in a dao code.
         List<Long> standaloneList = new ArrayList<Long>();
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         String sql = "SELECT job_id FROM async_job_join_map WHERE join_job_id = ? AND job_id NOT IN (SELECT content_id FROM sync_queue_item)";
         try {
             PreparedStatement pstmt = txn.prepareStatement(sql);
@@ -231,7 +231,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
     @Override
     public List<Long> findJobsToWakeBetween(Date cutDate) {
         List<Long> standaloneList = new ArrayList<Long>();
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             String sql = "SELECT job_id FROM async_job_join_map WHERE next_wakeup < ? AND expiration > ? AND job_id NOT IN (SELECT content_id FROM sync_queue_item)";
             PreparedStatement pstmt = txn.prepareStatement(sql);
@@ -260,7 +260,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
 //    public List<Long> wakeupByJoinedJobCompletion(long joinedJobId) {
 //        List<Long> standaloneList = new ArrayList<Long>();
 //
-//        Transaction txn = Transaction.currentTxn();
+//        TransactionLegacy txn = TransactionLegacy.currentTxn();
 //        PreparedStatement pstmt = null;
 //        try {
 //            txn.start();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
index f7d9d72..01efc4e 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class SyncQueueDaoImpl extends GenericDaoBase<SyncQueueVO, Long> implements SyncQueueDao {
     private static final Logger s_logger = Logger.getLogger(SyncQueueDaoImpl.class.getName());
@@ -51,7 +51,7 @@ public class SyncQueueDaoImpl extends GenericDaoBase<SyncQueueVO, Long> implemen
         String sql = "INSERT IGNORE INTO sync_queue(sync_objtype, sync_objid, created, last_updated)" +
                 " values(?, ?, ?, ?)";
 		
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
index 0cd231f..2f04a7c 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
@@ -37,7 +37,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @DB
 public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long> implements SyncQueueItemDao {
@@ -83,7 +83,7 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
 					 " ORDER BY i.id " +
 					 " LIMIT 0, ?";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index 93d50c1..ffc7b3a 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -70,8 +70,11 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExceptionUtil;
 import com.cloud.utils.mgmt.JmxUtil;
@@ -177,19 +180,22 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
     @SuppressWarnings("unchecked")
     @Override
     @DB
-    public long submitAsyncJob(AsyncJob job, String syncObjType, long syncObjId) {
-        Transaction txt = Transaction.currentTxn();
+    public long submitAsyncJob(final AsyncJob job, final String syncObjType, final long syncObjId) {
         try {
             @SuppressWarnings("rawtypes")
-            GenericDao dao = GenericDaoBase.getDao(job.getClass());
+            final GenericDao dao = GenericDaoBase.getDao(job.getClass());
 
-            txt.start();
-            job.setInitMsid(getMsid());
-            dao.persist(job);
+            return Transaction.execute(new TransactionCallback<Long>() {
+                @Override
+                public Long doInTransaction(TransactionStatus status) {
+                    job.setInitMsid(getMsid());
+                    dao.persist(job);
+
+                    syncAsyncJobExecution(job, syncObjType, syncObjId, 1);
 
-            syncAsyncJobExecution(job, syncObjType, syncObjId, 1);
-            txt.commit();
-            return job.getId();
+                    return job.getId();
+                }
+            });
         } catch (Exception e) {
             String errMsg = "Unable to schedule async job for command " + job.getCmd() + ", unexpected exception.";
             s_logger.warn(errMsg, e);
@@ -199,123 +205,110 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
 
     @Override
     @DB
-    public void completeAsyncJob(long jobId, Status jobStatus, int resultCode, String resultObject) {
+    public void completeAsyncJob(final long jobId, final Status jobStatus, final int resultCode, final String resultObject) {
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Complete async job-" + jobId + ", jobStatus: " + jobStatus + ", resultCode: " + resultCode + ", result: " + resultObject);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        try {
-            txn.start();
-            AsyncJobVO job = _jobDao.findById(jobId);
-            if (job == null) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " +
-                                   resultObject);
-                }
-
-                txn.rollback();
-                return;
+        final AsyncJobVO job = _jobDao.findById(jobId);
+        if (job == null) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " +
+                               resultObject);
             }
 
-            if (job.getStatus() != JobInfo.Status.IN_PROGRESS) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("job-" + jobId + " is already completed.");
-                }
+            return;
+        }
 
-                txn.rollback();
-                return;
+        if (job.getStatus() != JobInfo.Status.IN_PROGRESS) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("job-" + jobId + " is already completed.");
             }
 
-            job.setCompleteMsid(getMsid());
-            job.setStatus(jobStatus);
-            job.setResultCode(resultCode);
+            return;
+        }
 
-            // reset attached object
-            job.setInstanceType(null);
-            job.setInstanceId(null);
+        List<Long> wakeupList = Transaction.execute(new TransactionCallback<List<Long>>() {
+            @Override
+            public List<Long> doInTransaction(TransactionStatus status) {
+                job.setCompleteMsid(getMsid());
+                job.setStatus(jobStatus);
+                job.setResultCode(resultCode);
 
-            if (resultObject != null) {
-                job.setResult(resultObject);
-            }
+                // reset attached object
+                job.setInstanceType(null);
+                job.setInstanceId(null);
 
-            job.setLastUpdated(DateUtil.currentGMTTime());
-            _jobDao.update(jobId, job);
+                if (resultObject != null) {
+                    job.setResult(resultObject);
+                }
 
-            List<Long> wakeupList = wakeupByJoinedJobCompletion(jobId);
-            _joinMapDao.disjoinAllJobs(jobId);
+                job.setLastUpdated(DateUtil.currentGMTTime());
+                _jobDao.update(jobId, job);
 
-            txn.commit();
+                List<Long> wakeupList = wakeupByJoinedJobCompletion(jobId);
+                _joinMapDao.disjoinAllJobs(jobId);
 
-            for (Long id : wakeupList) {
-                // TODO, we assume that all jobs in this category is API job only
-                AsyncJobVO jobToWakeup = _jobDao.findById(id);
-                if (jobToWakeup != null && (jobToWakeup.getPendingSignals() & AsyncJob.Constants.SIGNAL_MASK_WAKEUP) != 0)
-                    scheduleExecution(jobToWakeup, false);
+                return wakeupList;
             }
+        });
 
-            _messageBus.publish(null, AsyncJob.Topics.JOB_STATE, PublishScope.GLOBAL, jobId);
-        } catch (Exception e) {
-            s_logger.error("Unexpected exception while completing async job-" + jobId, e);
-            txn.rollback();
+        for (Long id : wakeupList) {
+            // TODO, we assume that all jobs in this category is API job only
+            AsyncJobVO jobToWakeup = _jobDao.findById(id);
+            if (jobToWakeup != null && (jobToWakeup.getPendingSignals() & AsyncJob.Constants.SIGNAL_MASK_WAKEUP) != 0)
+                scheduleExecution(jobToWakeup, false);
         }
+
+        _messageBus.publish(null, AsyncJob.Topics.JOB_STATE, PublishScope.GLOBAL, jobId);
     }
 
     @Override
     @DB
-    public void updateAsyncJobStatus(long jobId, int processStatus, String resultObject) {
+    public void updateAsyncJobStatus(final long jobId, final int processStatus, final String resultObject) {
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Update async-job progress, job-" + jobId + ", processStatus: " + processStatus + ", result: " + resultObject);
         }
 
-        Transaction txt = Transaction.currentTxn();
-        try {
-            txt.start();
-            AsyncJobVO job = _jobDao.findById(jobId);
-            if (job == null) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("job-" + jobId + " no longer exists, we just log progress info here. progress status: " + processStatus);
-                }
-
-                txt.rollback();
-                return;
+        final AsyncJobVO job = _jobDao.findById(jobId);
+        if (job == null) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("job-" + jobId + " no longer exists, we just log progress info here. progress status: " + processStatus);
             }
 
-            job.setProcessStatus(processStatus);
-            if (resultObject != null) {
-                job.setResult(resultObject);
-            }
-            job.setLastUpdated(DateUtil.currentGMTTime());
-            _jobDao.update(jobId, job);
-            txt.commit();
-        } catch (Exception e) {
-            s_logger.error("Unexpected exception while updating async job-" + jobId + " status: ", e);
-            txt.rollback();
+            return;
         }
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                job.setProcessStatus(processStatus);
+                if (resultObject != null) {
+                    job.setResult(resultObject);
+                }
+                job.setLastUpdated(DateUtil.currentGMTTime());
+                _jobDao.update(jobId, job);
+            }
+        });
     }
 
     @Override
     @DB
-    public void updateAsyncJobAttachment(long jobId, String instanceType, Long instanceId) {
+    public void updateAsyncJobAttachment(final long jobId, final String instanceType, final Long instanceId) {
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Update async-job attachment, job-" + jobId + ", instanceType: " + instanceType + ", instanceId: " + instanceId);
         }
 
-        Transaction txt = Transaction.currentTxn();
-        try {
-            txt.start();
-
-            AsyncJobVO job = _jobDao.createForUpdate();
-            job.setInstanceType(instanceType);
-            job.setInstanceId(instanceId);
-            job.setLastUpdated(DateUtil.currentGMTTime());
-            _jobDao.update(jobId, job);
-
-            txt.commit();
-        } catch (Exception e) {
-            s_logger.error("Unexpected exception while updating async job-" + jobId + " attachment: ", e);
-            txt.rollback();
-        }
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                AsyncJobVO job = _jobDao.createForUpdate();
+                job.setInstanceType(instanceType);
+                job.setInstanceId(instanceId);
+                job.setLastUpdated(DateUtil.currentGMTTime());
+                _jobDao.update(jobId, job);
+            }
+        });
     }
 
     @Override
@@ -493,15 +486,12 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
         return new ManagedContextRunnable() {
             @Override
             protected void runInContext() {
-                Transaction txn = null;
                 long runNumber = getJobRunNumber();
 
                 try {
                     //
                     // setup execution environment
                     //
-                    txn = Transaction.open(Transaction.CLOUD_DB);
-
                     try {
                         JmxUtil.registerMBean("AsyncJobManager", "Active Job " + job.getId(), new AsyncJobMBeanImpl(job));
                     } catch (Exception e) {
@@ -564,9 +554,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
                                 s_logger.trace("Unable to unregister job " + job.getId() + " to JMX monitoring due to exception " + ExceptionUtil.toString(e));
                         }
 
-                        if (txn != null)
-                            txn.close();
-
                         //
                         // clean execution environment
                         //
@@ -690,7 +677,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
         return new ManagedContextRunnable() {
             @Override
             protected void runInContext() {
-                Transaction txn = Transaction.open("AsyncJobManagerImpl.getHeartbeatTask");
                 try {
                     List<SyncQueueItemVO> l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE);
                     if (l != null && l.size() > 0) {
@@ -711,12 +697,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
                     }
                 } catch (Throwable e) {
                     s_logger.error("Unexpected exception when trying to execute queue item, ", e);
-                } finally {
-                    try {
-                        txn.close();
-                    } catch (Throwable e) {
-                        s_logger.error("Unexpected exception", e);
-                    }
                 }
             }
         };
@@ -785,13 +765,15 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
     }
 
     @DB
-    protected void expungeAsyncJob(AsyncJobVO job) {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        _jobDao.expunge(job.getId());
-        //purge corresponding sync queue item
-        _queueMgr.purgeAsyncJobQueueItemId(job.getId());
-        txn.commit();
+    protected void expungeAsyncJob(final AsyncJobVO job) {
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                _jobDao.expunge(job.getId());
+                //purge corresponding sync queue item
+                _queueMgr.purgeAsyncJobQueueItemId(job.getId());
+            }
+        });
     }
 
     private long getMsid() {
@@ -825,58 +807,60 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
             Collections.sort(result);
             Long[] ids = result.toArray(new Long[result.size()]);
 
-            SearchCriteria<AsyncJobVO> jobsSC = JobIdsSearch.create("ids", ids);
-            SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
+            final SearchCriteria<AsyncJobVO> jobsSC = JobIdsSearch.create("ids", ids);
+            final SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
 
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            AsyncJobVO job = _jobDao.createForUpdate();
-            job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
-            _jobDao.update(job, jobsSC);
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    AsyncJobVO job = _jobDao.createForUpdate();
+                    job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
+                    _jobDao.update(job, jobsSC);
 
-            SyncQueueItemVO item = _queueItemDao.createForUpdate();
-            item.setLastProcessNumber(null);
-            item.setLastProcessMsid(null);
-            _queueItemDao.update(item, queueItemsSC);
-            txn.commit();
+                    SyncQueueItemVO item = _queueItemDao.createForUpdate();
+                    item.setLastProcessNumber(null);
+                    item.setLastProcessMsid(null);
+                    _queueItemDao.update(item, queueItemsSC);
+                }
+            });
         }
         return _joinMapDao.findJobsToWake(joinedJobId);
     }
 
     @DB
     protected List<Long> wakeupScan() {
-        Date cutDate = DateUtil.currentGMTTime();
-        Transaction txn = Transaction.currentTxn();
+        final Date cutDate = DateUtil.currentGMTTime();
 
         SearchCriteria<Long> sc = JoinJobTimeSearch.create();
         sc.setParameters("beginTime", cutDate);
         sc.setParameters("endTime", cutDate);
 
-        List<Long> result = _joinMapDao.customSearch(sc, null);
-
-        txn.start();
-        if (result.size() > 0) {
-            Collections.sort(result);
-            Long[] ids = result.toArray(new Long[result.size()]);
+        final List<Long> result = _joinMapDao.customSearch(sc, null);
 
-            AsyncJobVO job = _jobDao.createForUpdate();
-            job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
+        return Transaction.execute(new TransactionCallback<List<Long>>() {
+            @Override
+            public List<Long> doInTransaction(TransactionStatus status) {
+                if (result.size() > 0) {
+                    Collections.sort(result);
+                    Long[] ids = result.toArray(new Long[result.size()]);
 
-            SearchCriteria<AsyncJobVO> sc2 = JobIdsSearch.create("ids", ids);
-            SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
+                    AsyncJobVO job = _jobDao.createForUpdate();
+                    job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
 
-            _jobDao.update(job, sc2);
+                    SearchCriteria<AsyncJobVO> sc2 = JobIdsSearch.create("ids", ids);
+                    SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
 
-            SyncQueueItemVO item = _queueItemDao.createForUpdate();
-            item.setLastProcessNumber(null);
-            item.setLastProcessMsid(null);
-            _queueItemDao.update(item, queueItemsSC);
-        }
+                    _jobDao.update(job, sc2);
 
-        List<Long> wakupIds = _joinMapDao.findJobsToWakeBetween(cutDate);
-        txn.commit();
+                    SyncQueueItemVO item = _queueItemDao.createForUpdate();
+                    item.setLastProcessNumber(null);
+                    item.setLastProcessMsid(null);
+                    _queueItemDao.update(item, queueItemsSC);
+                }
 
-        return wakupIds;
+                return _joinMapDao.findJobsToWakeBetween(cutDate);
+            }
+        });
     }
 
     @Override
@@ -933,18 +917,18 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
 
     @Override
     public void onManagementNodeLeft(List<? extends ManagementServerHost> nodeList, long selfNodeId) {
-        for (ManagementServerHost msHost : nodeList) {
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        for (final ManagementServerHost msHost : nodeList) {
             try {
-                txn.start();
-                List<SyncQueueItemVO> items = _queueMgr.getActiveQueueItems(msHost.getId(), true);
-                cleanupPendingJobs(items);
-                _jobDao.resetJobProcess(msHost.getId(), ApiErrorCode.INTERNAL_ERROR.getHttpCode(), "job cancelled because of management server restart");
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        List<SyncQueueItemVO> items = _queueMgr.getActiveQueueItems(msHost.getId(), true);
+                        cleanupPendingJobs(items);
+                        _jobDao.resetJobProcess(msHost.getId(), ApiErrorCode.INTERNAL_ERROR.getHttpCode(), "job cancelled because of management server restart");
+                    }
+                });
             } catch (Throwable e) {
                 s_logger.warn("Unexpected exception ", e);
-            } finally {
-                txn.close();
             }
         }
     }


[13/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
index b9b5d6b..7fb0245 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
@@ -21,8 +21,8 @@ import java.util.Date;
 import java.util.List;
 
 import javax.inject.Inject;
-import org.apache.log4j.Logger;
 
+import org.apache.log4j.Logger;
 import org.apache.cloudstack.framework.jobs.dao.SyncQueueDao;
 import org.apache.cloudstack.framework.jobs.dao.SyncQueueItemDao;
 
@@ -30,6 +30,9 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManager {
@@ -40,84 +43,83 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
 
     @Override
     @DB
-    public SyncQueueVO queue(String syncObjType, long syncObjId, String itemType, long itemId, long queueSizeLimit) {
-        Transaction txn = Transaction.currentTxn();
+    public SyncQueueVO queue(final String syncObjType, final long syncObjId, final String itemType, final long itemId, final long queueSizeLimit) {
         try {
-            txn.start();
-
-            _syncQueueDao.ensureQueue(syncObjType, syncObjId);
-            SyncQueueVO queueVO = _syncQueueDao.find(syncObjType, syncObjId);
-            if(queueVO == null)
-                throw new CloudRuntimeException("Unable to queue item into DB, DB is full?");
-
-            queueVO.setQueueSizeLimit(queueSizeLimit);
-            _syncQueueDao.update(queueVO.getId(), queueVO);
-
-            Date dt = DateUtil.currentGMTTime();
-            SyncQueueItemVO item = new SyncQueueItemVO();
-            item.setQueueId(queueVO.getId());
-            item.setContentType(itemType);
-            item.setContentId(itemId);
-            item.setCreated(dt);
-
-            _syncQueueItemDao.persist(item);
-            txn.commit();
+            return Transaction.execute(new TransactionCallback<SyncQueueVO>() {
+                @Override
+                public SyncQueueVO doInTransaction(TransactionStatus status) {
+                    _syncQueueDao.ensureQueue(syncObjType, syncObjId);
+                    SyncQueueVO queueVO = _syncQueueDao.find(syncObjType, syncObjId);
+                    if(queueVO == null)
+                        throw new CloudRuntimeException("Unable to queue item into DB, DB is full?");
+
+                    queueVO.setQueueSizeLimit(queueSizeLimit);
+                    _syncQueueDao.update(queueVO.getId(), queueVO);
 
-            return queueVO;
+                    Date dt = DateUtil.currentGMTTime();
+                    SyncQueueItemVO item = new SyncQueueItemVO();
+                    item.setQueueId(queueVO.getId());
+                    item.setContentType(itemType);
+                    item.setContentId(itemId);
+                    item.setCreated(dt);
+
+                    _syncQueueItemDao.persist(item);
+                    return queueVO;
+                }
+            });
         } catch(Exception e) {
             s_logger.error("Unexpected exception: ", e);
-            txn.rollback();
         }
         return null;
     }
 
     @Override
     @DB
-    public SyncQueueItemVO dequeueFromOne(long queueId, Long msid) {
-        Transaction txt = Transaction.currentTxn();
+    public SyncQueueItemVO dequeueFromOne(final long queueId, final Long msid) {
         try {
-            txt.start();
-
-            SyncQueueVO queueVO = _syncQueueDao.lockRow(queueId, true);
-            if(queueVO == null) {
-                s_logger.error("Sync queue(id: " + queueId + ") does not exist");
-                txt.commit();
-                return null;
-            }
-
-            if(queueReadyToProcess(queueVO)) {
-                SyncQueueItemVO itemVO = _syncQueueItemDao.getNextQueueItem(queueVO.getId());
-                if(itemVO != null) {
-                    Long processNumber = queueVO.getLastProcessNumber();
-                    if(processNumber == null)
-                        processNumber = new Long(1);
-                    else
-                        processNumber = processNumber + 1;
-                    Date dt = DateUtil.currentGMTTime();
-                    queueVO.setLastProcessNumber(processNumber);
-                    queueVO.setLastUpdated(dt);
-                    queueVO.setQueueSize(queueVO.getQueueSize() + 1);
-                    _syncQueueDao.update(queueVO.getId(), queueVO);
+            return Transaction.execute(new TransactionCallback<SyncQueueItemVO>() {
+                @Override
+                public SyncQueueItemVO doInTransaction(TransactionStatus status) {
+                    SyncQueueVO queueVO = _syncQueueDao.lockRow(queueId, true);
+                    if(queueVO == null) {
+                        s_logger.error("Sync queue(id: " + queueId + ") does not exist");
+                        return null;
+                    }
 
-                    itemVO.setLastProcessMsid(msid);
-                    itemVO.setLastProcessNumber(processNumber);
-                    itemVO.setLastProcessTime(dt);
-                    _syncQueueItemDao.update(itemVO.getId(), itemVO);
+                    if(queueReadyToProcess(queueVO)) {
+                        SyncQueueItemVO itemVO = _syncQueueItemDao.getNextQueueItem(queueVO.getId());
+                        if(itemVO != null) {
+                            Long processNumber = queueVO.getLastProcessNumber();
+                            if(processNumber == null)
+                                processNumber = new Long(1);
+                            else
+                                processNumber = processNumber + 1;
+                            Date dt = DateUtil.currentGMTTime();
+                            queueVO.setLastProcessNumber(processNumber);
+                            queueVO.setLastUpdated(dt);
+                            queueVO.setQueueSize(queueVO.getQueueSize() + 1);
+                            _syncQueueDao.update(queueVO.getId(), queueVO);
+
+                            itemVO.setLastProcessMsid(msid);
+                            itemVO.setLastProcessNumber(processNumber);
+                            itemVO.setLastProcessTime(dt);
+                            _syncQueueItemDao.update(itemVO.getId(), itemVO);
+
+                            return itemVO;
+                        } else {
+                            if(s_logger.isDebugEnabled())
+                                s_logger.debug("Sync queue (" + queueId + ") is currently empty");
+                        }
+                    } else {
+                        if(s_logger.isDebugEnabled())
+                            s_logger.debug("There is a pending process in sync queue(id: " + queueId + ")");
+                    }
 
-                    txt.commit();
-                    return itemVO;
-                } else {
-                    if(s_logger.isDebugEnabled())
-                        s_logger.debug("Sync queue (" + queueId + ") is currently empty");
+                    return null;
                 }
-            } else {
-                if(s_logger.isDebugEnabled())
-                    s_logger.debug("There is a pending process in sync queue(id: " + queueId + ")");
-            }
-            txt.commit();
+            });
         } catch(Exception e) {
             s_logger.error("Unexpected exception: ", e);
-            txt.rollback();
         }
 
         return null;
@@ -125,101 +127,104 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
 
     @Override
     @DB
-    public List<SyncQueueItemVO> dequeueFromAny(Long msid, int maxItems) {
-
-        List<SyncQueueItemVO> resultList = new ArrayList<SyncQueueItemVO>();
-        Transaction txt = Transaction.currentTxn();
-        try {
-            txt.start();
+    public List<SyncQueueItemVO> dequeueFromAny(final Long msid, final int maxItems) {
 
-            List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
-            if(l != null && l.size() > 0) {
-                for(SyncQueueItemVO item : l) {
-                    SyncQueueVO queueVO = _syncQueueDao.lockRow(item.getQueueId(), true);
-                    SyncQueueItemVO itemVO = _syncQueueItemDao.lockRow(item.getId(), true);
-                    if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
-                        Long processNumber = queueVO.getLastProcessNumber();
-                        if(processNumber == null)
-                            processNumber = new Long(1);
-                        else
-                            processNumber = processNumber + 1;
+        final List<SyncQueueItemVO> resultList = new ArrayList<SyncQueueItemVO>();
 
-                        Date dt = DateUtil.currentGMTTime();
-                        queueVO.setLastProcessNumber(processNumber);
-                        queueVO.setLastUpdated(dt);
-                        queueVO.setQueueSize(queueVO.getQueueSize() + 1);
-                        _syncQueueDao.update(queueVO.getId(), queueVO);
-
-                        itemVO.setLastProcessMsid(msid);
-                        itemVO.setLastProcessNumber(processNumber);
-                        itemVO.setLastProcessTime(dt);
-                        _syncQueueItemDao.update(item.getId(), itemVO);
-
-                        resultList.add(item);
+        try {
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
+                    if(l != null && l.size() > 0) {
+                        for(SyncQueueItemVO item : l) {
+                            SyncQueueVO queueVO = _syncQueueDao.lockRow(item.getQueueId(), true);
+                            SyncQueueItemVO itemVO = _syncQueueItemDao.lockRow(item.getId(), true);
+                            if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
+                                Long processNumber = queueVO.getLastProcessNumber();
+                                if(processNumber == null)
+                                    processNumber = new Long(1);
+                                else
+                                    processNumber = processNumber + 1;
+        
+                                Date dt = DateUtil.currentGMTTime();
+                                queueVO.setLastProcessNumber(processNumber);
+                                queueVO.setLastUpdated(dt);
+                                queueVO.setQueueSize(queueVO.getQueueSize() + 1);
+                                _syncQueueDao.update(queueVO.getId(), queueVO);
+        
+                                itemVO.setLastProcessMsid(msid);
+                                itemVO.setLastProcessNumber(processNumber);
+                                itemVO.setLastProcessTime(dt);
+                                _syncQueueItemDao.update(item.getId(), itemVO);
+        
+                                resultList.add(item);
+                            }
+                        }
                     }
                 }
-            }
-            txt.commit();
+            });
+
             return resultList;
         } catch(Exception e) {
             s_logger.error("Unexpected exception: ", e);
-            txt.rollback();
         }
+
         return null;
     }
 
     @Override
     @DB
-    public void purgeItem(long queueItemId) {
-        Transaction txt = Transaction.currentTxn();
+    public void purgeItem(final long queueItemId) {
         try {
-            txt.start();
-
-            SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
-            if(itemVO != null) {
-                SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
-
-                _syncQueueItemDao.expunge(itemVO.getId());
-
-                // if item is active, reset queue information
-                if (itemVO.getLastProcessMsid() != null) {
-                    queueVO.setLastUpdated(DateUtil.currentGMTTime());
-                    // decrement the count
-                    assert (queueVO.getQueueSize() > 0) : "Count reduce happens when it's already <= 0!";
-                    queueVO.setQueueSize(queueVO.getQueueSize() - 1);
-                    _syncQueueDao.update(queueVO.getId(), queueVO);
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
+                    if(itemVO != null) {
+                        SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
+        
+                        _syncQueueItemDao.expunge(itemVO.getId());
+        
+                        // if item is active, reset queue information
+                        if (itemVO.getLastProcessMsid() != null) {
+                            queueVO.setLastUpdated(DateUtil.currentGMTTime());
+                            // decrement the count
+                            assert (queueVO.getQueueSize() > 0) : "Count reduce happens when it's already <= 0!";
+                            queueVO.setQueueSize(queueVO.getQueueSize() - 1);
+                            _syncQueueDao.update(queueVO.getId(), queueVO);
+                        }
+                    }
                 }
-            }
-            txt.commit();
+            });
         } catch(Exception e) {
             s_logger.error("Unexpected exception: ", e);
-            txt.rollback();
         }
     }
 
     @Override
     @DB
-    public void returnItem(long queueItemId) {
-        Transaction txt = Transaction.currentTxn();
+    public void returnItem(final long queueItemId) {
         try {
-            txt.start();
-
-            SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
-            if(itemVO != null) {
-                SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
-
-                itemVO.setLastProcessMsid(null);
-                itemVO.setLastProcessNumber(null);
-                itemVO.setLastProcessTime(null);
-                _syncQueueItemDao.update(queueItemId, itemVO);
-
-                queueVO.setLastUpdated(DateUtil.currentGMTTime());
-                _syncQueueDao.update(queueVO.getId(), queueVO);
-            }
-            txt.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
+                    if(itemVO != null) {
+                        SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
+
+                        itemVO.setLastProcessMsid(null);
+                        itemVO.setLastProcessNumber(null);
+                        itemVO.setLastProcessTime(null);
+                        _syncQueueItemDao.update(queueItemId, itemVO);
+
+                        queueVO.setLastUpdated(DateUtil.currentGMTTime());
+                        _syncQueueDao.update(queueVO.getId(), queueVO);
+                    }
+                }
+            });
         } catch(Exception e) {
             s_logger.error("Unexpected exception: ", e);
-            txt.rollback();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
index da23172..cc1d3f3 100644
--- a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
+++ b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
@@ -24,7 +24,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 
@@ -48,6 +47,8 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
@@ -410,7 +411,7 @@ public class ExplicitDedicationProcessor extends AffinityProcessorBase implement
 
     @DB
     @Override
-    public void handleDeleteGroup(AffinityGroup group) {
+    public void handleDeleteGroup(final AffinityGroup group) {
         // When a group of the 'ExplicitDedication' type gets deleted, make sure
         // to remove the dedicated resources in the group as well.
         if (group != null) {
@@ -419,20 +420,21 @@ public class ExplicitDedicationProcessor extends AffinityProcessorBase implement
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("Releasing the dedicated resources under group: " + group);
                 }
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-
-                SearchBuilder<DedicatedResourceVO> listByAffinityGroup = _dedicatedDao.createSearchBuilder();
-                listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
-                        SearchCriteria.Op.EQ);
-                listByAffinityGroup.done();
-                SearchCriteria<DedicatedResourceVO> sc = listByAffinityGroup.create();
-                sc.setParameters("affinityGroupId", group.getId());
 
-                _dedicatedDao.lockRows(sc, null, true);
-                _dedicatedDao.remove(sc);
-
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        SearchBuilder<DedicatedResourceVO> listByAffinityGroup = _dedicatedDao.createSearchBuilder();
+                        listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
+                                SearchCriteria.Op.EQ);
+                        listByAffinityGroup.done();
+                        SearchCriteria<DedicatedResourceVO> sc = listByAffinityGroup.create();
+                        sc.setParameters("affinityGroupId", group.getId());
+        
+                        _dedicatedDao.lockRows(sc, null, true);
+                        _dedicatedDao.remove(sc);
+                    }
+                });
             } else {
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("No dedicated resources to releease under group: " + group);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java b/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
index 6a6b47c..cda46ef 100755
--- a/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
+++ b/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
@@ -48,7 +48,6 @@ import org.apache.cloudstack.api.response.DedicatePodResponse;
 import org.apache.cloudstack.api.response.DedicateZoneResponse;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -79,6 +78,9 @@ import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.dao.UserVmDao;
@@ -113,7 +115,7 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Zone")
-    public List<DedicatedResourceVO> dedicateZone(Long zoneId, Long domainId, String accountName) {
+    public List<DedicatedResourceVO> dedicateZone(final Long zoneId, final Long domainId, final String accountName) {
         Long accountId = null;
         List<HostVO> hosts = null;
         if(accountName != null){
@@ -124,7 +126,7 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
         List<Long> childDomainIds = getDomainChildIds(domainId);
         childDomainIds.add(domainId);
         checkAccountAndDomain(accountId, domainId);
-        DataCenterVO dc = _zoneDao.findById(zoneId);
+        final DataCenterVO dc = _zoneDao.findById(zoneId);
         if (dc == null) {
             throw new InvalidParameterValueException("Unable to find zone by id " + zoneId);
         } else {
@@ -220,46 +222,50 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
 
         checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // find or create the affinity group by name under this account/domain
-        AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
-        if (group == null) {
-            s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
-            throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
-        }
+        final Long accountIdFinal = accountId;
+        return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+            @Override
+            public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+                // find or create the affinity group by name under this account/domain
+                AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+                if (group == null) {
+                    s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+                    throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+                }
 
-        DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zoneId, null, null, null, null, null,
-                group.getId());
-        try {
-            dedicatedResource.setDomainId(domainId);
-            if (accountId != null) {
-                dedicatedResource.setAccountId(accountId);
-            }
-            dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+                DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zoneId, null, null, null, null, null,
+                        group.getId());
+                try {
+                    dedicatedResource.setDomainId(domainId);
+                    if (accountIdFinal != null) {
+                        dedicatedResource.setAccountId(accountIdFinal);
+                    }
+                    dedicatedResource = _dedicatedDao.persist(dedicatedResource);
 
-            // save the domainId in the zone
-            dc.setDomainId(domainId);
-            if (!_zoneDao.update(zoneId, dc)) {
-                throw new CloudRuntimeException(
-                        "Failed to dedicate zone, could not set domainId. Please contact Cloud Support.");
-            }
+                    // save the domainId in the zone
+                    dc.setDomainId(domainId);
+                    if (!_zoneDao.update(zoneId, dc)) {
+                        throw new CloudRuntimeException(
+                                "Failed to dedicate zone, could not set domainId. Please contact Cloud Support.");
+                    }
 
-        } catch (Exception e) {
-            s_logger.error("Unable to dedicate zone due to " + e.getMessage(), e);
-            throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
-        }
-        txn.commit();
+                } catch (Exception e) {
+                    s_logger.error("Unable to dedicate zone due to " + e.getMessage(), e);
+                    throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+                }
+
+                List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+                result.add(dedicatedResource);
+                return result;
 
-        List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
-        result.add(dedicatedResource);
-        return result;
+            }
+        });
     }
 
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Pod")
-    public List<DedicatedResourceVO> dedicatePod(Long podId, Long domainId, String accountName) {
+    public List<DedicatedResourceVO> dedicatePod(final Long podId, final Long domainId, final String accountName) {
         Long accountId = null;
         if(accountName != null){
             Account caller = CallContext.current().getCallingAccount();
@@ -353,37 +359,40 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
 
         checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // find or create the affinity group by name under this account/domain
-        AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
-        if (group == null) {
-            s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
-            throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
-        }
-        DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, podId, null, null, null, null,
-                group.getId());
-        try {
-            dedicatedResource.setDomainId(domainId);
-            if (accountId != null) {
-                dedicatedResource.setAccountId(accountId);
-            }
-            dedicatedResource = _dedicatedDao.persist(dedicatedResource);
-        } catch (Exception e) {
-            s_logger.error("Unable to dedicate pod due to " + e.getMessage(), e);
-            throw new CloudRuntimeException("Failed to dedicate pod. Please contact Cloud Support.");
-        }
-        txn.commit();
+        final Long accountIdFinal = accountId;
+        return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+            @Override
+            public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+                // find or create the affinity group by name under this account/domain
+                AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+                if (group == null) {
+                    s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+                    throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+                }
+                DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, podId, null, null, null, null,
+                        group.getId());
+                try {
+                    dedicatedResource.setDomainId(domainId);
+                    if (accountIdFinal != null) {
+                        dedicatedResource.setAccountId(accountIdFinal);
+                    }
+                    dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+                } catch (Exception e) {
+                    s_logger.error("Unable to dedicate pod due to " + e.getMessage(), e);
+                    throw new CloudRuntimeException("Failed to dedicate pod. Please contact Cloud Support.");
+                }
 
-        List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
-        result.add(dedicatedResource);
-        return result;
+                List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+                result.add(dedicatedResource);
+                return result;
+            }
+        });
     }
 
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Cluster")
-    public List<DedicatedResourceVO> dedicateCluster(Long clusterId, Long domainId, String accountName) {
+    public List<DedicatedResourceVO> dedicateCluster(final Long clusterId, final Long domainId, final String accountName) {
         Long accountId = null;
         List<HostVO> hosts = null;
         if(accountName != null){
@@ -463,37 +472,40 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
 
         checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // find or create the affinity group by name under this account/domain
-        AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
-        if (group == null) {
-            s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
-            throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
-        }
-        DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, clusterId, null, null, null,
-                group.getId());
-        try {
-            dedicatedResource.setDomainId(domainId);
-            if (accountId != null) {
-                dedicatedResource.setAccountId(accountId);
-            }
-            dedicatedResource = _dedicatedDao.persist(dedicatedResource);
-        } catch (Exception e) {
-            s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
-            throw new CloudRuntimeException("Failed to dedicate cluster. Please contact Cloud Support.");
-        }
-        txn.commit();
+        final Long accountIdFinal = accountId;
+        return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+            @Override
+            public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+                // find or create the affinity group by name under this account/domain
+                AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+                if (group == null) {
+                    s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+                    throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+                }
+                DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, clusterId, null, null, null,
+                        group.getId());
+                try {
+                    dedicatedResource.setDomainId(domainId);
+                    if (accountIdFinal != null) {
+                        dedicatedResource.setAccountId(accountIdFinal);
+                    }
+                    dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+                } catch (Exception e) {
+                    s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
+                    throw new CloudRuntimeException("Failed to dedicate cluster. Please contact Cloud Support.");
+                }
 
-        List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
-        result.add(dedicatedResource);
-        return result;
+                List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+                result.add(dedicatedResource);
+                return result;
+            }
+        });
     }
 
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Host")
-    public List<DedicatedResourceVO> dedicateHost(Long hostId, Long domainId, String accountName) {
+    public List<DedicatedResourceVO> dedicateHost(final Long hostId, final Long domainId, final String accountName) {
         Long accountId = null;
         if(accountName != null){
             Account caller = CallContext.current().getCallingAccount();
@@ -558,31 +570,35 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
         childDomainIds.add(domainId);
         checkHostSuitabilityForExplicitDedication(accountId, childDomainIds, hostId);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // find or create the affinity group by name under this account/domain
-        AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
-        if (group == null) {
-            s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
-            throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
-        }
-        DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, null, hostId, null, null,
-                group.getId());
-        try {
-            dedicatedResource.setDomainId(domainId);
-            if (accountId != null) {
-                dedicatedResource.setAccountId(accountId);
-            }
-            dedicatedResource = _dedicatedDao.persist(dedicatedResource);
-        } catch (Exception e) {
-            s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
-            throw new CloudRuntimeException("Failed to dedicate host. Please contact Cloud Support.");
-        }
-        txn.commit();
+        final Long accountIdFinal = accountId;
+        return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+            @Override
+            public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+                // find or create the affinity group by name under this account/domain
+                AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+                if (group == null) {
+                    s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+                    throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+                }
+                DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, null, hostId, null, null,
+                        group.getId());
+                try {
+                    dedicatedResource.setDomainId(domainId);
+                    if (accountIdFinal != null) {
+                        dedicatedResource.setAccountId(accountIdFinal);
+                    }
+                    dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+                } catch (Exception e) {
+                    s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
+                    throw new CloudRuntimeException("Failed to dedicate host. Please contact Cloud Support.");
+                }
+
+                List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+                result.add(dedicatedResource);
+                return result;
+            }
+        });
 
-        List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
-        result.add(dedicatedResource);
-        return result;
     }
 
     private AffinityGroup findOrCreateDedicatedAffinityGroup(Long domainId, Long accountId) {
@@ -889,9 +905,8 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE_RELEASE, eventDescription = "Releasing dedicated resource")
-    public boolean releaseDedicatedResource(Long zoneId, Long podId, Long clusterId, Long hostId) throws InvalidParameterValueException{
+    public boolean releaseDedicatedResource(final Long zoneId, Long podId, Long clusterId, Long hostId) throws InvalidParameterValueException{
         DedicatedResourceVO resource = null;
-        Long resourceId = null;
         if (zoneId != null) {
             resource = _dedicatedDao.findByZoneId(zoneId);
         }
@@ -907,26 +922,28 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
         if (resource == null){
             throw new InvalidParameterValueException("No Dedicated Resource available to release");
         } else {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            resourceId = resource.getId();
-            if (!_dedicatedDao.remove(resourceId)) {
-                throw new CloudRuntimeException("Failed to delete Resource " + resourceId);
-            }
-            if (zoneId != null) {
-                // remove the domainId set in zone
-                DataCenterVO dc = _zoneDao.findById(zoneId);
-                if (dc != null) {
-                    dc.setDomainId(null);
-                    dc.setDomain(null);
-                    if (!_zoneDao.update(zoneId, dc)) {
-                        throw new CloudRuntimeException(
-                                "Failed to release dedicated zone, could not clear domainId. Please contact Cloud Support.");
+            final DedicatedResourceVO resourceFinal = resource; 
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    Long resourceId = resourceFinal.getId();
+                    if (!_dedicatedDao.remove(resourceId)) {
+                        throw new CloudRuntimeException("Failed to delete Resource " + resourceId);
+                    }
+                    if (zoneId != null) {
+                        // remove the domainId set in zone
+                        DataCenterVO dc = _zoneDao.findById(zoneId);
+                        if (dc != null) {
+                            dc.setDomainId(null);
+                            dc.setDomain(null);
+                            if (!_zoneDao.update(zoneId, dc)) {
+                                throw new CloudRuntimeException(
+                                        "Failed to release dedicated zone, could not clear domainId. Please contact Cloud Support.");
+                            }
+                        }
                     }
                 }
-            }
-
-            txn.commit();
+            });
 
             // find the group associated and check if there are any more
             // resources under that group

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
index 314c957..4c07dae 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
@@ -255,15 +255,12 @@ public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements
         }
         
         BaremetalPxeVO vo = new BaremetalPxeVO();
-        Transaction txn = Transaction.currentTxn();
         vo.setHostId(pxeServer.getId());
         vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
         vo.setPodId(pod.getId());
         vo.setPhysicalNetworkId(pcmd.getPhysicalNetworkId());
         vo.setDeviceType(BaremetalPxeType.PING.toString());
-        txn.start();
         _pxeDao.persist(vo);
-        txn.commit();
         return vo;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
index 7871377..29e180d 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
@@ -22,7 +22,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 
@@ -53,6 +52,8 @@ import com.cloud.network.guru.DirectPodBasedNetworkGuru;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachineProfile;
@@ -100,18 +101,18 @@ public class BaremetaNetworkGuru extends DirectPodBasedNetworkGuru {
         } else {
             // we need to get a new ip address if we try to deploy a vm in a
             // different pod
-            IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
+            final IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
             if (ipVO != null) {
                 PodVlanMapVO mapVO = _podVlanDao.listPodVlanMapsByVlan(ipVO.getVlanId());
                 if (mapVO.getPodId() != dest.getPod().getId()) {
-                    Transaction txn = Transaction.currentTxn();
-                    txn.start();
-
-                    // release the old ip here
-                    _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
-                    _ipAddressDao.unassignIpAddress(ipVO.getId());
-
-                    txn.commit();
+                    Transaction.execute(new TransactionCallbackNoReturn() {
+                        @Override
+                        public void doInTransactionWithoutResult(TransactionStatus status) {
+                            // release the old ip here
+                            _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
+                            _ipAddressDao.unassignIpAddress(ipVO.getId());
+                        }
+                    });
 
                     nic.setIp4Address(null);
                     getNewIp = true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
index 6cf94f2..8057cd4 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
@@ -50,7 +50,6 @@ import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
@@ -115,14 +114,11 @@ public class BaremetalDhcpElement extends AdapterBase implements DhcpServiceProv
             return false;
         }
         
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
         nic.setMacAddress(host.getPrivateMacAddress());
         NicVO vo = _nicDao.findById(nic.getId());
         assert vo != null : "Where ths nic " + nic.getId() + " going???";
         vo.setMacAddress(nic.getMacAddress());
         _nicDao.update(vo.getId(), vo);
-        txn.commit();
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
index 9e1fd65..82397f5 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
@@ -69,7 +69,6 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
@@ -278,10 +277,7 @@ public class BaremetalDhcpManagerImpl extends ManagerBase implements BaremetalDh
         vo.setHostId(dhcpServer.getId());
         vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
         vo.setPhysicalNetworkId(cmd.getPhysicalNetworkId());
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
         _extDhcpDao.persist(vo);
-        txn.commit();
         return vo;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
index aa0ff1c..cb4babf 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
@@ -27,11 +27,10 @@ import java.util.Map;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.AddBaremetalKickStartPxeCmd;
 import org.apache.cloudstack.api.AddBaremetalPxeCmd;
 import org.apache.cloudstack.api.ListBaremetalPxeServersCmd;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.baremetal.IpmISetBootDevCommand;
@@ -58,7 +57,6 @@ import com.cloud.uservm.UserVm;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
@@ -225,14 +223,11 @@ public class BaremetalKickStartServiceImpl extends BareMetalPxeServiceBase imple
         }
 
         BaremetalPxeVO vo = new BaremetalPxeVO();
-        Transaction txn = Transaction.currentTxn();
         vo.setHostId(pxeServer.getId());
         vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
         vo.setPhysicalNetworkId(kcmd.getPhysicalNetworkId());
         vo.setDeviceType(BaremetalPxeType.KICK_START.toString());
-        txn.start();
         _pxeDao.persist(vo);
-        txn.commit();
         return vo;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
index 244ce8c..b9dbc77 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
@@ -48,7 +48,6 @@ import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
@@ -117,14 +116,11 @@ public class BaremetalPxeElement extends AdapterBase implements NetworkElement {
         
         VMInstanceVO vo = _vmDao.findById(vm.getId());
         if (vo.getLastHostId() == null) {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
             nic.setMacAddress(dest.getHost().getPrivateMacAddress());
             NicVO nicVo = _nicDao.findById(nic.getId());
             assert vo != null : "Where ths nic " + nic.getId() + " going???";
             nicVo.setMacAddress(nic.getMacAddress());
             _nicDao.update(nicVo.getId(), nicVo);
-            txn.commit();
             
         	/*This vm is just being created */
         	if (!_pxeMgr.prepare(vm, nic, dest, context)) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
index 9dfe91d..4239482 100755
--- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
+++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
@@ -226,10 +226,7 @@ public class UcsManagerImpl implements UcsManager {
             vo.setZoneId(cmd.getZoneId());
             vo.setName(cmd.getName());
 
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
             mgrvo = ucsDao.persist(vo);
-            txn.commit();
             UcsManagerResponse rsp = new UcsManagerResponse();
             rsp.setId(String.valueOf(vo.getId()));
             rsp.setName(vo.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
index 3f8fc5c..cf4c2f0 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
@@ -123,6 +123,10 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.vm.DomainRouterVO;
@@ -582,19 +586,21 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast
     }
     
     @DB
-    public PublicIp allocDirectIp(Account account, long guestNetworkId) throws InsufficientAddressCapacityException {
-        Network frontEndNetwork = _networkModel.getNetwork(guestNetworkId);
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        PublicIp ip = _ipAddrMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true);
-        IPAddressVO ipvo = _ipAddressDao.findById(ip.getId());
-        ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId());
-        _ipAddressDao.update(ipvo.getId(), ipvo);
-        txn.commit();
-        s_logger.info("Acquired frontend IP for ELB " + ip);
-
-        return ip;
+    public PublicIp allocDirectIp(final Account account, final long guestNetworkId) throws InsufficientAddressCapacityException {
+        return Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+            @Override
+            public PublicIp doInTransaction(TransactionStatus status) throws Exception {
+                Network frontEndNetwork = _networkModel.getNetwork(guestNetworkId);
+
+                PublicIp ip = _ipAddrMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true);
+                IPAddressVO ipvo = _ipAddressDao.findById(ip.getId());
+                ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId());
+                _ipAddressDao.update(ipvo.getId(), ipvo);
+                s_logger.info("Acquired frontend IP for ELB " + ip);
+
+                return ip;
+            }
+        }, InsufficientAddressCapacityException.class);
     }
     
     public void releaseIp(long ipId, long userId, Account caller) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
index 902f595..233b046 100644
--- a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
+++ b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
@@ -18,11 +18,11 @@ package org.apache.cloudstack.storage.test;
 
 import org.aspectj.lang.ProceedingJoinPoint;
 
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class AopTestAdvice {
     public Object AopTestMethod(ProceedingJoinPoint call) throws Throwable {
-        Transaction txn = Transaction.open(call.getSignature().getName());
+        TransactionLegacy txn = TransactionLegacy.open(call.getSignature().getName());
         Object ret = null;
         try {
             ret = call.proceed();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index b73045d..329b3d5 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -44,7 +44,6 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.PostConstruct;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 import javax.inject.Inject;
@@ -52,37 +51,6 @@ import javax.naming.ConfigurationException;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
-import org.apache.commons.codec.binary.Base64;
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpServerConnection;
-import org.apache.http.HttpStatus;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.impl.DefaultHttpServerConnection;
-import org.apache.http.impl.NoConnectionReuseStrategy;
-import org.apache.http.impl.SocketHttpServerConnection;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.CoreConnectionPNames;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.HttpRequestHandlerRegistry;
-import org.apache.http.protocol.HttpService;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
-import org.apache.http.protocol.ResponseDate;
-import org.apache.http.protocol.ResponseServer;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.acl.APIChecker;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiErrorCode;
@@ -120,6 +88,36 @@ import org.apache.cloudstack.framework.jobs.AsyncJob;
 import org.apache.cloudstack.framework.jobs.AsyncJobManager;
 import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.ConnectionClosedException;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpServerConnection;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.impl.DefaultHttpResponseFactory;
+import org.apache.http.impl.DefaultHttpServerConnection;
+import org.apache.http.impl.NoConnectionReuseStrategy;
+import org.apache.http.impl.SocketHttpServerConnection;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.BasicHttpProcessor;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestHandler;
+import org.apache.http.protocol.HttpRequestHandlerRegistry;
+import org.apache.http.protocol.HttpService;
+import org.apache.http.protocol.ResponseConnControl;
+import org.apache.http.protocol.ResponseContent;
+import org.apache.http.protocol.ResponseDate;
+import org.apache.http.protocol.ResponseServer;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.api.response.ApiResponseSerializer;
 import com.cloud.configuration.Config;
@@ -149,7 +147,6 @@ import com.cloud.utils.component.PluggableService;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExceptionProxyObject;
 
@@ -708,8 +705,6 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
                 }
             }
 
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
-            txn.close();
             User user = null;
             // verify there is a user with this api key
             Pair<User, Account> userAcctPair = _accountMgr.findUserByApiKey(apiKey);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/capacity/CapacityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java
index b28fe20..72905a7 100755
--- a/server/src/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java
@@ -28,7 +28,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
@@ -61,6 +60,7 @@ import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.offering.ServiceOffering;
+import com.cloud.org.Cluster;
 import com.cloud.org.Grouping.AllocationState;
 import com.cloud.resource.ResourceListener;
 import com.cloud.resource.ResourceManager;
@@ -81,6 +81,9 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.UserVmVO;
@@ -170,100 +173,104 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
 
     @DB
     @Override
-    public boolean releaseVmCapacity(VirtualMachine vm, boolean moveFromReserved, boolean moveToReservered, Long hostId) {
-        ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
+    public boolean releaseVmCapacity(VirtualMachine vm, final boolean moveFromReserved, final boolean moveToReservered, final Long hostId) {
+        final ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
         CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU);
         CapacityVO capacityMemory = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY);
         Long clusterId = null;
         if (hostId != null) {
-        HostVO host = _hostDao.findById(hostId);
+            HostVO host = _hostDao.findById(hostId);
             clusterId = host.getClusterId();
         }
         if (capacityCpu == null || capacityMemory == null || svo == null) {
             return false;
         }
 
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
-
-            capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
-            capacityMemory = _capacityDao.lockRow(capacityMemory.getId(), true);
-
-            long usedCpu = capacityCpu.getUsedCapacity();
-            long usedMem = capacityMemory.getUsedCapacity();
-            long reservedCpu = capacityCpu.getReservedCapacity();
-            long reservedMem = capacityMemory.getReservedCapacity();
-            long actualTotalCpu = capacityCpu.getTotalCapacity();
-            float cpuOvercommitRatio =Float.parseFloat(_clusterDetailsDao.findDetail(clusterId,"cpuOvercommitRatio").getValue());
-            float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId,"memoryOvercommitRatio").getValue());
-            int vmCPU = svo.getCpu() * svo.getSpeed();
-            long vmMem = svo.getRamSize() * 1024L * 1024L;
-            long actualTotalMem = capacityMemory.getTotalCapacity();
-            long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
-            long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
-                s_logger.debug("Hosts's actual total RAM: " + actualTotalMem + " and RAM after applying overprovisioning: " + totalMem);
-            }
-
+            final Long clusterIdFinal = clusterId;
+            final long capacityCpuId = capacityCpu.getId();
+            final long capacityMemoryId = capacityMemory.getId();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    CapacityVO capacityCpu = _capacityDao.lockRow(capacityCpuId, true);
+                    CapacityVO capacityMemory = _capacityDao.lockRow(capacityMemoryId, true);
+        
+                    long usedCpu = capacityCpu.getUsedCapacity();
+                    long usedMem = capacityMemory.getUsedCapacity();
+                    long reservedCpu = capacityCpu.getReservedCapacity();
+                    long reservedMem = capacityMemory.getReservedCapacity();
+                    long actualTotalCpu = capacityCpu.getTotalCapacity();
+                    float cpuOvercommitRatio =Float.parseFloat(_clusterDetailsDao.findDetail(clusterIdFinal,"cpuOvercommitRatio").getValue());
+                    float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterIdFinal,"memoryOvercommitRatio").getValue());
+                    int vmCPU = svo.getCpu() * svo.getSpeed();
+                    long vmMem = svo.getRamSize() * 1024L * 1024L;
+                    long actualTotalMem = capacityMemory.getTotalCapacity();
+                    long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
+                    long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
+                        s_logger.debug("Hosts's actual total RAM: " + actualTotalMem + " and RAM after applying overprovisioning: " + totalMem);
+                    }
 
-            if (!moveFromReserved) {
-                /* move resource from used */
-                if (usedCpu >= vmCPU) {
-                    capacityCpu.setUsedCapacity(usedCpu - vmCPU);
-                }
-                if (usedMem >= vmMem) {
-                    capacityMemory.setUsedCapacity(usedMem - vmMem);
-                }
 
-                if (moveToReservered) {
-                    if (reservedCpu + vmCPU <= totalCpu) {
-                        capacityCpu.setReservedCapacity(reservedCpu + vmCPU);
+                    if (!moveFromReserved) {
+                        /* move resource from used */
+                        if (usedCpu >= vmCPU) {
+                            capacityCpu.setUsedCapacity(usedCpu - vmCPU);
+                        }
+                        if (usedMem >= vmMem) {
+                            capacityMemory.setUsedCapacity(usedMem - vmMem);
+                        }
+
+                        if (moveToReservered) {
+                            if (reservedCpu + vmCPU <= totalCpu) {
+                                capacityCpu.setReservedCapacity(reservedCpu + vmCPU);
+                            }
+                            if (reservedMem + vmMem <= totalMem) {
+                                capacityMemory.setReservedCapacity(reservedMem + vmMem);
+                            }
+                        }
+                    } else {
+                        if (reservedCpu >= vmCPU) {
+                            capacityCpu.setReservedCapacity(reservedCpu - vmCPU);
+                        }
+                        if (reservedMem >= vmMem) {
+                            capacityMemory.setReservedCapacity(reservedMem - vmMem);
+                        }
                     }
-                    if (reservedMem + vmMem <= totalMem) {
-                        capacityMemory.setReservedCapacity(reservedMem + vmMem);
-                    }
-                }
-            } else {
-                if (reservedCpu >= vmCPU) {
-                    capacityCpu.setReservedCapacity(reservedCpu - vmCPU);
-                }
-                if (reservedMem >= vmMem) {
-                    capacityMemory.setReservedCapacity(reservedMem - vmMem);
-                }
-            }
 
-            s_logger.debug("release cpu from host: " + hostId + ", old used: " + usedCpu + ",reserved: " + reservedCpu + ", actual total: "
-                    + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used: " + capacityCpu.getUsedCapacity() + ",reserved:"
-                    + capacityCpu.getReservedCapacity() + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
+                    s_logger.debug("release cpu from host: " + hostId + ", old used: " + usedCpu + ",reserved: " + reservedCpu + ", actual total: "
+                            + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used: " + capacityCpu.getUsedCapacity() + ",reserved:"
+                            + capacityCpu.getReservedCapacity() + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
+
+                    s_logger.debug("release mem from host: " + hostId + ", old used: " + usedMem + ",reserved: " + reservedMem + ", total: " + totalMem
+                            + "; new used: " + capacityMemory.getUsedCapacity() + ",reserved:" + capacityMemory.getReservedCapacity()
+                            + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
 
-            s_logger.debug("release mem from host: " + hostId + ", old used: " + usedMem + ",reserved: " + reservedMem + ", total: " + totalMem
-                    + "; new used: " + capacityMemory.getUsedCapacity() + ",reserved:" + capacityMemory.getReservedCapacity()
-                    + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
+                    _capacityDao.update(capacityCpu.getId(), capacityCpu);
+                    _capacityDao.update(capacityMemory.getId(), capacityMemory);
+                }
+            });
 
-            _capacityDao.update(capacityCpu.getId(), capacityCpu);
-            _capacityDao.update(capacityMemory.getId(), capacityMemory);
-            txn.commit();
             return true;
         } catch (Exception e) {
             s_logger.debug("Failed to transit vm's state, due to " + e.getMessage());
-            txn.rollback();
             return false;
         }
     }
 
     @DB
     @Override
-    public void allocateVmCapacity(VirtualMachine vm, boolean fromLastHost) {
+    public void allocateVmCapacity(VirtualMachine vm, final boolean fromLastHost) {
 
-        long hostId = vm.getHostId();
+        final long hostId = vm.getHostId();
         HostVO host = _hostDao.findById(hostId);
-        long clusterId = host.getClusterId();
-        float cpuOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "cpuOvercommitRatio").getValue());
-        float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "memoryOvercommitRatio").getValue());
+        final long clusterId = host.getClusterId();
+        final float cpuOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "cpuOvercommitRatio").getValue());
+        final float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "memoryOvercommitRatio").getValue());
 
-        ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
+        final ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
 
         CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU);
         CapacityVO capacityMem = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY);
@@ -272,74 +279,78 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
             return;
         }
 
-        int cpu = svo.getCpu() * svo.getSpeed();
-        long ram = svo.getRamSize() * 1024L * 1024L;
-
+        final int cpu = svo.getCpu() * svo.getSpeed();
+        final long ram = svo.getRamSize() * 1024L * 1024L;
 
-        Transaction txn = Transaction.currentTxn();
 
         try {
-            txn.start();
-            capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
-            capacityMem = _capacityDao.lockRow(capacityMem.getId(), true);
-
-            long usedCpu = capacityCpu.getUsedCapacity();
-            long usedMem = capacityMem.getUsedCapacity();
-            long reservedCpu = capacityCpu.getReservedCapacity();
-            long reservedMem = capacityMem.getReservedCapacity();
-            long actualTotalCpu = capacityCpu.getTotalCapacity();
-            long actualTotalMem = capacityMem.getTotalCapacity();
-            long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
-            long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
-            }
+            final long capacityCpuId = capacityCpu.getId();
+            final long capacityMemId = capacityMem.getId();
+
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    CapacityVO capacityCpu = _capacityDao.lockRow(capacityCpuId, true);
+                    CapacityVO capacityMem = _capacityDao.lockRow(capacityMemId, true);
+
+                    long usedCpu = capacityCpu.getUsedCapacity();
+                    long usedMem = capacityMem.getUsedCapacity();
+                    long reservedCpu = capacityCpu.getReservedCapacity();
+                    long reservedMem = capacityMem.getReservedCapacity();
+                    long actualTotalCpu = capacityCpu.getTotalCapacity();
+                    long actualTotalMem = capacityMem.getTotalCapacity();
+                    long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
+                    long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
+                    }
 
-            long freeCpu = totalCpu - (reservedCpu + usedCpu);
-            long freeMem = totalMem - (reservedMem + usedMem);
+                    long freeCpu = totalCpu - (reservedCpu + usedCpu);
+                    long freeMem = totalMem - (reservedMem + usedMem);
 
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("We are allocating VM, increasing the used capacity of this host:" + hostId);
-                s_logger.debug("Current Used CPU: " + usedCpu + " , Free CPU:" + freeCpu + " ,Requested CPU: " + cpu);
-                s_logger.debug("Current Used RAM: " + usedMem + " , Free RAM:" + freeMem + " ,Requested RAM: " + ram);
-            }
-            capacityCpu.setUsedCapacity(usedCpu + cpu);
-            capacityMem.setUsedCapacity(usedMem + ram);
-
-            if (fromLastHost) {
-                /* alloc from reserved */
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("We are allocating VM to the last host again, so adjusting the reserved capacity if it is not less than required");
-                    s_logger.debug("Reserved CPU: " + reservedCpu + " , Requested CPU: " + cpu);
-                    s_logger.debug("Reserved RAM: " + reservedMem + " , Requested RAM: " + ram);
-                }
-                if (reservedCpu >= cpu && reservedMem >= ram) {
-                    capacityCpu.setReservedCapacity(reservedCpu - cpu);
-                    capacityMem.setReservedCapacity(reservedMem - ram);
-                }
-            } else {
-                /* alloc from free resource */
-                if (!((reservedCpu + usedCpu + cpu <= totalCpu) && (reservedMem + usedMem + ram <= totalMem))) {
                     if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Host doesnt seem to have enough free capacity, but increasing the used capacity anyways, since the VM is already starting on this host ");
+                        s_logger.debug("We are allocating VM, increasing the used capacity of this host:" + hostId);
+                        s_logger.debug("Current Used CPU: " + usedCpu + " , Free CPU:" + freeCpu + " ,Requested CPU: " + cpu);
+                        s_logger.debug("Current Used RAM: " + usedMem + " , Free RAM:" + freeMem + " ,Requested RAM: " + ram);
+                    }
+                    capacityCpu.setUsedCapacity(usedCpu + cpu);
+                    capacityMem.setUsedCapacity(usedMem + ram);
+
+                    if (fromLastHost) {
+                        /* alloc from reserved */
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("We are allocating VM to the last host again, so adjusting the reserved capacity if it is not less than required");
+                            s_logger.debug("Reserved CPU: " + reservedCpu + " , Requested CPU: " + cpu);
+                            s_logger.debug("Reserved RAM: " + reservedMem + " , Requested RAM: " + ram);
+                        }
+                        if (reservedCpu >= cpu && reservedMem >= ram) {
+                            capacityCpu.setReservedCapacity(reservedCpu - cpu);
+                            capacityMem.setReservedCapacity(reservedMem - ram);
+                        }
+                    } else {
+                        /* alloc from free resource */
+                        if (!((reservedCpu + usedCpu + cpu <= totalCpu) && (reservedMem + usedMem + ram <= totalMem))) {
+                            if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("Host doesnt seem to have enough free capacity, but increasing the used capacity anyways, since the VM is already starting on this host ");
+                            }
+                        }
                     }
-                }
-            }
 
-            s_logger.debug("CPU STATS after allocation: for host: " + hostId + ", old used: " + usedCpu + ", old reserved: " + reservedCpu
-                    + ", actual total: " + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used:"
-                    + capacityCpu.getUsedCapacity() + ", reserved:" + capacityCpu.getReservedCapacity() + "; requested cpu:" + cpu
-                    + ",alloc_from_last:" + fromLastHost);
+                    s_logger.debug("CPU STATS after allocation: for host: " + hostId + ", old used: " + usedCpu + ", old reserved: " + reservedCpu
+                            + ", actual total: " + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used:"
+                            + capacityCpu.getUsedCapacity() + ", reserved:" + capacityCpu.getReservedCapacity() + "; requested cpu:" + cpu
+                            + ",alloc_from_last:" + fromLastHost);
 
-            s_logger.debug("RAM STATS after allocation: for host: " + hostId + ", old used: " + usedMem + ", old reserved: " + reservedMem
-                    + ", total: " + totalMem + "; new used: " + capacityMem.getUsedCapacity() + ", reserved: " + capacityMem.getReservedCapacity()
-                    + "; requested mem: " + ram + ",alloc_from_last:" + fromLastHost);
+                    s_logger.debug("RAM STATS after allocation: for host: " + hostId + ", old used: " + usedMem + ", old reserved: " + reservedMem
+                            + ", total: " + totalMem + "; new used: " + capacityMem.getUsedCapacity() + ", reserved: " + capacityMem.getReservedCapacity()
+                            + "; requested mem: " + ram + ",alloc_from_last:" + fromLastHost);
 
-            _capacityDao.update(capacityCpu.getId(), capacityCpu);
-            _capacityDao.update(capacityMem.getId(), capacityMem);
-            txn.commit();
+                    _capacityDao.update(capacityCpu.getId(), capacityCpu);
+                    _capacityDao.update(capacityMem.getId(), capacityMem);
+                }
+            });
         } catch (Exception e) {
-            txn.rollback();
+            s_logger.error("Exception allocating VM capacity", e);
             return;
         }
     }
@@ -512,7 +523,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
 
     @DB
     @Override
-	public void updateCapacityForHost(Host host){
+	public void updateCapacityForHost(final Host host){
     	// prepare the service offerings
         List<ServiceOfferingVO> offerings = _offeringsDao.listAllIncludingRemoved();
         Map<Long, ServiceOfferingVO> offeringsMap = new HashMap<Long, ServiceOfferingVO>();
@@ -625,36 +636,42 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
 	        	s_logger.error("Caught exception while updating cpu/memory capacity for the host " +host.getId(), e);
 	        }
         }else {
-        	Transaction txn = Transaction.currentTxn();
-        	txn.start();
-        	CapacityVO capacity = new CapacityVO(host.getId(),
-                    host.getDataCenterId(), host.getPodId(), host.getClusterId(), usedMemory,
-                    host.getTotalMemory(),
-                    CapacityVO.CAPACITY_TYPE_MEMORY);
-            capacity.setReservedCapacity(reservedMemory);
-            CapacityState capacityState = CapacityState.Enabled;
-            if (host.getClusterId() != null) {
-                cluster = ApiDBUtils.findClusterById(host.getClusterId());
-                if (cluster != null) {
-                    capacityState = _configMgr.findClusterAllocationState(cluster) == AllocationState.Disabled ? CapacityState.Disabled
-                            : CapacityState.Enabled;
+            final long usedMemoryFinal = usedMemory;
+            final long reservedMemoryFinal = reservedMemory;
+            final long usedCpuFinal = usedCpu;
+            final long reservedCpuFinal = reservedCpu;
+        	Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                	CapacityVO capacity = new CapacityVO(host.getId(),
+                            host.getDataCenterId(), host.getPodId(), host.getClusterId(), usedMemoryFinal,
+                            host.getTotalMemory(),
+                            CapacityVO.CAPACITY_TYPE_MEMORY);
+                    capacity.setReservedCapacity(reservedMemoryFinal);
+                    CapacityState capacityState = CapacityState.Enabled;
+                    if (host.getClusterId() != null) {
+                        ClusterVO cluster = ApiDBUtils.findClusterById(host.getClusterId());
+                        if (cluster != null) {
+                            capacityState = _configMgr.findClusterAllocationState(cluster) == AllocationState.Disabled ? CapacityState.Disabled
+                                    : CapacityState.Enabled;
+                            capacity.setCapacityState(capacityState);
+                        }
+                    }
+                    _capacityDao.persist(capacity);
+        
+                    capacity = new CapacityVO(
+                            host.getId(),
+                            host.getDataCenterId(),
+                            host.getPodId(),
+                            host.getClusterId(),
+                            usedCpuFinal,
+                            host.getCpus().longValue() * host.getSpeed().longValue(),
+                            CapacityVO.CAPACITY_TYPE_CPU);
+                    capacity.setReservedCapacity(reservedCpuFinal);
                     capacity.setCapacityState(capacityState);
+                    _capacityDao.persist(capacity);
                 }
-            }
-            _capacityDao.persist(capacity);
-
-            capacity = new CapacityVO(
-                    host.getId(),
-                    host.getDataCenterId(),
-                    host.getPodId(),
-                    host.getClusterId(),
-                    usedCpu,
-                    host.getCpus().longValue() * host.getSpeed().longValue(),
-                    CapacityVO.CAPACITY_TYPE_CPU);
-            capacity.setReservedCapacity(reservedCpu);
-            capacity.setCapacityState(capacityState);
-            _capacityDao.persist(capacity);
-            txn.commit();
+            });
 
         }
 


[04/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/server/ConfigurationServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index 4c5c8a1..1761a32 100755
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -45,7 +45,6 @@ import javax.naming.ConfigurationException;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigDepotAdmin;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -107,6 +106,11 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.crypt.DBEncryptionUtil;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.script.Script;
@@ -249,11 +253,9 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
             // Create userIpAddress ranges
 
             // Update existing vlans with networkId
-            Transaction txn = Transaction.currentTxn();
-
             List<VlanVO> vlans = _vlanDao.listAll();
             if (vlans != null && !vlans.isEmpty()) {
-                for (VlanVO vlan : vlans) {
+                for (final VlanVO vlan : vlans) {
                     if (vlan.getNetworkId().longValue() == 0) {
                         updateVlanWithNetworkId(vlan);
                     }
@@ -261,15 +263,19 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                     // Create vlan user_ip_address range
                     String ipPange = vlan.getIpRange();
                     String[] range = ipPange.split("-");
-                    String startIp = range[0];
-                    String endIp = range[1];
-
-                    txn.start();
-                    IPRangeConfig config = new IPRangeConfig();
-                    long startIPLong = NetUtils.ip2Long(startIp);
-                    long endIPLong = NetUtils.ip2Long(endIp);
-                    config.savePublicIPRange(txn, startIPLong, endIPLong, vlan.getDataCenterId(), vlan.getId(), vlan.getNetworkId(), vlan.getPhysicalNetworkId());
-                    txn.commit();
+                    final String startIp = range[0];
+                    final String endIp = range[1];
+
+                    Transaction.execute(new TransactionCallbackNoReturn() {
+                        @Override
+                        public void doInTransactionWithoutResult(TransactionStatus status) {
+                            IPRangeConfig config = new IPRangeConfig();
+                            long startIPLong = NetUtils.ip2Long(startIp);
+                            long endIPLong = NetUtils.ip2Long(endIp);
+                            config.savePublicIPRange(TransactionLegacy.currentTxn(), startIPLong, endIPLong, vlan.getDataCenterId(), vlan.getId(), vlan.getNetworkId(), vlan.getPhysicalNetworkId());
+                        }
+                    });
+
                 }
             }
         }
@@ -352,7 +358,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
     protected void saveUser() {
         // insert system account
         String insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, account.default) VALUES (1, UUID(), 'system', '1', '1', 1)";
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -361,7 +367,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
         // insert system user
         insertSql = "INSERT INTO `cloud`.`user` (id, uuid, username, password, account_id, firstname, lastname, created, user.default)" +
                 " VALUES (1, UUID(), 'system', RAND(), 1, 'system', 'cloud', now(), 1)";
-        txn = Transaction.currentTxn();
+        txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -377,7 +383,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
 
         // create an account for the admin user first
         insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, account.default) VALUES (" + id + ", UUID(), '" + username + "', '1', '1', 1)";
-        txn = Transaction.currentTxn();
+        txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -388,7 +394,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
         insertSql = "INSERT INTO `cloud`.`user` (id, uuid, username, password, account_id, firstname, lastname, created, state, user.default) " +
                 "VALUES (" + id + ", UUID(), '" + username + "', RAND(), 2, '" + firstname + "','" + lastname + "',now(), 'disabled', 1)";
 
-        txn = Transaction.currentTxn();
+        txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -419,7 +425,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                             "VALUES ('default', 'Default Security Group', 2, 1, 'admin')";
                 }
 
-                txn = Transaction.currentTxn();
+                txn = TransactionLegacy.currentTxn();
                 try {
                     stmt = txn.prepareAutoCloseStatement(insertSql);
                     stmt.executeUpdate();
@@ -559,7 +565,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
 
         String already = _configDao.getValue("system.vm.password");
         if (already == null) {
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 String rpassword = PasswordGenerator.generatePresharedKey(8);
                 String wSql = "INSERT INTO `cloud`.`configuration` (category, instance, component, name, value, description) "
@@ -643,7 +649,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
             String insertSql2 = "INSERT INTO `cloud`.`configuration` (category, instance, component, name, value, description) " +
                     "VALUES ('Hidden','DEFAULT', 'management-server','ssh.publickey', '" + DBEncryptionUtil.encrypt(publicKey) + "','Public key for the entire CloudStack')";
 
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 PreparedStatement stmt1 = txn.prepareAutoCloseStatement(insertSql1);
                 stmt1.executeUpdate();
@@ -778,7 +784,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
             String insertSql1 = "INSERT INTO `cloud`.`configuration` (category, instance, component, name, value, description) " +
                     "VALUES ('Hidden','DEFAULT', 'management-server','secstorage.copy.password', '" + DBEncryptionUtil.encrypt(password) + "','Password used to authenticate zone-to-zone template copy requests')";
 
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 PreparedStatement stmt1 = txn.prepareAutoCloseStatement(insertSql1);
                 stmt1.executeUpdate();
@@ -806,7 +812,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
     }
 
     @DB
-    protected HostPodVO createPod(long userId, String podName, long zoneId, String gateway, String cidr, String startIp, String endIp) throws InternalErrorException {
+    protected HostPodVO createPod(long userId, String podName, final long zoneId, String gateway, String cidr, final String startIp, String endIp) throws InternalErrorException {
         String[] cidrPair = cidr.split("\\/");
         String cidrAddress = cidrPair[0];
         int cidrSize = Integer.parseInt(cidrPair[1]);
@@ -828,37 +834,37 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
             ipRange = "";
         }
 
-        HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
-        Transaction txn = Transaction.currentTxn();
+        final HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
         try {
-            txn.start();
-
-            if (_podDao.persist(pod) == null) {
-                txn.rollback();
-                throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
-            }
-
-            if (startIp != null) {
-                _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
-            }
-
-            String ipNums = _configDao.getValue("linkLocalIp.nums");
-            int nums = Integer.parseInt(ipNums);
-            if (nums > 16 || nums <= 0) {
-                throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "is wrong, should be 1~16");
-            }
-            /* local link ip address starts from 169.254.0.2 - 169.254.(nums) */
-            String[] linkLocalIpRanges = NetUtils.getLinkLocalIPRange(nums);
-            if (linkLocalIpRanges == null) {
-                throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "may be wrong, should be 1~16");
-            } else {
-                _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
-            }
-
-            txn.commit();
-
+            final String endIpFinal = endIp;
+            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                @Override
+                public Object doInTransaction(TransactionStatus status) throws InternalErrorException {
+                    if (_podDao.persist(pod) == null) {
+                        throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
+                    }
+        
+                    if (startIp != null) {
+                        _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIpFinal);
+                    }
+        
+                    String ipNums = _configDao.getValue("linkLocalIp.nums");
+                    int nums = Integer.parseInt(ipNums);
+                    if (nums > 16 || nums <= 0) {
+                        throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "is wrong, should be 1~16");
+                    }
+                    /* local link ip address starts from 169.254.0.2 - 169.254.(nums) */
+                    String[] linkLocalIpRanges = NetUtils.getLinkLocalIPRange(nums);
+                    if (linkLocalIpRanges == null) {
+                        throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "may be wrong, should be 1~16");
+                    } else {
+                        _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
+                    }
+                    
+                    return null;
+                }
+            }, InternalErrorException.class);
         } catch (Exception e) {
-            txn.rollback();
             s_logger.error("Unable to create new pod due to " + e.getMessage(), e);
             throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
         }
@@ -919,20 +925,20 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
         privateGatewayNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(privateGatewayNetworkOffering);
 
         //populate providers
-        Map<Network.Service, Network.Provider> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+        final Map<Network.Service, Network.Provider> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
         defaultSharedNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
         defaultSharedNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
         defaultSharedNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter);
 
-        Map<Network.Service, Network.Provider> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
+        final Map<Network.Service, Network.Provider> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
 
-        Map<Network.Service, Network.Provider> defaultSharedSGNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+        final Map<Network.Service, Network.Provider> defaultSharedSGNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
         defaultSharedSGNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
         defaultSharedSGNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
         defaultSharedSGNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter);
         defaultSharedSGNetworkOfferingProviders.put(Service.SecurityGroup, Provider.SecurityGroupProvider);
 
-        Map<Network.Service, Network.Provider> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+        final Map<Network.Service, Network.Provider> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter);
@@ -944,7 +950,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.PortForwarding, Provider.VirtualRouter);
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Vpn, Provider.VirtualRouter);
 
-        Map<Network.Service, Network.Provider> netscalerServiceProviders = new HashMap<Network.Service, Network.Provider>();
+        final Map<Network.Service, Network.Provider> netscalerServiceProviders = new HashMap<Network.Service, Network.Provider>();
         netscalerServiceProviders.put(Service.Dhcp, Provider.VirtualRouter);
         netscalerServiceProviders.put(Service.Dns, Provider.VirtualRouter);
         netscalerServiceProviders.put(Service.UserData, Provider.VirtualRouter);
@@ -954,182 +960,182 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
 
         // The only one diff between 1 and 2 network offerings is that the first one has SG enabled. In Basic zone only
         // first network offering has to be enabled, in Advance zone - the second one
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        // Offering #1
-        NetworkOfferingVO defaultSharedSGNetworkOffering = new NetworkOfferingVO(
-                NetworkOffering.DefaultSharedNetworkOfferingWithSGService,
-                "Offering for Shared Security group enabled networks",
-                TrafficType.Guest,
-                false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Shared, true, true, false, false, false);
-
-        defaultSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
-        defaultSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedSGNetworkOffering);
-
-        for (Service service : defaultSharedSGNetworkOfferingProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedSGNetworkOffering.getId(), service, defaultSharedSGNetworkOfferingProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        // Offering #2
-        NetworkOfferingVO defaultSharedNetworkOffering = new NetworkOfferingVO(
-                NetworkOffering.DefaultSharedNetworkOffering,
-                "Offering for Shared networks",
-                TrafficType.Guest,
-                false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Shared, true, true, false, false, false);
-
-        defaultSharedNetworkOffering.setState(NetworkOffering.State.Enabled);
-        defaultSharedNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedNetworkOffering);
-
-        for (Service service : defaultSharedNetworkOfferingProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedNetworkOffering.getId(), service, defaultSharedNetworkOfferingProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        // Offering #3
-        NetworkOfferingVO defaultIsolatedSourceNatEnabledNetworkOffering = new NetworkOfferingVO(
-                NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
-                "Offering for Isolated networks with Source Nat service enabled",
-                TrafficType.Guest,
-                false, false, null, null, true, Availability.Required,
-                null, Network.GuestType.Isolated, true, false, false, false, true);
-
-        defaultIsolatedSourceNatEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
-        defaultIsolatedSourceNatEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedSourceNatEnabledNetworkOffering);
-
-        for (Service service : defaultIsolatedSourceNatEnabledNetworkOfferingProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
-                    (defaultIsolatedSourceNatEnabledNetworkOffering.getId(), service, defaultIsolatedSourceNatEnabledNetworkOfferingProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        // Offering #4
-        NetworkOfferingVO defaultIsolatedEnabledNetworkOffering = new NetworkOfferingVO(
-                NetworkOffering.DefaultIsolatedNetworkOffering,
-                "Offering for Isolated networks with no Source Nat service",
-                TrafficType.Guest,
-                false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, true, true, false, false, false);
-
-        defaultIsolatedEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
-        defaultIsolatedEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedEnabledNetworkOffering);
-
-        for (Service service : defaultIsolatedNetworkOfferingProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultIsolatedEnabledNetworkOffering.getId(), service, defaultIsolatedNetworkOfferingProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        // Offering #5
-        NetworkOfferingVO defaultNetscalerNetworkOffering = new NetworkOfferingVO(
-                NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
-                "Offering for Shared networks with Elastic IP and Elastic LB capabilities",
-                TrafficType.Guest,
-                false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Shared, true, false, false, false, true, true, true, false, false, true, true, false, false);
-
-        defaultNetscalerNetworkOffering.setState(NetworkOffering.State.Enabled);
-        defaultNetscalerNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetscalerNetworkOffering);
-
-        for (Service service : netscalerServiceProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultNetscalerNetworkOffering.getId(), service, netscalerServiceProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        // Offering #6
-        NetworkOfferingVO defaultNetworkOfferingForVpcNetworks = new NetworkOfferingVO(
-                NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
-                "Offering for Isolated Vpc networks with Source Nat service enabled",
-                TrafficType.Guest,
-                false, false, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, false, false, false, false, true);
-
-        defaultNetworkOfferingForVpcNetworks.setState(NetworkOffering.State.Enabled);
-        defaultNetworkOfferingForVpcNetworks = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworks);
-
-        Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
-        defaultVpcNetworkOfferingProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.Dns, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.UserData, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.Lb, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.StaticNat, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.PortForwarding, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProviders.put(Service.Vpn, Provider.VPCVirtualRouter);
-
-        for (Service service : defaultVpcNetworkOfferingProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
-                    (defaultNetworkOfferingForVpcNetworks.getId(), service, defaultVpcNetworkOfferingProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        // Offering #7
-        NetworkOfferingVO defaultNetworkOfferingForVpcNetworksNoLB = new NetworkOfferingVO(
-                NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
-                "Offering for Isolated Vpc networks with Source Nat service enabled and LB service Disabled",
-                TrafficType.Guest,
-                false, false, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, false, false, false, false, false);
-
-        defaultNetworkOfferingForVpcNetworksNoLB.setState(NetworkOffering.State.Enabled);
-        defaultNetworkOfferingForVpcNetworksNoLB = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworksNoLB);
-
-        Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProvidersNoLB = new HashMap<Network.Service, Network.Provider>();
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dhcp, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dns, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.UserData, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.NetworkACL, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.Gateway, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.SourceNat, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.StaticNat, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.PortForwarding, Provider.VPCVirtualRouter);
-        defaultVpcNetworkOfferingProvidersNoLB.put(Service.Vpn, Provider.VPCVirtualRouter);
-
-        for (Service service : defaultVpcNetworkOfferingProvidersNoLB.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
-                    (defaultNetworkOfferingForVpcNetworksNoLB.getId(), service, defaultVpcNetworkOfferingProvidersNoLB.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                // Offering #1
+                NetworkOfferingVO defaultSharedSGNetworkOffering = new NetworkOfferingVO(
+                        NetworkOffering.DefaultSharedNetworkOfferingWithSGService,
+                        "Offering for Shared Security group enabled networks",
+                        TrafficType.Guest,
+                        false, true, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Shared, true, true, false, false, false);
         
-        //offering #8 - network offering with internal lb service
-        NetworkOfferingVO internalLbOff = new NetworkOfferingVO(
-                NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
-                "Offering for Isolated Vpc networks with Internal LB support",
-                TrafficType.Guest,
-                false, false, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, false, false, false, true, false);
-
-        internalLbOff.setState(NetworkOffering.State.Enabled);
-        internalLbOff = _networkOfferingDao.persistDefaultNetworkOffering(internalLbOff);
-
-        Map<Network.Service, Network.Provider> internalLbOffProviders = new HashMap<Network.Service, Network.Provider>();
-        internalLbOffProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
-        internalLbOffProviders.put(Service.Dns, Provider.VPCVirtualRouter);
-        internalLbOffProviders.put(Service.UserData, Provider.VPCVirtualRouter);
-        internalLbOffProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
-        internalLbOffProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
-        internalLbOffProviders.put(Service.Lb, Provider.InternalLbVm);
-        internalLbOffProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
-
-        for (Service service : internalLbOffProviders.keySet()) {
-            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
-                    (internalLbOff.getId(), service, internalLbOffProviders.get(service));
-            _ntwkOfferingServiceMapDao.persist(offService);
-            s_logger.trace("Added service for the network offering: " + offService);
-        }
-
-        txn.commit();
+                defaultSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
+                defaultSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedSGNetworkOffering);
+        
+                for (Service service : defaultSharedSGNetworkOfferingProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedSGNetworkOffering.getId(), service, defaultSharedSGNetworkOfferingProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+        
+                // Offering #2
+                NetworkOfferingVO defaultSharedNetworkOffering = new NetworkOfferingVO(
+                        NetworkOffering.DefaultSharedNetworkOffering,
+                        "Offering for Shared networks",
+                        TrafficType.Guest,
+                        false, true, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Shared, true, true, false, false, false);
+        
+                defaultSharedNetworkOffering.setState(NetworkOffering.State.Enabled);
+                defaultSharedNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedNetworkOffering);
+        
+                for (Service service : defaultSharedNetworkOfferingProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedNetworkOffering.getId(), service, defaultSharedNetworkOfferingProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+        
+                // Offering #3
+                NetworkOfferingVO defaultIsolatedSourceNatEnabledNetworkOffering = new NetworkOfferingVO(
+                        NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
+                        "Offering for Isolated networks with Source Nat service enabled",
+                        TrafficType.Guest,
+                        false, false, null, null, true, Availability.Required,
+                        null, Network.GuestType.Isolated, true, false, false, false, true);
+        
+                defaultIsolatedSourceNatEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
+                defaultIsolatedSourceNatEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedSourceNatEnabledNetworkOffering);
+        
+                for (Service service : defaultIsolatedSourceNatEnabledNetworkOfferingProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+                            (defaultIsolatedSourceNatEnabledNetworkOffering.getId(), service, defaultIsolatedSourceNatEnabledNetworkOfferingProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+        
+                // Offering #4
+                NetworkOfferingVO defaultIsolatedEnabledNetworkOffering = new NetworkOfferingVO(
+                        NetworkOffering.DefaultIsolatedNetworkOffering,
+                        "Offering for Isolated networks with no Source Nat service",
+                        TrafficType.Guest,
+                        false, true, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Isolated, true, true, false, false, false);
+        
+                defaultIsolatedEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
+                defaultIsolatedEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedEnabledNetworkOffering);
+        
+                for (Service service : defaultIsolatedNetworkOfferingProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultIsolatedEnabledNetworkOffering.getId(), service, defaultIsolatedNetworkOfferingProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+        
+                // Offering #5
+                NetworkOfferingVO defaultNetscalerNetworkOffering = new NetworkOfferingVO(
+                        NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
+                        "Offering for Shared networks with Elastic IP and Elastic LB capabilities",
+                        TrafficType.Guest,
+                        false, true, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Shared, true, false, false, false, true, true, true, false, false, true, true, false, false);
+        
+                defaultNetscalerNetworkOffering.setState(NetworkOffering.State.Enabled);
+                defaultNetscalerNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetscalerNetworkOffering);
+        
+                for (Service service : netscalerServiceProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultNetscalerNetworkOffering.getId(), service, netscalerServiceProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+        
+                // Offering #6
+                NetworkOfferingVO defaultNetworkOfferingForVpcNetworks = new NetworkOfferingVO(
+                        NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
+                        "Offering for Isolated Vpc networks with Source Nat service enabled",
+                        TrafficType.Guest,
+                        false, false, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Isolated, false, false, false, false, true);
+        
+                defaultNetworkOfferingForVpcNetworks.setState(NetworkOffering.State.Enabled);
+                defaultNetworkOfferingForVpcNetworks = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworks);
+        
+                Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+                defaultVpcNetworkOfferingProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.Dns, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.UserData, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.Lb, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.StaticNat, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.PortForwarding, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProviders.put(Service.Vpn, Provider.VPCVirtualRouter);
+        
+                for (Service service : defaultVpcNetworkOfferingProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+                            (defaultNetworkOfferingForVpcNetworks.getId(), service, defaultVpcNetworkOfferingProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+        
+                // Offering #7
+                NetworkOfferingVO defaultNetworkOfferingForVpcNetworksNoLB = new NetworkOfferingVO(
+                        NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
+                        "Offering for Isolated Vpc networks with Source Nat service enabled and LB service Disabled",
+                        TrafficType.Guest,
+                        false, false, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Isolated, false, false, false, false, false);
+        
+                defaultNetworkOfferingForVpcNetworksNoLB.setState(NetworkOffering.State.Enabled);
+                defaultNetworkOfferingForVpcNetworksNoLB = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworksNoLB);
+        
+                Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProvidersNoLB = new HashMap<Network.Service, Network.Provider>();
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dhcp, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dns, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.UserData, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.NetworkACL, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.Gateway, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.SourceNat, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.StaticNat, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.PortForwarding, Provider.VPCVirtualRouter);
+                defaultVpcNetworkOfferingProvidersNoLB.put(Service.Vpn, Provider.VPCVirtualRouter);
+        
+                for (Service service : defaultVpcNetworkOfferingProvidersNoLB.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+                            (defaultNetworkOfferingForVpcNetworksNoLB.getId(), service, defaultVpcNetworkOfferingProvidersNoLB.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+                
+                //offering #8 - network offering with internal lb service
+                NetworkOfferingVO internalLbOff = new NetworkOfferingVO(
+                        NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
+                        "Offering for Isolated Vpc networks with Internal LB support",
+                        TrafficType.Guest,
+                        false, false, null, null, true, Availability.Optional,
+                        null, Network.GuestType.Isolated, false, false, false, true, false);
+        
+                internalLbOff.setState(NetworkOffering.State.Enabled);
+                internalLbOff = _networkOfferingDao.persistDefaultNetworkOffering(internalLbOff);
+        
+                Map<Network.Service, Network.Provider> internalLbOffProviders = new HashMap<Network.Service, Network.Provider>();
+                internalLbOffProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
+                internalLbOffProviders.put(Service.Dns, Provider.VPCVirtualRouter);
+                internalLbOffProviders.put(Service.UserData, Provider.VPCVirtualRouter);
+                internalLbOffProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
+                internalLbOffProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
+                internalLbOffProviders.put(Service.Lb, Provider.InternalLbVm);
+                internalLbOffProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
+        
+                for (Service service : internalLbOffProviders.keySet()) {
+                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+                            (internalLbOff.getId(), service, internalLbOffProviders.get(service));
+                    _ntwkOfferingServiceMapDao.persist(offService);
+                    s_logger.trace("Added service for the network offering: " + offService);
+                }
+            }
+        });
     }
 
     private void createDefaultNetworks() {
@@ -1243,8 +1249,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
         List<ResourceCountVO> domainResourceCount = _resourceCountDao.listResourceCountByOwnerType(ResourceOwnerType.Domain);
         List<ResourceCountVO> accountResourceCount = _resourceCountDao.listResourceCountByOwnerType(ResourceOwnerType.Account);
 
-        List<ResourceType> accountSupportedResourceTypes = new ArrayList<ResourceType>();
-        List<ResourceType> domainSupportedResourceTypes = new ArrayList<ResourceType>();
+        final List<ResourceType> accountSupportedResourceTypes = new ArrayList<ResourceType>();
+        final List<ResourceType> domainSupportedResourceTypes = new ArrayList<ResourceType>();
 
         for (ResourceType resourceType : resourceTypes) {
             if (resourceType.supportsOwner(ResourceOwnerType.Account)) {
@@ -1255,59 +1261,63 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
             }
         }
 
-        int accountExpectedCount = accountSupportedResourceTypes.size();
-        int domainExpectedCount = domainSupportedResourceTypes.size();
+        final int accountExpectedCount = accountSupportedResourceTypes.size();
+        final int domainExpectedCount = domainSupportedResourceTypes.size();
 
         if ((domainResourceCount.size() < domainExpectedCount * domains.size())) {
             s_logger.debug("resource_count table has records missing for some domains...going to insert them");
-            for (DomainVO domain : domains) {
+            for (final DomainVO domain : domains) {
                 // Lock domain
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                _domainDao.lockRow(domain.getId(), true);
-                List<ResourceCountVO> domainCounts = _resourceCountDao.listByOwnerId(domain.getId(), ResourceOwnerType.Domain);
-                List<String> domainCountStr = new ArrayList<String>();
-                for (ResourceCountVO domainCount : domainCounts) {
-                    domainCountStr.add(domainCount.getType().toString());
-                }
-
-                if (domainCountStr.size() < domainExpectedCount) {
-                    for (ResourceType resourceType : domainSupportedResourceTypes) {
-                        if (!domainCountStr.contains(resourceType.toString())) {
-                            ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, domain.getId(), ResourceOwnerType.Domain);
-                            s_logger.debug("Inserting resource count of type " + resourceType + " for domain id=" + domain.getId());
-                            _resourceCountDao.persist(resourceCountVO);
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        _domainDao.lockRow(domain.getId(), true);
+                        List<ResourceCountVO> domainCounts = _resourceCountDao.listByOwnerId(domain.getId(), ResourceOwnerType.Domain);
+                        List<String> domainCountStr = new ArrayList<String>();
+                        for (ResourceCountVO domainCount : domainCounts) {
+                            domainCountStr.add(domainCount.getType().toString());
+                        }
+        
+                        if (domainCountStr.size() < domainExpectedCount) {
+                            for (ResourceType resourceType : domainSupportedResourceTypes) {
+                                if (!domainCountStr.contains(resourceType.toString())) {
+                                    ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, domain.getId(), ResourceOwnerType.Domain);
+                                    s_logger.debug("Inserting resource count of type " + resourceType + " for domain id=" + domain.getId());
+                                    _resourceCountDao.persist(resourceCountVO);
+                                }
+                            }
                         }
                     }
-                }
-                txn.commit();
+                });
+
             }
         }
 
         if ((accountResourceCount.size() < accountExpectedCount * accounts.size())) {
             s_logger.debug("resource_count table has records missing for some accounts...going to insert them");
-            for (AccountVO account : accounts) {
+            for (final AccountVO account : accounts) {
                 // lock account
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                _accountDao.lockRow(account.getId(), true);
-                List<ResourceCountVO> accountCounts = _resourceCountDao.listByOwnerId(account.getId(), ResourceOwnerType.Account);
-                List<String> accountCountStr = new ArrayList<String>();
-                for (ResourceCountVO accountCount : accountCounts) {
-                    accountCountStr.add(accountCount.getType().toString());
-                }
-
-                if (accountCountStr.size() < accountExpectedCount) {
-                    for (ResourceType resourceType : accountSupportedResourceTypes) {
-                        if (!accountCountStr.contains(resourceType.toString())) {
-                            ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, account.getId(), ResourceOwnerType.Account);
-                            s_logger.debug("Inserting resource count of type " + resourceType + " for account id=" + account.getId());
-                            _resourceCountDao.persist(resourceCountVO);
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        _accountDao.lockRow(account.getId(), true);
+                        List<ResourceCountVO> accountCounts = _resourceCountDao.listByOwnerId(account.getId(), ResourceOwnerType.Account);
+                        List<String> accountCountStr = new ArrayList<String>();
+                        for (ResourceCountVO accountCount : accountCounts) {
+                            accountCountStr.add(accountCount.getType().toString());
+                        }
+        
+                        if (accountCountStr.size() < accountExpectedCount) {
+                            for (ResourceType resourceType : accountSupportedResourceTypes) {
+                                if (!accountCountStr.contains(resourceType.toString())) {
+                                    ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, account.getId(), ResourceOwnerType.Account);
+                                    s_logger.debug("Inserting resource count of type " + resourceType + " for account id=" + account.getId());
+                                    _resourceCountDao.persist(resourceCountVO);
+                                }
+                            }
                         }
                     }
-                }
-
-                txn.commit();
+                });
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 7173044..f7da8bb 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -565,6 +565,9 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -2166,12 +2169,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     @Override
     @DB
     public DomainVO updateDomain(UpdateDomainCmd cmd) {
-        Long domainId = cmd.getId();
-        String domainName = cmd.getDomainName();
-        String networkDomain = cmd.getNetworkDomain();
+        final Long domainId = cmd.getId();
+        final String domainName = cmd.getDomainName();
+        final String networkDomain = cmd.getNetworkDomain();
 
         // check if domain exists in the system
-        DomainVO domain = _domainDao.findById(domainId);
+        final DomainVO domain = _domainDao.findById(domainId);
         if (domain == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find domain with specified domain id");
             ex.addProxyObject(domainId.toString(), "domainId");
@@ -2212,27 +2215,26 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-
-        txn.start();
-
-        if (domainName != null) {
-            String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
-            updateDomainChildren(domain, updatedDomainPath);
-            domain.setName(domainName);
-            domain.setPath(updatedDomainPath);
-        }
-
-        if (networkDomain != null) {
-            if (networkDomain.isEmpty()) {
-                domain.setNetworkDomain(null);
-            } else {
-                domain.setNetworkDomain(networkDomain);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                if (domainName != null) {
+                    String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
+                    updateDomainChildren(domain, updatedDomainPath);
+                    domain.setName(domainName);
+                    domain.setPath(updatedDomainPath);
+                }
+        
+                if (networkDomain != null) {
+                    if (networkDomain.isEmpty()) {
+                        domain.setNetworkDomain(null);
+                    } else {
+                        domain.setNetworkDomain(networkDomain);
+                    }
+                }
+                _domainDao.update(domainId, domain);
             }
-        }
-        _domainDao.update(domainId, domain);
-
-        txn.commit();
+        });
 
         return _domainDao.findById(domainId);
 
@@ -3651,7 +3653,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
 
     @Override
     @DB
-    public boolean updateHostPassword(UpdateHostPasswordCmd cmd) {
+    public boolean updateHostPassword(final UpdateHostPasswordCmd cmd) {
         if (cmd.getClusterId() == null && cmd.getHostId() == null) {
             throw new InvalidParameterValueException("You should provide one of cluster id or a host id.");
         } else if (cmd.getClusterId() == null) {
@@ -3668,35 +3670,30 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
                 throw new InvalidParameterValueException("This operation is not supported for this hypervisor type");
             }
             // get all the hosts in this cluster
-            List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
-            Transaction txn = Transaction.currentTxn();
-            try {
-                txn.start();
-                for (HostVO h : hosts) {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Changing password for host name = " + h.getName());
-                    }
-                    // update password for this host
-                    DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
-                    if (nv.getValue().equals(cmd.getUsername())) {
-                        DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
-                        nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
-                        _detailsDao.persist(nvp);
-                    } else {
-                        // if one host in the cluster has diff username then
-                        // rollback to maintain consistency
-                        txn.rollback();
-                        throw new InvalidParameterValueException(
-                                "The username is not same for all hosts, please modify passwords for individual hosts.");
+            final List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
+
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    for (HostVO h : hosts) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Changing password for host name = " + h.getName());
+                        }
+                        // update password for this host
+                        DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
+                        if (nv.getValue().equals(cmd.getUsername())) {
+                            DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
+                            nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
+                            _detailsDao.persist(nvp);
+                        } else {
+                            // if one host in the cluster has diff username then
+                            // rollback to maintain consistency
+                            throw new InvalidParameterValueException(
+                                    "The username is not same for all hosts, please modify passwords for individual hosts.");
+                        }
                     }
                 }
-                txn.commit();
-                // if hypervisor is xenserver then we update it in
-                // CitrixResourceBase
-            } catch (Exception e) {
-                txn.rollback();
-                throw new CloudRuntimeException("Failed to update password " + e.getMessage());
-            }
+            });
         }
 
         return true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/server/StatsCollector.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java
index b4ec915..699c3c0 100755
--- a/server/src/com/cloud/server/StatsCollector.java
+++ b/server/src/com/cloud/server/StatsCollector.java
@@ -85,6 +85,8 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.net.MacAddress;
 import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmVO;
@@ -365,29 +367,29 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
                         scanLock.unlock();
                         return;
                     }
-                    Transaction txn = Transaction.open(Transaction.CLOUD_DB);
                     try {
-                        txn.start();
-                        //get all stats with delta > 0
-                        List<VmDiskStatisticsVO> updatedVmNetStats = _vmDiskStatsDao.listUpdatedStats();
-                        for(VmDiskStatisticsVO stat : updatedVmNetStats){
-                            if (_dailyOrHourly) {
-                                //update agg bytes
-                                stat.setAggBytesRead(stat.getCurrentBytesRead() + stat.getNetBytesRead());
-                                stat.setAggBytesWrite(stat.getCurrentBytesWrite() + stat.getNetBytesWrite());
-                                stat.setAggIORead(stat.getCurrentIORead() + stat.getNetIORead());
-                                stat.setAggIOWrite(stat.getCurrentIOWrite() + stat.getNetIOWrite());
-                                _vmDiskStatsDao.update(stat.getId(), stat);
+                        Transaction.execute(new TransactionCallbackNoReturn() {
+                            @Override
+                            public void doInTransactionWithoutResult(TransactionStatus status) {
+                                //get all stats with delta > 0
+                                List<VmDiskStatisticsVO> updatedVmNetStats = _vmDiskStatsDao.listUpdatedStats();
+                                for(VmDiskStatisticsVO stat : updatedVmNetStats){
+                                    if (_dailyOrHourly) {
+                                        //update agg bytes
+                                        stat.setAggBytesRead(stat.getCurrentBytesRead() + stat.getNetBytesRead());
+                                        stat.setAggBytesWrite(stat.getCurrentBytesWrite() + stat.getNetBytesWrite());
+                                        stat.setAggIORead(stat.getCurrentIORead() + stat.getNetIORead());
+                                        stat.setAggIOWrite(stat.getCurrentIOWrite() + stat.getNetIOWrite());
+                                        _vmDiskStatsDao.update(stat.getId(), stat);
+                                    }
+                                }
+                                s_logger.debug("Successfully updated aggregate vm disk stats");
                             }
-                        }
-                        s_logger.debug("Successfully updated aggregate vm disk stats");
-                        txn.commit();
+                        });
                     } catch (Exception e){
-                        txn.rollback();
                         s_logger.debug("Failed to update aggregate disk stats", e);
                     } finally {
                         scanLock.unlock();
-                        txn.close();
                     }
                 }
             } catch (Exception e){
@@ -402,122 +404,121 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
         @Override
         protected void runInContext() {
             // collect the vm disk statistics(total) from hypervisor. added by weizhou, 2013.03.
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
             try {
-                txn.start();
-                SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
-                sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());
-                sc.addAnd("resourceState", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
-                sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.Routing.toString());
-                sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, HypervisorType.KVM); // support KVM only util 2013.06.25
-                List<HostVO> hosts = _hostDao.search(sc, null);
-
-                for (HostVO host : hosts) {
-                    List<UserVmVO> vms = _userVmDao.listRunningByHostId(host.getId());
-                    List<Long> vmIds = new ArrayList<Long>();
-
-                    for (UserVmVO vm : vms) {
-                        if (vm.getType() == VirtualMachine.Type.User) // user vm
-                            vmIds.add(vm.getId());
-                    }
-
-                    HashMap<Long, List<VmDiskStatsEntry>> vmDiskStatsById = _userVmMgr.getVmDiskStatistics(host.getId(), host.getName(), vmIds);
-                    if (vmDiskStatsById == null)
-                        continue;
-
-                    Set<Long> vmIdSet = vmDiskStatsById.keySet();
-                    for(Long vmId : vmIdSet)
-                    {
-                        List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsById.get(vmId);
-                        if (vmDiskStats == null)
-                                continue;
-                        UserVmVO userVm = _userVmDao.findById(vmId);
-                        for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
-                            SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
-                            sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
-                            VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
-                            VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
-                            VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
-
-                            if ((vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)
-                                    && (vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0)) {
-                                s_logger.debug("IO/bytes read and write are all 0. Not updating vm_disk_statistics");
-                                continue;
-                            }
-
-                            if (vmDiskStat_lock == null) {
-                                s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
-                                continue;
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
+                        sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());
+                        sc.addAnd("resourceState", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
+                        sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.Routing.toString());
+                        sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, HypervisorType.KVM); // support KVM only util 2013.06.25
+                        List<HostVO> hosts = _hostDao.search(sc, null);
+        
+                        for (HostVO host : hosts) {
+                            List<UserVmVO> vms = _userVmDao.listRunningByHostId(host.getId());
+                            List<Long> vmIds = new ArrayList<Long>();
+        
+                            for (UserVmVO vm : vms) {
+                                if (vm.getType() == VirtualMachine.Type.User) // user vm
+                                    vmIds.add(vm.getId());
                             }
-
-                            if (previousVmDiskStats != null
-                                    && ((previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
-                                    || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())
-                                    || (previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
-                                    || (previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite()))) {
-                                s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
-                                        "Ignoring current answer. Host: " + host.getName()  + " . VM: " + vmDiskStat.getVmName() +
-                                        " Read(Bytes): " + vmDiskStat.getBytesRead() + " write(Bytes): " + vmDiskStat.getBytesWrite() +
-                                        " Read(IO): " + vmDiskStat.getIORead() + " write(IO): " + vmDiskStat.getIOWrite());
+        
+                            HashMap<Long, List<VmDiskStatsEntry>> vmDiskStatsById = _userVmMgr.getVmDiskStatistics(host.getId(), host.getName(), vmIds);
+                            if (vmDiskStatsById == null)
                                 continue;
-                            }
-
-                            if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Read # of bytes that's less than the last one.  " +
-                                            "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-                                            " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
-                                }
-                                vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
-                            }
-                            vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
-                            if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Write # of bytes that's less than the last one.  " +
-                                            "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-                                            " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
-                                }
-                                vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
-                            }
-                            vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
-                            if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Read # of IO that's less than the last one.  " +
-                                            "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-                                            " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+        
+                            Set<Long> vmIdSet = vmDiskStatsById.keySet();
+                            for(Long vmId : vmIdSet)
+                            {
+                                List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsById.get(vmId);
+                                if (vmDiskStats == null)
+                                        continue;
+                                UserVmVO userVm = _userVmDao.findById(vmId);
+                                for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
+                                    SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
+                                    sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
+                                    VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
+                                    VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
+                                    VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
+        
+                                    if ((vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)
+                                            && (vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0)) {
+                                        s_logger.debug("IO/bytes read and write are all 0. Not updating vm_disk_statistics");
+                                        continue;
+                                    }
+        
+                                    if (vmDiskStat_lock == null) {
+                                        s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
+                                        continue;
+                                    }
+        
+                                    if (previousVmDiskStats != null
+                                            && ((previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
+                                            || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())
+                                            || (previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
+                                            || (previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite()))) {
+                                        s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
+                                                "Ignoring current answer. Host: " + host.getName()  + " . VM: " + vmDiskStat.getVmName() +
+                                                " Read(Bytes): " + vmDiskStat.getBytesRead() + " write(Bytes): " + vmDiskStat.getBytesWrite() +
+                                                " Read(IO): " + vmDiskStat.getIORead() + " write(IO): " + vmDiskStat.getIOWrite());
+                                        continue;
+                                    }
+        
+                                    if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
+                                        if (s_logger.isDebugEnabled()) {
+                                            s_logger.debug("Read # of bytes that's less than the last one.  " +
+                                                    "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+                                                    " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
+                                        }
+                                        vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+                                    }
+                                    vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
+                                    if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
+                                        if (s_logger.isDebugEnabled()) {
+                                            s_logger.debug("Write # of bytes that's less than the last one.  " +
+                                                    "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+                                                    " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
+                                        }
+                                        vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+                                    }
+                                    vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
+                                    if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
+                                        if (s_logger.isDebugEnabled()) {
+                                            s_logger.debug("Read # of IO that's less than the last one.  " +
+                                                    "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+                                                    " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+                                        }
+                                        vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+                                    }
+                                    vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
+                                    if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
+                                        if (s_logger.isDebugEnabled()) {
+                                            s_logger.debug("Write # of IO that's less than the last one.  " +
+                                                    "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+                                                    " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
+                                        }
+                                        vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+                                    }
+                                    vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
+        
+                                    if (! _dailyOrHourly) {
+                                        //update agg bytes
+                                        vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+                                        vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+                                        vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+                                        vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+                                    }
+        
+                                    _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
                                 }
-                                vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
                             }
-                            vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
-                            if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Write # of IO that's less than the last one.  " +
-                                            "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
-                                            " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
-                                }
-                                vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
-                            }
-                            vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
-
-                            if (! _dailyOrHourly) {
-                                //update agg bytes
-                                vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
-                                vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
-                                vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
-                                vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
-                            }
-
-                            _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
                         }
                     }
-                }
-                txn.commit();
+                });
             } catch (Exception e) {
                 s_logger.warn("Error while collecting vm disk stats from hosts", e);
-            } finally {
-                txn.close();
             }
-
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/servlet/CloudStartupServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/CloudStartupServlet.java b/server/src/com/cloud/servlet/CloudStartupServlet.java
index 8fbae92..4fe96aa 100755
--- a/server/src/com/cloud/servlet/CloudStartupServlet.java
+++ b/server/src/com/cloud/servlet/CloudStartupServlet.java
@@ -30,6 +30,7 @@ import com.cloud.utils.LogUtils;
 import com.cloud.utils.SerialVersionUID;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class CloudStartupServlet extends HttpServlet {
     public static final Logger s_logger = Logger.getLogger(CloudStartupServlet.class.getName());
@@ -49,7 +50,7 @@ public class CloudStartupServlet extends HttpServlet {
 				if(ComponentContext.getApplicationContext() != null) {
 					_timer.cancel();
 					
-					Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+					TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
 					try {
 						ComponentContext.initComponentsLifeCycle();
 					} finally {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/servlet/ConsoleProxyServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index e01d959..b3415db 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -57,6 +57,7 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.Ternary;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineManager;
 
@@ -573,7 +574,7 @@ public class ConsoleProxyServlet extends HttpServlet {
                 return false; // no signature, bad request
             }
 
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+            TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
             txn.close();
             User user = null;
             // verify there is a user with this api key

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index c046057..75cedd0 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -158,6 +158,10 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -1066,7 +1070,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         String sql = "SELECT volume_id from snapshots, snapshot_store_ref WHERE snapshots.id = snapshot_store_ref.snapshot_id and store_id=? GROUP BY volume_id";
         List<Long> list = new ArrayList<Long>();
         try {
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             ResultSet rs = null;
             PreparedStatement pstmt = null;
             pstmt = txn.prepareAutoCloseStatement(sql);
@@ -1086,7 +1090,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     List<String> findAllSnapshotForVolume(Long volumeId) {
         String sql = "SELECT backup_snap_id FROM snapshots WHERE volume_id=? and backup_snap_id is not NULL";
         try {
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             ResultSet rs = null;
             PreparedStatement pstmt = null;
             pstmt = txn.prepareAutoCloseStatement(sql);
@@ -1752,7 +1756,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
 
     @Override
     public boolean deleteImageStore(DeleteImageStoreCmd cmd) {
-        long storeId = cmd.getId();
+        final long storeId = cmd.getId();
         // Verify that image store exists
         ImageStoreVO store = _imageStoreDao.findById(storeId);
         if (store == null) {
@@ -1778,17 +1782,20 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         }
 
         // ready to delete
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // first delete from image_store_details table, we need to do that since
-        // we are not actually deleting record from main
-        // image_data_store table, so delete cascade will not work
-        _imageStoreDetailsDao.deleteDetails(storeId);
-        _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
-        _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
-        _templateStoreDao.deletePrimaryRecordsForStore(storeId);
-        _imageStoreDao.remove(storeId);
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                // first delete from image_store_details table, we need to do that since
+                // we are not actually deleting record from main
+                // image_data_store table, so delete cascade will not work
+                _imageStoreDetailsDao.deleteDetails(storeId);
+                _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
+                _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+                _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+                _imageStoreDao.remove(storeId);
+            }
+        });
+
         return true;
     }
 
@@ -1862,7 +1869,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
 
     @Override
     public boolean deleteSecondaryStagingStore(DeleteSecondaryStagingStoreCmd cmd) {
-        long storeId = cmd.getId();
+        final long storeId = cmd.getId();
         // Verify that cache store exists
         ImageStoreVO store = _imageStoreDao.findById(storeId);
         if (store == null) {
@@ -1887,17 +1894,20 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         }
 
         // ready to delete
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // first delete from image_store_details table, we need to do that since
-        // we are not actually deleting record from main
-        // image_data_store table, so delete cascade will not work
-        _imageStoreDetailsDao.deleteDetails(storeId);
-        _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
-        _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
-        _templateStoreDao.deletePrimaryRecordsForStore(storeId);
-        _imageStoreDao.remove(storeId);
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                // first delete from image_store_details table, we need to do that since
+                // we are not actually deleting record from main
+                // image_data_store table, so delete cascade will not work
+                _imageStoreDetailsDao.deleteDetails(storeId);
+                _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
+                _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+                _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+                _imageStoreDao.remove(storeId);
+            }
+        });
+
         return true;
     }
 


[18/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
index 8debe2e..65abae3 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
@@ -54,7 +54,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -336,7 +336,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
 
     @Override @DB
     public List<EngineHostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<EngineHostVO> sc = UnmanagedDirectConnectSearch.create();
         sc.setParameters("lastPinged", lastPingSecondsAfter);
@@ -356,7 +356,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
 
     @Override @DB
     public List<EngineHostVO> findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<EngineHostVO> sc = UnmanagedApplianceSearch.create();
@@ -495,7 +495,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
     @DB
     @Override
     public List<EngineHostVO> findLostHosts(long timeout) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<EngineHostVO> result = new ArrayList<EngineHostVO>();
         ResultSet rs = null;
@@ -546,7 +546,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
     public EngineHostVO persist(EngineHostVO host) {
         final String InsertSequenceSql = "INSERT INTO op_host(id) VALUES(?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         EngineHostVO dbHost = super.persist(host);
@@ -572,7 +572,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
     @Override
     @DB
     public boolean update(Long hostId, EngineHostVO host) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         boolean persisted = super.update(hostId, host);
@@ -598,7 +598,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
 
         ArrayList<RunningHostCountInfo> l = new ArrayList<RunningHostCountInfo>();
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         ;
         PreparedStatement pstmt = null;
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
index 7bf85d5..2bcfdd1 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
@@ -41,7 +41,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component(value="EngineHostPodDao")
 @Local(value={EngineHostPodDao.class})
@@ -97,7 +97,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase<EngineHostPodVO, Long>
 		HashMap<Long, List<Object>> currentPodCidrSubnets = new HashMap<Long, List<Object>>();
 
 		String selectSql = "SELECT id, cidr_address, cidr_size FROM host_pod_ref WHERE data_center_id=" + zoneId +" and removed IS NULL";
-		Transaction txn = Transaction.currentTxn();
+		TransactionLegacy txn = TransactionLegacy.currentTxn();
 		try {
 		PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
 		ResultSet rs = stmt.executeQuery();
@@ -123,7 +123,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase<EngineHostPodVO, Long>
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         EngineHostPodVO pod = createForUpdate();
         pod.setName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
index e0ae778..e0a6dce 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component(value="EngineHostDetailsDao")
@@ -96,7 +96,7 @@ public class HostDetailsDaoImpl extends GenericDaoBase<DetailVO, Long> implement
     public void persist(long hostId, Map<String, String> details) {
         final String InsertOrUpdateSql = "INSERT INTO `cloud`.`host_details` (host_id, name, value) VALUES (?,?,?) ON DUPLICATE KEY UPDATE value=?";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         for (Map.Entry<String, String> detail : details.entrySet()) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
index a70b7d1..17d6f81 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
@@ -27,7 +27,7 @@ import com.cloud.host.HostTagVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component(value="EngineHostTagsDao")
 @Local(value=HostTagsDao.class)
@@ -56,7 +56,7 @@ public class HostTagsDaoImpl extends GenericDaoBase<HostTagVO, Long> implements
     
     @Override
     public void persist(long hostId, List<String> hostTags) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<HostTagVO> sc = HostSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 3c4b1ed..7ba9b1b 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -167,6 +167,10 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
@@ -346,7 +350,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
     @DB
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
         // populate providers
-        Map<Network.Service, Set<Network.Provider>> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+        final Map<Network.Service, Set<Network.Provider>> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
         Set<Network.Provider> defaultProviders = new HashSet<Network.Provider>();
 
         defaultProviders.add(Network.Provider.VirtualRouter);
@@ -354,7 +358,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         defaultSharedNetworkOfferingProviders.put(Service.Dns, defaultProviders);
         defaultSharedNetworkOfferingProviders.put(Service.UserData, defaultProviders);
 
-        Map<Network.Service, Set<Network.Provider>> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
+        final Map<Network.Service, Set<Network.Provider>> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
         defaultIsolatedNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
         defaultIsolatedNetworkOfferingProviders.put(Service.Dns, defaultProviders);
         defaultIsolatedNetworkOfferingProviders.put(Service.UserData, defaultProviders);
@@ -365,7 +369,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         defaultIsolatedNetworkOfferingProviders.put(Service.PortForwarding, defaultProviders);
         defaultIsolatedNetworkOfferingProviders.put(Service.Vpn, defaultProviders);
 
-        Map<Network.Service, Set<Network.Provider>> defaultSharedSGEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+        final Map<Network.Service, Set<Network.Provider>> defaultSharedSGEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
         defaultSharedSGEnabledNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
         defaultSharedSGEnabledNetworkOfferingProviders.put(Service.Dns, defaultProviders);
         defaultSharedSGEnabledNetworkOfferingProviders.put(Service.UserData, defaultProviders);
@@ -373,7 +377,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         sgProviders.add(Provider.SecurityGroupProvider);
         defaultSharedSGEnabledNetworkOfferingProviders.put(Service.SecurityGroup, sgProviders);
 
-        Map<Network.Service, Set<Network.Provider>> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+        final Map<Network.Service, Set<Network.Provider>> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
         defaultProviders.clear();
         defaultProviders.add(Network.Provider.VirtualRouter);
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
@@ -387,7 +391,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.PortForwarding, defaultProviders);
         defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Vpn, defaultProviders);
 
-        Map<Network.Service, Set<Network.Provider>> defaultVPCOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+        final Map<Network.Service, Set<Network.Provider>> defaultVPCOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
         defaultProviders.clear();
         defaultProviders.add(Network.Provider.VPCVirtualRouter);
         defaultVPCOffProviders.put(Service.Dhcp, defaultProviders);
@@ -401,133 +405,134 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         defaultVPCOffProviders.put(Service.PortForwarding, defaultProviders);
         defaultVPCOffProviders.put(Service.Vpn, defaultProviders);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        NetworkOfferingVO offering = null;
-        //#1 - quick cloud network offering
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
-                Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true, Network.GuestType.Shared, false, null, true, null, true, false, null,
-                false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#2 - SG enabled network offering
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks",
-                TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true,
-                false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#3 - shared network offering with no SG service
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true,
-                Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#4 - default isolated offering with Source nat service
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
-                "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null,
-                defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null);
-
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#5 - default vpc offering with LB service
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
-                "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, defaultVPCOffProviders, true,
-                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#6 - default vpc offering with no LB service
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB) == null) {
-            //remove LB service
-            defaultVPCOffProviders.remove(Service.Lb);
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
-                "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, null,
-                defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#7 - isolated offering with source nat disabled
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service",
-                TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null,
-                true, false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        //#8 - network offering with internal lb service
-        Map<Network.Service, Set<Network.Provider>> internalLbOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
-        Set<Network.Provider> defaultVpcProvider = new HashSet<Network.Provider>();
-        defaultVpcProvider.add(Network.Provider.VPCVirtualRouter);
-
-        Set<Network.Provider> defaultInternalLbProvider = new HashSet<Network.Provider>();
-        defaultInternalLbProvider.add(Network.Provider.InternalLbVm);
-
-        internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider);
-        internalLbOffProviders.put(Service.Dns, defaultVpcProvider);
-        internalLbOffProviders.put(Service.UserData, defaultVpcProvider);
-        internalLbOffProviders.put(Service.NetworkACL, defaultVpcProvider);
-        internalLbOffProviders.put(Service.Gateway, defaultVpcProvider);
-        internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider);
-        internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider);
-
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
-                "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, true,
-                Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            offering.setInternalLb(true);
-            offering.setPublicLb(false);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        Map<Network.Service, Set<Network.Provider>> netscalerServiceProviders = new HashMap<Network.Service, Set<Network.Provider>>();
-        Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
-        vrProvider.add(Provider.VirtualRouter);
-        Set<Network.Provider> sgProvider = new HashSet<Network.Provider>();
-        sgProvider.add(Provider.SecurityGroupProvider);
-        Set<Network.Provider> nsProvider = new HashSet<Network.Provider>();
-        nsProvider.add(Provider.Netscaler);
-        netscalerServiceProviders.put(Service.Dhcp, vrProvider);
-        netscalerServiceProviders.put(Service.Dns, vrProvider);
-        netscalerServiceProviders.put(Service.UserData, vrProvider);
-        netscalerServiceProviders.put(Service.SecurityGroup, sgProvider);
-        netscalerServiceProviders.put(Service.StaticNat, nsProvider);
-        netscalerServiceProviders.put(Service.Lb, nsProvider);
-
-        Map<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>();
-        Map<Capability, String> elb = new HashMap<Capability, String>();
-        elb.put(Capability.ElasticLb, "true");
-        Map<Capability, String> eip = new HashMap<Capability, String>();
-        eip.put(Capability.ElasticIp, "true");
-        serviceCapabilityMap.put(Service.Lb, elb);
-        serviceCapabilityMap.put(Service.StaticNat, eip);
-
-        if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
-            offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
-                "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, netscalerServiceProviders,
-                true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null);
-            offering.setState(NetworkOffering.State.Enabled);
-            offering.setDedicatedLB(false);
-            _networkOfferingDao.update(offering.getId(), offering);
-        }
-
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                NetworkOfferingVO offering = null;
+                //#1 - quick cloud network offering
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
+                        Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true, Network.GuestType.Shared, false, null, true, null, true, false, null,
+                        false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#2 - SG enabled network offering
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks",
+                        TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true,
+                        false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#3 - shared network offering with no SG service
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true,
+                        Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#4 - default isolated offering with Source nat service
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
+                        "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null,
+                        defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null);
+        
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#5 - default vpc offering with LB service
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
+                        "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, defaultVPCOffProviders, true,
+                        Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#6 - default vpc offering with no LB service
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB) == null) {
+                    //remove LB service
+                    defaultVPCOffProviders.remove(Service.Lb);
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
+                        "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, null,
+                        defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#7 - isolated offering with source nat disabled
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service",
+                        TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null,
+                        true, false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                //#8 - network offering with internal lb service
+                Map<Network.Service, Set<Network.Provider>> internalLbOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+                Set<Network.Provider> defaultVpcProvider = new HashSet<Network.Provider>();
+                defaultVpcProvider.add(Network.Provider.VPCVirtualRouter);
+        
+                Set<Network.Provider> defaultInternalLbProvider = new HashSet<Network.Provider>();
+                defaultInternalLbProvider.add(Network.Provider.InternalLbVm);
+        
+                internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider);
+                internalLbOffProviders.put(Service.Dns, defaultVpcProvider);
+                internalLbOffProviders.put(Service.UserData, defaultVpcProvider);
+                internalLbOffProviders.put(Service.NetworkACL, defaultVpcProvider);
+                internalLbOffProviders.put(Service.Gateway, defaultVpcProvider);
+                internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider);
+                internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider);
+        
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
+                        "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, true,
+                        Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    offering.setInternalLb(true);
+                    offering.setPublicLb(false);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+        
+                Map<Network.Service, Set<Network.Provider>> netscalerServiceProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+                Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
+                vrProvider.add(Provider.VirtualRouter);
+                Set<Network.Provider> sgProvider = new HashSet<Network.Provider>();
+                sgProvider.add(Provider.SecurityGroupProvider);
+                Set<Network.Provider> nsProvider = new HashSet<Network.Provider>();
+                nsProvider.add(Provider.Netscaler);
+                netscalerServiceProviders.put(Service.Dhcp, vrProvider);
+                netscalerServiceProviders.put(Service.Dns, vrProvider);
+                netscalerServiceProviders.put(Service.UserData, vrProvider);
+                netscalerServiceProviders.put(Service.SecurityGroup, sgProvider);
+                netscalerServiceProviders.put(Service.StaticNat, nsProvider);
+                netscalerServiceProviders.put(Service.Lb, nsProvider);
+        
+                Map<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>();
+                Map<Capability, String> elb = new HashMap<Capability, String>();
+                elb.put(Capability.ElasticLb, "true");
+                Map<Capability, String> eip = new HashMap<Capability, String>();
+                eip.put(Capability.ElasticIp, "true");
+                serviceCapabilityMap.put(Service.Lb, elb);
+                serviceCapabilityMap.put(Service.StaticNat, eip);
+        
+                if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
+                    offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
+                        "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, netscalerServiceProviders,
+                        true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null);
+                    offering.setState(NetworkOffering.State.Enabled);
+                    offering.setDedicatedLB(false);
+                    _networkOfferingDao.update(offering.getId(), offering);
+                }
+            }
+        });
+
 
         AssignIpAddressSearch = _ipAddressDao.createSearchBuilder();
         AssignIpAddressSearch.and("dc", AssignIpAddressSearch.entity().getDataCenterId(), Op.EQ);
@@ -590,8 +595,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
 
     @Override
     @DB
-    public List<? extends Network> setupNetwork(Account owner, NetworkOffering offering, Network predefined, DeploymentPlan plan, String name, String displayText,
-        boolean errorIfAlreadySetup, Long domainId, ACLType aclType, Boolean subdomainAccess, Long vpcId, Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
+    public List<? extends Network> setupNetwork(final Account owner, final NetworkOffering offering, final Network predefined, final DeploymentPlan plan, final String name, final String displayText,
+        boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId, final Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
 
         Account locked = _accountDao.acquireInLockTable(owner.getId());
         if (locked == null) {
@@ -622,12 +627,12 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
                 }
             }
 
-            List<NetworkVO> networks = new ArrayList<NetworkVO>();
+            final List<NetworkVO> networks = new ArrayList<NetworkVO>();
 
             long related = -1;
 
-            for (NetworkGuru guru : _networkGurus) {
-                Network network = guru.design(offering, plan, predefined, owner);
+            for (final NetworkGuru guru : _networkGurus) {
+                final Network network = guru.design(offering, plan, predefined, owner);
                 if (network == null) {
                     continue;
                 }
@@ -641,28 +646,26 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
                     continue;
                 }
 
-                long id = _networksDao.getNextInSequence(Long.class, "id");
+                final long id = _networksDao.getNextInSequence(Long.class, "id");
                 if (related == -1) {
                     related = id;
                 }
 
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-
-                NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), related, name, displayText,
-                    predefined.getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId);
-                vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled);
-                networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated,
-                    finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())));
-
-                if (domainId != null && aclType == ACLType.Domain) {
-                    if (subdomainAccess == null) {
-                        subdomainAccess = true;
+                final long relatedFile = related;
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), relatedFile, name, displayText,
+                            predefined.getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId);
+                        vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled);
+                        networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated,
+                            finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())));
+        
+                        if (domainId != null && aclType == ACLType.Domain) {
+                            _networksDao.addDomainToNetwork(id, domainId, subdomainAccess == null ? true : subdomainAccess);
+                        }
                     }
-                    _networksDao.addDomainToNetwork(id, domainId, subdomainAccess);
-                }
-
-                txn.commit();
+                });
             }
 
             if (networks.size() < 1) {
@@ -681,73 +684,76 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
 
     @Override
     @DB
-    public void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, ? extends NicProfile> networks) throws InsufficientCapacityException,
+    public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, ? extends NicProfile> networks) throws InsufficientCapacityException,
         ConcurrentOperationException {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        int deviceId = 0;
-
-        boolean[] deviceIds = new boolean[networks.size()];
-        Arrays.fill(deviceIds, false);
-
-        List<NicProfile> nics = new ArrayList<NicProfile>(networks.size());
-        NicProfile defaultNic = null;
-
-        for (Map.Entry<? extends Network, ? extends NicProfile> network : networks.entrySet()) {
-            Network config = network.getKey();
-            NicProfile requested = network.getValue();
-
-            Boolean isDefaultNic = false;
-            if (vm != null && (requested != null && requested.isDefaultNic())) {
-                isDefaultNic = true;
-            }
-
-            while (deviceIds[deviceId] && deviceId < deviceIds.length) {
-                deviceId++;
-            }
 
-            Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
-
-            NicProfile vmNic = vmNicPair.first();
-            if (vmNic == null) {
-                continue;
-            }
-
-            deviceId = vmNicPair.second();
-
-            int devId = vmNic.getDeviceId();
-            if (devId > deviceIds.length) {
-                throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
-            }
-            if (deviceIds[devId]) {
-                throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
-            }
-
-            deviceIds[devId] = true;
-
-            if (vmNic.isDefaultNic()) {
-                if (defaultNic != null) {
-                    throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+                int deviceId = 0;
+        
+                boolean[] deviceIds = new boolean[networks.size()];
+                Arrays.fill(deviceIds, false);
+        
+                List<NicProfile> nics = new ArrayList<NicProfile>(networks.size());
+                NicProfile defaultNic = null;
+        
+                for (Map.Entry<? extends Network, ? extends NicProfile> network : networks.entrySet()) {
+                    Network config = network.getKey();
+                    NicProfile requested = network.getValue();
+        
+                    Boolean isDefaultNic = false;
+                    if (vm != null && (requested != null && requested.isDefaultNic())) {
+                        isDefaultNic = true;
+                    }
+        
+                    while (deviceIds[deviceId] && deviceId < deviceIds.length) {
+                        deviceId++;
+                    }
+        
+                    Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
+        
+                    NicProfile vmNic = vmNicPair.first();
+                    if (vmNic == null) {
+                        continue;
+                    }
+        
+                    deviceId = vmNicPair.second();
+        
+                    int devId = vmNic.getDeviceId();
+                    if (devId > deviceIds.length) {
+                        throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
+                    }
+                    if (deviceIds[devId]) {
+                        throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
+                    }
+        
+                    deviceIds[devId] = true;
+        
+                    if (vmNic.isDefaultNic()) {
+                        if (defaultNic != null) {
+                            throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
+                        }
+                        defaultNic = vmNic;
+                    }
+        
+                    nics.add(vmNic);
+                    vm.addNic(vmNic);
+        
                 }
-                defaultNic = vmNic;
+        
+                if (nics.size() != networks.size()) {
+                    s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
+                    throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
+                }
+        
+                if (nics.size() == 1) {
+                    nics.get(0).setDefaultNic(true);
+                }
+                
+                return null;
             }
-
-            nics.add(vmNic);
-            vm.addNic(vmNic);
-
-        }
-
-        if (nics.size() != networks.size()) {
-            s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
-            throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
-        }
-
-        if (nics.size() == 1) {
-            nics.get(0).setDefaultNic(true);
-        }
-
-        txn.commit();
+        }, InsufficientCapacityException.class);
     }
 
     @DB
@@ -900,7 +906,6 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
     @DB
     public Pair<NetworkGuru, NetworkVO> implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
         ResourceUnavailableException, InsufficientCapacityException {
-        Transaction.currentTxn();
         Pair<NetworkGuru, NetworkVO> implemented = new Pair<NetworkGuru, NetworkVO>(null, null);
 
         NetworkVO network = _networksDao.findById(networkId);
@@ -1176,22 +1181,23 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
     }
 
     @DB
-    protected void updateNic(NicVO nic, long networkId, int count) {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        _nicDao.update(nic.getId(), nic);
-
-        if (nic.getVmType() == VirtualMachine.Type.User) {
-            s_logger.debug("Changing active number of nics for network id=" + networkId + " on " + count);
-            _networksDao.changeActiveNicsBy(networkId, count);
-        }
-
-        if (nic.getVmType() == VirtualMachine.Type.User ||
-            (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) {
-            _networksDao.setCheckForGc(networkId);
-        }
-
-        txn.commit();
+    protected void updateNic(final NicVO nic, final long networkId, final int count) {
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                _nicDao.update(nic.getId(), nic);
+        
+                if (nic.getVmType() == VirtualMachine.Type.User) {
+                    s_logger.debug("Changing active number of nics for network id=" + networkId + " on " + count);
+                    _networksDao.changeActiveNicsBy(networkId, count);
+                }
+        
+                if (nic.getVmType() == VirtualMachine.Type.User ||
+                    (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) {
+                    _networksDao.setCheckForGc(networkId);
+                }
+            }
+        });
     }
 
     @Override
@@ -1414,59 +1420,63 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
     }
 
     @DB
-    protected void releaseNic(VirtualMachineProfile vmProfile, long nicId) throws ConcurrentOperationException, ResourceUnavailableException {
-        //lock the nic
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        NicVO nic = _nicDao.lockRow(nicId, true);
-        if (nic == null) {
-            throw new ConcurrentOperationException("Unable to acquire lock on nic " + nic);
-        }
+    protected void releaseNic(final VirtualMachineProfile vmProfile, final long nicId) throws ConcurrentOperationException, ResourceUnavailableException {
+        Pair<Network,NicProfile> networkToRelease = Transaction.execute(new TransactionCallback<Pair<Network,NicProfile>>() {
+            @Override
+            public Pair<Network,NicProfile> doInTransaction(TransactionStatus status) {
+                NicVO nic = _nicDao.lockRow(nicId, true);
+                if (nic == null) {
+                    throw new ConcurrentOperationException("Unable to acquire lock on nic " + nic);
+                }
 
-        Nic.State originalState = nic.getState();
-        NetworkVO network = _networksDao.findById(nic.getNetworkId());
+                Nic.State originalState = nic.getState();
+                NetworkVO network = _networksDao.findById(nic.getNetworkId());
 
-        if (originalState == Nic.State.Reserved || originalState == Nic.State.Reserving) {
-            if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
-                NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
-                nic.setState(Nic.State.Releasing);
-                _nicDao.update(nic.getId(), nic);
-                NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, _networkModel.isSecurityGroupSupportedInNetwork(network),
-                    _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
-                if (guru.release(profile, vmProfile, nic.getReservationId())) {
-                    applyProfileToNicForRelease(nic, profile);
-                    nic.setState(Nic.State.Allocated);
-                    if (originalState == Nic.State.Reserved) {
-                        updateNic(nic, network.getId(), -1);
-                    } else {
+                if (originalState == Nic.State.Reserved || originalState == Nic.State.Reserving) {
+                    if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
+                        NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
+                        nic.setState(Nic.State.Releasing);
                         _nicDao.update(nic.getId(), nic);
+                        NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, _networkModel.isSecurityGroupSupportedInNetwork(network),
+                            _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
+                        if (guru.release(profile, vmProfile, nic.getReservationId())) {
+                            applyProfileToNicForRelease(nic, profile);
+                            nic.setState(Nic.State.Allocated);
+                            if (originalState == Nic.State.Reserved) {
+                                updateNic(nic, network.getId(), -1);
+                            } else {
+                                _nicDao.update(nic.getId(), nic);
+                            }
+                        }
+                        // Perform release on network elements
+                        return new Pair<Network,NicProfile>(network, profile);
+                    } else {
+                        nic.setState(Nic.State.Allocated);
+                        updateNic(nic, network.getId(), -1);
                     }
                 }
-                //commit the transaction before proceeding releasing nic profile on the network elements
-                txn.commit();
 
-                // Perform release on network elements
-                List<Provider> providersToImplement = getNetworkProviders(network.getId());
-                for (NetworkElement element : _networkElements) {
-                    if (providersToImplement.contains(element.getProvider())) {
-                        if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
-                            throw new CloudRuntimeException("Service provider " + element.getProvider().getName() +
-                                                            " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
-                        }
-                        if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("Asking " + element.getName() + " to release " + nic);
-                        }
-                        //NOTE: Context appear to never be used in release method
-                        //implementations. Consider removing it from interface Element
-                        element.release(network, profile, vmProfile, null);
+                return null;
+            }
+        });
+
+        if (networkToRelease != null) {
+            Network network = networkToRelease.first();
+            NicProfile profile = networkToRelease.second();
+            List<Provider> providersToImplement = getNetworkProviders(network.getId());
+            for (NetworkElement element : _networkElements) {
+                if (providersToImplement.contains(element.getProvider())) {
+                    if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
+                        throw new CloudRuntimeException("Service provider " + element.getProvider().getName() +
+                                                        " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
                     }
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Asking " + element.getName() + " to release " + profile);
+                    }
+                    //NOTE: Context appear to never be used in release method
+                    //implementations. Consider removing it from interface Element
+                    element.release(network, profile, vmProfile, null);
                 }
-
-            } else {
-                nic.setState(Nic.State.Allocated);
-                updateNic(nic, network.getId(), -1);
-                txn.commit();
             }
         }
     }
@@ -1563,15 +1573,17 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         Network network = _networksDao.findById(nic.getNetworkId());
         DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network);
         try {
-            NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(nic.getGateway(), network.getId(), NicIpAlias.state.active);
+            final NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(nic.getGateway(), network.getId(), NicIpAlias.state.active);
             if (ipAlias != null) {
                 ipAlias.setState(NicIpAlias.state.revoked);
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                _nicIpAliasDao.update(ipAlias.getId(), ipAlias);
-                IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address());
-                _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId());
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                    _nicIpAliasDao.update(ipAlias.getId(), ipAlias);
+                    IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address());
+                    _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId());
+                    }
+                });
                 if (!dhcpServiceProvider.removeDhcpSupportForSubnet(network)) {
                     s_logger.warn("Failed to remove the ip alias on the router, marking it as removed in db and freed the allocated ip " + ipAlias.getIp4Address());
                 }
@@ -1593,18 +1605,18 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
 
     @Override
     @DB
-    public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, String networkDomain, Account owner,
-        Long domainId, PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr,
-        Boolean isDisplayNetworkEnabled, String isolatedPvlan) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
+    public Network createGuestNetwork(long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, String networkDomain, final Account owner,
+        final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr,
+        final Boolean isDisplayNetworkEnabled, final String isolatedPvlan) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
 
-        NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
+        final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
         // this method supports only guest network creation
         if (ntwkOff.getTrafficType() != TrafficType.Guest) {
             s_logger.warn("Only guest networks can be created using this method");
             return null;
         }
 
-        boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, aclType);
+        final boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, aclType);
         //check resource limits
         if (updateResourceCount) {
             _resourceLimitMgr.checkResourceLimit(owner, ResourceType.network);
@@ -1632,7 +1644,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
             ipv6 = true;
         }
         // Validate zone
-        DataCenterVO zone = _dcDao.findById(zoneId);
+        final DataCenterVO zone = _dcDao.findById(zoneId);
         if (zone.getNetworkType() == NetworkType.Basic) {
             if (ipv6) {
                 throw new InvalidParameterValueException("IPv6 is not supported in Basic zone");
@@ -1819,79 +1831,84 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        Long physicalNetworkId = null;
-        if (pNtwk != null) {
-            physicalNetworkId = pNtwk.getId();
-        }
-        DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
-        NetworkVO userNetwork = new NetworkVO();
-        userNetwork.setNetworkDomain(networkDomain);
-
-        if (cidr != null && gateway != null) {
-            userNetwork.setCidr(cidr);
-            userNetwork.setGateway(gateway);
-        }
-
-        if (ip6Cidr != null && ip6Gateway != null) {
-            userNetwork.setIp6Cidr(ip6Cidr);
-            userNetwork.setIp6Gateway(ip6Gateway);
-        }
-
-        if (vlanId != null) {
-        	if (isolatedPvlan == null) {
-                URI uri = BroadcastDomainType.fromString(vlanId);
-                userNetwork.setBroadcastUri(uri);
-        		if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
-        			userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
-        		} else {
-        			userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
-        		}
-        	} else {
-        		if (vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
-        			throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
-        		}
-        		userNetwork.setBroadcastUri(NetUtils.generateUriForPvlan(vlanId, isolatedPvlan));
-        		userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
-        	}
-        }
+        final String networkDomainFinal = networkDomain;
+        final String vlanIdFinal = vlanId;
+        final Boolean subdomainAccessFinal = subdomainAccess;
+        Network network = Transaction.execute(new TransactionCallback<Network>() {
+            @Override
+            public Network doInTransaction(TransactionStatus status) {
+                Long physicalNetworkId = null;
+                if (pNtwk != null) {
+                    physicalNetworkId = pNtwk.getId();
+                }
+                DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
+                NetworkVO userNetwork = new NetworkVO();
+                userNetwork.setNetworkDomain(networkDomainFinal);
         
-        List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccess, vpcId,
-            isDisplayNetworkEnabled);
-
-        Network network = null;
-        if (networks == null || networks.isEmpty()) {
-            throw new CloudRuntimeException("Fail to create a network");
-        } else {
-            if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
-                Network defaultGuestNetwork = networks.get(0);
-                for (Network nw : networks) {
-                    if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
-                        defaultGuestNetwork = nw;
+                if (cidr != null && gateway != null) {
+                    userNetwork.setCidr(cidr);
+                    userNetwork.setGateway(gateway);
+                }
+        
+                if (ip6Cidr != null && ip6Gateway != null) {
+                    userNetwork.setIp6Cidr(ip6Cidr);
+                    userNetwork.setIp6Gateway(ip6Gateway);
+                }
+        
+                if (vlanIdFinal != null) {
+                	if (isolatedPvlan == null) {
+                        URI uri = BroadcastDomainType.fromString(vlanIdFinal);
+                        userNetwork.setBroadcastUri(uri);
+                		if (!vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
+                			userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
+                		} else {
+                			userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
+                		}
+                	} else {
+                		if (vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
+                			throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
+                		}
+                		userNetwork.setBroadcastUri(NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan));
+                		userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
+                	}
+                }
+                
+                List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId,
+                    isDisplayNetworkEnabled);
+        
+                Network network = null;
+                if (networks == null || networks.isEmpty()) {
+                    throw new CloudRuntimeException("Fail to create a network");
+                } else {
+                    if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
+                        Network defaultGuestNetwork = networks.get(0);
+                        for (Network nw : networks) {
+                            if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
+                                defaultGuestNetwork = nw;
+                            }
+                        }
+                        network = defaultGuestNetwork;
+                    } else {
+                        // For shared network
+                        network = networks.get(0);
                     }
                 }
-                network = defaultGuestNetwork;
-            } else {
-                // For shared network
-                network = networks.get(0);
+        
+                if (updateResourceCount) {
+                    _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network);
+                }
+                
+                return network;
             }
-        }
-
-        if (updateResourceCount) {
-            _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network);
-        }
+        });
 
-        txn.commit();
         CallContext.current().setEventDetails("Network Id: " + network.getId());
         return network;
     }
 
     @Override
     @DB
-    public boolean shutdownNetwork(long networkId, ReservationContext context, boolean cleanupElements) {
-        boolean result = false;
+    public boolean shutdownNetwork(final long networkId, ReservationContext context, boolean cleanupElements) {
         NetworkVO network = _networksDao.findById(networkId);
         if (network.getState() == Network.State.Allocated) {
             s_logger.debug("Network is already shutdown: " + network);
@@ -1936,43 +1953,51 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
                 }
             }
 
-            boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network);
+            final boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network);
 
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            if (success) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now.");
-                }
-                NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
-                NetworkProfile profile = convertNetworkToNetworkProfile(network.getId());
-                guru.shutdown(profile, _networkOfferingDao.findById(network.getNetworkOfferingId()));
+            final NetworkVO networkFinal = network;
+            boolean result = Transaction.execute(new TransactionCallback<Boolean>() {
+                @Override
+                public Boolean doInTransaction(TransactionStatus status) {
+                    boolean result = false;
 
-                applyProfileToNetwork(network, profile);
-                DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
-                if (isSharedNetworkOfferingWithServices(network.getNetworkOfferingId()) && (zone.getNetworkType() == NetworkType.Advanced)) {
-                    network.setState(Network.State.Setup);
-                } else {
-                    try {
-                        stateTransitTo(network, Event.OperationSucceeded);
-                    } catch (NoTransitionException e) {
-                        network.setState(Network.State.Allocated);
-                        network.setRestartRequired(false);
+                    if (success) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now.");
+                        }
+                        NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, networkFinal.getGuruName());
+                        NetworkProfile profile = convertNetworkToNetworkProfile(networkFinal.getId());
+                        guru.shutdown(profile, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()));
+        
+                        applyProfileToNetwork(networkFinal, profile);
+                        DataCenterVO zone = _dcDao.findById(networkFinal.getDataCenterId());
+                        if (isSharedNetworkOfferingWithServices(networkFinal.getNetworkOfferingId()) && (zone.getNetworkType() == NetworkType.Advanced)) {
+                            networkFinal.setState(Network.State.Setup);
+                        } else {
+                            try {
+                                stateTransitTo(networkFinal, Event.OperationSucceeded);
+                            } catch (NoTransitionException e) {
+                                networkFinal.setState(Network.State.Allocated);
+                                networkFinal.setRestartRequired(false);
+                            }
+                        }
+                        _networksDao.update(networkFinal.getId(), networkFinal);
+                        _networksDao.clearCheckForGc(networkId);
+                        result = true;
+                    } else {
+                        try {
+                            stateTransitTo(networkFinal, Event.OperationFailed);
+                        } catch (NoTransitionException e) {
+                            networkFinal.setState(Network.State.Implemented);
+                            _networksDao.update(networkFinal.getId(), networkFinal);
+                        }
+                        result = false;
                     }
+
+                    return result;
                 }
-                _networksDao.update(network.getId(), network);
-                _networksDao.clearCheckForGc(networkId);
-                result = true;
-            } else {
-                try {
-                    stateTransitTo(network, Event.OperationFailed);
-                } catch (NoTransitionException e) {
-                    network.setState(Network.State.Implemented);
-                    _networksDao.update(network.getId(), network);
-                }
-                result = false;
-            }
-            txn.commit();
+            });
+
             return result;
         } finally {
             if (network != null) {
@@ -2036,8 +2061,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
 
     @Override
     @DB
-    public boolean destroyNetwork(long networkId, ReservationContext context) {
-        Account callerAccount = context.getAccount();
+    public boolean destroyNetwork(long networkId, final ReservationContext context) {
+        final Account callerAccount = context.getAccount();
 
         NetworkVO network = _networksDao.findById(networkId);
         if (network == null) {
@@ -2126,38 +2151,48 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Network id=" + networkId + " is destroyed successfully, cleaning up corresponding resources now.");
             }
-            NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
-
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            guru.trash(network, _networkOfferingDao.findById(network.getNetworkOfferingId()));
 
-            if (!deleteVlansInNetwork(network.getId(), context.getCaller().getId(), callerAccount)) {
-                success = false;
-                s_logger.warn("Failed to delete network " + network + "; was unable to cleanup corresponding ip ranges");
-            } else {
-                // commit transaction only when ips and vlans for the network are released successfully
-                try {
-                    stateTransitTo(network, Event.DestroyNetwork);
-                } catch (NoTransitionException e) {
-                    s_logger.debug(e.getMessage());
-                }
-                if (_networksDao.remove(network.getId())) {
-                    NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(network.getId());
-                    if (networkDomain != null)
-                        _networkDomainDao.remove(networkDomain.getId());
-
-                    NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(network.getId());
-                    if (networkAccount != null)
-                        _networkAccountDao.remove(networkAccount.getId());
-                }
-
-                NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, network.getNetworkOfferingId());
-                boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, network.getAclType());
-                if (updateResourceCount) {
-                    _resourceLimitMgr.decrementResourceCount(network.getAccountId(), ResourceType.network);
-                }
-                txn.commit();
+            final NetworkVO networkFinal = network;
+            try {
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, networkFinal.getGuruName());
+    
+                        guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()));
+    
+                        if (!deleteVlansInNetwork(networkFinal.getId(), context.getCaller().getId(), callerAccount)) {
+                            s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
+                            throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
+                        } else {
+                            // commit transaction only when ips and vlans for the network are released successfully
+                            try {
+                                stateTransitTo(networkFinal, Event.DestroyNetwork);
+                            } catch (NoTransitionException e) {
+                                s_logger.debug(e.getMessage());
+                            }
+                            if (_networksDao.remove(networkFinal.getId())) {
+                                NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(networkFinal.getId());
+                                if (networkDomain != null)
+                                    _networkDomainDao.remove(networkDomain.getId());
+    
+                                NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(networkFinal.getId());
+                                if (networkAccount != null)
+                                    _networkAccountDao.remove(networkAccount.getId());
+                            }
+    
+                            NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, networkFinal.getNetworkOfferingId());
+                            boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, networkFinal.getAclType());
+                            if (updateResourceCount) {
+                                _resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network);
+                            }
+                        }
+                    }
+                });
+                return false;
+            } catch ( CloudRuntimeException e ) {
+                s_logger.error("Failed to delete network", e);
+                return false;
             }
         }
 
@@ -2426,24 +2461,24 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
 
     @DB
     @Override
-    public boolean reallocate(VirtualMachineProfile vm, DataCenterDeployment dest) throws InsufficientCapacityException, ConcurrentOperationException {
+    public boolean reallocate(final VirtualMachineProfile vm, DataCenterDeployment dest) throws InsufficientCapacityException, ConcurrentOperationException {
         VMInstanceVO vmInstance = _vmDao.findById(vm.getId());
         DataCenterVO dc = _dcDao.findById(vmInstance.getDataCenterId());
         if (dc.getNetworkType() == NetworkType.Basic) {
             List<NicVO> nics = _nicDao.listByVmId(vmInstance.getId());
             NetworkVO network = _networksDao.findById(nics.get(0).getNetworkId());
-            LinkedHashMap<Network, NicProfile> profiles = new LinkedHashMap<Network, NicProfile>();
+            final LinkedHashMap<Network, NicProfile> profiles = new LinkedHashMap<Network, NicProfile>();
             profiles.put(network, null);
 
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
+            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                @Override
+                public Object doInTransaction(TransactionStatus status) throws Exception {
+                    cleanupNics(vm);
+                    allocate(vm, profiles);
 
-            try {
-                cleanupNics(vm);
-                allocate(vm, profiles);
-            } finally {
-                txn.commit();
-            }
+                    return null;
+                }
+            }, InsufficientCapacityException.class);
         }
         return true;
     }
@@ -3050,17 +3085,20 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
         return nic.getSecondaryIp();
     }
 
-    private boolean removeVmSecondaryIpsOfNic(long nicId) {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        List<NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
-        if (ipList != null) {
-            for (NicSecondaryIpVO ip : ipList) {
-                _nicSecondaryIpDao.remove(ip.getId());
+    private boolean removeVmSecondaryIpsOfNic(final long nicId) {
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                List<NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
+                if (ipList != null) {
+                    for (NicSecondaryIpVO ip : ipList) {
+                        _nicSecondaryIpDao.remove(ip.getId());
+                    }
+                    s_logger.debug("Revoving nic secondary ip entry ...");
+                }
             }
-            s_logger.debug("Revoving nic secondary ip entry ...");
-        }
-        txn.commit();
+        });
+
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index 0817393..7d81232 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -31,7 +31,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -97,6 +96,9 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
@@ -681,9 +683,7 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
     }
 
     @DB
-    protected VolumeVO switchVolume(VolumeVO existingVolume, VirtualMachineProfile vm) throws StorageUnavailableException {
-        Transaction txn = Transaction.currentTxn();
-
+    protected VolumeVO switchVolume(final VolumeVO existingVolume, final VirtualMachineProfile vm) throws StorageUnavailableException {
         Long templateIdToUse = null;
         Long volTemplateId = existingVolume.getTemplateId();
         long vmTemplateId = vm.getTemplateId();
@@ -695,22 +695,26 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
             templateIdToUse = vmTemplateId;
         }
 
-        txn.start();
-        VolumeVO newVolume = allocateDuplicateVolumeVO(existingVolume, templateIdToUse);
-        // In case of Vmware if vm reference is not removed then during root
-        // disk cleanup
-        // the vm also gets deleted, so remove the reference
-        if (vm.getHypervisorType() == HypervisorType.VMware) {
-            _volsDao.detachVolume(existingVolume.getId());
-        }
-        try {
-            stateTransitTo(existingVolume, Volume.Event.DestroyRequested);
-        } catch (NoTransitionException e) {
-            s_logger.debug("Unable to destroy existing volume: " + e.toString());
-        }
-        txn.commit();
-        return newVolume;
-
+        final Long templateIdToUseFinal = templateIdToUse; 
+        return Transaction.execute(new TransactionCallback<VolumeVO>() {
+            @Override
+            public VolumeVO doInTransaction(TransactionStatus status) {
+                VolumeVO newVolume = allocateDuplicateVolumeVO(existingVolume, templateIdToUseFinal);
+                // In case of Vmware if vm reference is not removed then during root
+                // disk cleanup
+                // the vm also gets deleted, so remove the reference
+                if (vm.getHypervisorType() == HypervisorType.VMware) {
+                    _volsDao.detachVolume(existingVolume.getId());
+                }
+                try {
+                    stateTransitTo(existingVolume, Volume.Event.DestroyRequested);
+                } catch (NoTransitionException e) {
+                    s_logger.debug("Unable to destroy existing volume: " + e.toString());
+                }
+                
+                return newVolume;
+            }
+        });
     }
 
     @Override
@@ -724,28 +728,32 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Cleaning storage for vm: " + vmId);
         }
-        List<VolumeVO> volumesForVm = _volsDao.findByInstance(vmId);
-        List<VolumeVO> toBeExpunged = new ArrayList<VolumeVO>();
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        for (VolumeVO vol : volumesForVm) {
-            if (vol.getVolumeType().equals(Type.ROOT)) {
-                // Destroy volume if not already destroyed
-                boolean volumeAlreadyDestroyed = (vol.getState() == Volume.State.Destroy || vol.getState() == Volume.State.Expunged || vol.getState() == Volume.State.Expunging);
-                if (!volumeAlreadyDestroyed) {
-                    volService.destroyVolume(vol.getId());
-                } else {
-                    s_logger.debug("Skipping destroy for the volume " + vol + " as its in state " + vol.getState().toString());
-                }
-                toBeExpunged.add(vol);
-            } else {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Detaching " + vol);
+        final List<VolumeVO> volumesForVm = _volsDao.findByInstance(vmId);
+        final List<VolumeVO> toBeExpunged = new ArrayList<VolumeVO>();
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (VolumeVO vol : volumesForVm) {
+                    if (vol.getVolumeType().equals(Type.ROOT)) {
+                        // Destroy volume if not already destroyed
+                        boolean volumeAlreadyDestroyed = (vol.getState() == Volume.State.Destroy || vol.getState() == Volume.State.Expunged || vol.getState() == Volume.State.Expunging);
+                        if (!volumeAlreadyDestroyed) {
+                            volService.destroyVolume(vol.getId());
+                        } else {
+                            s_logger.debug("Skipping destroy for the volume " + vol + " as its in state " + vol.getState().toString());
+                        }
+                        toBeExpunged.add(vol);
+                    } else {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Detaching " + vol);
+                        }
+                        _volsDao.detachVolume(vol.getId());
+                    }
                 }
-                _volsDao.detachVolume(vol.getId());
             }
-        }
-        txn.commit();
+        });
+
         AsyncCallFuture<VolumeApiResult> future = null;
         for (VolumeVO expunge : toBeExpunged) {
             future = volService.expungeVolumeAsync(volFactory.getVolume(expunge.getId()));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java b/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
index 7c0a562..57102cb 100755
--- a/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
+++ b/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
@@ -29,7 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { AlertDao.class })
@@ -116,7 +116,7 @@ public class AlertDaoImpl extends GenericDaoBase<AlertVO, Long> implements Alert
             return result;
         }
         if (alerts != null && !alerts.isEmpty()) {
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             txn.start();
             for (AlertVO alert : alerts) {
                 alert = lockRow(alert.getId(), true);


[07/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 6e326b0..83f0493 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -26,7 +26,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -76,8 +75,11 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
@@ -197,12 +199,12 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD, eventDescription = "creating forwarding rule", create = true)
-    public PortForwardingRule createPortForwardingRule(PortForwardingRule rule, Long vmId, Ip vmIp, boolean openFirewall)
+    public PortForwardingRule createPortForwardingRule(final PortForwardingRule rule, final Long vmId, Ip vmIp, final boolean openFirewall)
             throws NetworkRuleConflictException {
         CallContext ctx = CallContext.current();
-        Account caller = ctx.getCallingAccount();
+        final Account caller = ctx.getCallingAccount();
 
-        Long ipAddrId = rule.getSourceIpAddressId();
+        final Long ipAddrId = rule.getSourceIpAddressId();
 
         IPAddressVO ipAddress = _ipAddressDao.findById(ipAddrId);
 
@@ -213,7 +215,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
             throw new InvalidParameterValueException("Unable to create port forwarding rule; ip id=" + ipAddrId + " has static nat enabled");
         }
 
-        Long networkId = rule.getNetworkId();
+        final Long networkId = rule.getNetworkId();
         Network network = _networkModel.getNetwork(networkId);
         //associate ip address to network (if needed)
         boolean performedIpAssoc = false;
@@ -245,8 +247,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
             _firewallMgr.validateFirewallRule(caller, ipAddress, rule.getSourcePortStart(), rule.getSourcePortEnd(),
                     rule.getProtocol(), Purpose.PortForwarding, FirewallRuleType.User, networkId, rule.getTrafficType());
 
-            Long accountId = ipAddress.getAllocatedToAccountId();
-            Long domainId = ipAddress.getAllocatedInDomainId();
+            final Long accountId = ipAddress.getAllocatedToAccountId();
+            final Long domainId = ipAddress.getAllocatedInDomainId();
 
             // start port can't be bigger than end port
             if (rule.getDestinationPortStart() > rule.getDestinationPortEnd()) {
@@ -308,46 +310,48 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
                 }
             }
 
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-
-            PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(),
-                    rule.getSourcePortStart(), rule.getSourcePortEnd(), dstIp, rule.getDestinationPortStart(),
-                    rule.getDestinationPortEnd(), rule.getProtocol().toLowerCase(), networkId, accountId, domainId, vmId);
-            newRule = _portForwardingDao.persist(newRule);
-
-            // create firewallRule for 0.0.0.0/0 cidr
-            if (openFirewall) {
-                _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(),
-                        rule.getProtocol(), null, null, newRule.getId(), networkId);
-            }
-
-            try {
-                _firewallMgr.detectRulesConflict(newRule);
-                if (!_firewallDao.setStateToAdd(newRule)) {
-                    throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
-                }
-                CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(),
-                        ipAddress.getDataCenterId(), newRule.getId(), null, PortForwardingRule.class.getName(),
-                        newRule.getUuid());
-                txn.commit();
-                return newRule;
-            } catch (Exception e) {
-                if (newRule != null) {
-                    txn.start();
-                    // no need to apply the rule as it wasn't programmed on the backend yet
-                    _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
-                    removePFRule(newRule);
-                    txn.commit();
-                }
-
-                if (e instanceof NetworkRuleConflictException) {
-                    throw (NetworkRuleConflictException) e;
+            final Ip dstIpFinal = dstIp;
+            final IPAddressVO ipAddressFinal = ipAddress;
+            return Transaction.executeWithException(new TransactionCallbackWithException<PortForwardingRuleVO>() {
+                @Override
+                public PortForwardingRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                    PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(),
+                            rule.getSourcePortStart(), rule.getSourcePortEnd(), dstIpFinal, rule.getDestinationPortStart(),
+                            rule.getDestinationPortEnd(), rule.getProtocol().toLowerCase(), networkId, accountId, domainId, vmId);
+                    newRule = _portForwardingDao.persist(newRule);
+        
+                    // create firewallRule for 0.0.0.0/0 cidr
+                    if (openFirewall) {
+                        _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(),
+                                rule.getProtocol(), null, null, newRule.getId(), networkId);
+                    }
+        
+                    try {
+                        _firewallMgr.detectRulesConflict(newRule);
+                        if (!_firewallDao.setStateToAdd(newRule)) {
+                            throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+                        }
+                        CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
+                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(),
+                                ipAddressFinal.getDataCenterId(), newRule.getId(), null, PortForwardingRule.class.getName(),
+                                newRule.getUuid());
+                        return newRule;
+                    } catch (Exception e) {
+                        if (newRule != null) {
+                            // no need to apply the rule as it wasn't programmed on the backend yet
+                            _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
+                            removePFRule(newRule);
+                        }
+        
+                        if (e instanceof NetworkRuleConflictException) {
+                            throw (NetworkRuleConflictException) e;
+                        }
+        
+                        throw new CloudRuntimeException("Unable to add rule for the ip id=" + ipAddrId, e);
+                    }
                 }
+            }, NetworkRuleConflictException.class);
 
-                throw new CloudRuntimeException("Unable to add rule for the ip id=" + ipAddrId, e);
-            }
         } finally {
             // release ip address if ipassoc was perfored
             if (performedIpAssoc) {
@@ -361,10 +365,10 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD, eventDescription = "creating static nat rule", create = true)
-    public StaticNatRule createStaticNatRule(StaticNatRule rule, boolean openFirewall) throws NetworkRuleConflictException {
-        Account caller = CallContext.current().getCallingAccount();
+    public StaticNatRule createStaticNatRule(final StaticNatRule rule, final boolean openFirewall) throws NetworkRuleConflictException {
+        final Account caller = CallContext.current().getCallingAccount();
 
-        Long ipAddrId = rule.getSourceIpAddressId();
+        final Long ipAddrId = rule.getSourceIpAddressId();
 
         IPAddressVO ipAddress = _ipAddressDao.findById(ipAddrId);
 
@@ -377,9 +381,9 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
 
         _firewallMgr.validateFirewallRule(caller, ipAddress, rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol(), Purpose.StaticNat, FirewallRuleType.User,null, rule.getTrafficType() );
 
-        Long networkId = ipAddress.getAssociatedWithNetworkId();
-        Long accountId = ipAddress.getAllocatedToAccountId();
-        Long domainId = ipAddress.getAllocatedInDomainId();
+        final Long networkId = ipAddress.getAssociatedWithNetworkId();
+        final Long accountId = ipAddress.getAllocatedToAccountId();
+        final Long domainId = ipAddress.getAllocatedInDomainId();
 
         _networkModel.checkIpForService(ipAddress, Service.StaticNat, null);
 
@@ -390,48 +394,48 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
         }
 
         //String dstIp = _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(), networkId);
-        String dstIp = ipAddress.getVmIp();
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        final String dstIp = ipAddress.getVmIp();
+        return Transaction.executeWithException(new TransactionCallbackWithException<StaticNatRule>() {
+            @Override
+            public StaticNatRule doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
 
-        FirewallRuleVO newRule = new FirewallRuleVO(rule.getXid(), rule.getSourceIpAddressId(), rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol().toLowerCase(),
-                networkId, accountId, domainId, rule.getPurpose(), null, null, null, null, null);
+                FirewallRuleVO newRule = new FirewallRuleVO(rule.getXid(), rule.getSourceIpAddressId(), rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol().toLowerCase(),
+                        networkId, accountId, domainId, rule.getPurpose(), null, null, null, null, null);
 
-        newRule = _firewallDao.persist(newRule);
+                newRule = _firewallDao.persist(newRule);
 
-        // create firewallRule for 0.0.0.0/0 cidr
-        if (openFirewall) {
-            _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol(), null, null, newRule.getId(), networkId);
-        }
+                // create firewallRule for 0.0.0.0/0 cidr
+                if (openFirewall) {
+                    _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol(), null, null, newRule.getId(), networkId);
+                }
 
-        try {
-            _firewallMgr.detectRulesConflict(newRule);
-            if (!_firewallDao.setStateToAdd(newRule)) {
-                throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
-            }
-            CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(), 0, newRule.getId(),
-                    null, FirewallRule.class.getName(), newRule.getUuid());
-
-            txn.commit();
-            StaticNatRule staticNatRule = new StaticNatRuleImpl(newRule, dstIp);
-
-            return staticNatRule;
-        } catch (Exception e) {
-
-            if (newRule != null) {
-                txn.start();
-                // no need to apply the rule as it wasn't programmed on the backend yet
-                _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
-                _firewallMgr.removeRule(newRule);
-                txn.commit();
-            }
+                try {
+                    _firewallMgr.detectRulesConflict(newRule);
+                    if (!_firewallDao.setStateToAdd(newRule)) {
+                        throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+                    }
+                    CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(), 0, newRule.getId(),
+                            null, FirewallRule.class.getName(), newRule.getUuid());
+
+                    StaticNatRule staticNatRule = new StaticNatRuleImpl(newRule, dstIp);
+
+                    return staticNatRule;
+                } catch (Exception e) {
+                    if (newRule != null) {
+                        // no need to apply the rule as it wasn't programmed on the backend yet
+                        _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
+                        _firewallMgr.removeRule(newRule);
+                    }
 
-            if (e instanceof NetworkRuleConflictException) {
-                throw (NetworkRuleConflictException) e;
+                    if (e instanceof NetworkRuleConflictException) {
+                        throw (NetworkRuleConflictException) e;
+                    }
+                    throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e);
+                }
             }
-            throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e);
-        }
+        }, NetworkRuleConflictException.class);
+
     }
 
     @Override
@@ -1146,23 +1150,27 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
 
     @Override
     @DB
-    public FirewallRuleVO[] reservePorts(IpAddress ip, String protocol, FirewallRule.Purpose purpose,
-            boolean openFirewall, Account caller, int... ports) throws NetworkRuleConflictException {
-        FirewallRuleVO[] rules = new FirewallRuleVO[ports.length];
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        for (int i = 0; i < ports.length; i++) {
-
-            rules[i] = new FirewallRuleVO(null, ip.getId(), ports[i], protocol, ip.getAssociatedWithNetworkId(), ip.getAllocatedToAccountId(), ip.getAllocatedInDomainId(), purpose, null, null, null, null);
-            rules[i] = _firewallDao.persist(rules[i]);
-
-            if (openFirewall) {
-                _firewallMgr.createRuleForAllCidrs(ip.getId(), caller, ports[i], ports[i], protocol, null, null,
-                        rules[i].getId(), ip.getAssociatedWithNetworkId());
+    public FirewallRuleVO[] reservePorts(final IpAddress ip, final String protocol, final FirewallRule.Purpose purpose,
+            final boolean openFirewall, final Account caller, final int... ports) throws NetworkRuleConflictException {
+        final FirewallRuleVO[] rules = new FirewallRuleVO[ports.length];
+
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                for (int i = 0; i < ports.length; i++) {
+        
+                    rules[i] = new FirewallRuleVO(null, ip.getId(), ports[i], protocol, ip.getAssociatedWithNetworkId(), ip.getAllocatedToAccountId(), ip.getAllocatedInDomainId(), purpose, null, null, null, null);
+                    rules[i] = _firewallDao.persist(rules[i]);
+        
+                    if (openFirewall) {
+                        _firewallMgr.createRuleForAllCidrs(ip.getId(), caller, ports[i], ports[i], protocol, null, null,
+                                rules[i].getId(), ip.getAssociatedWithNetworkId());
+                    }
+                }
+                
+                return null;
             }
-        }
-        txn.commit();
+        }, NetworkRuleConflictException.class);
 
         boolean success = false;
         try {
@@ -1173,12 +1181,14 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
             return rules;
         } finally {
             if (!success) {
-                txn.start();
-
-                for (FirewallRuleVO newRule : rules) {
-                    _firewallMgr.removeRule(newRule);
-                }
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        for (FirewallRuleVO newRule : rules) {
+                            _firewallMgr.removeRule(newRule);
+                        }
+                    }
+                });
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
index 8b2db9d..85b01b3 100755
--- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
+++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.ConcurrentModificationException;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -34,6 +35,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import javax.ejb.ConcurrentAccessException;
 import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
@@ -96,6 +98,10 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.utils.net.NetUtils;
@@ -191,12 +197,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         @Override
         protected void runInContext() {
             try {
-                Transaction txn = Transaction.open("SG Work");
-                try {
-                    work();
-                } finally {
-                    txn.close("SG Work");
-                }
+                work();
             } catch (Throwable th) {
                 try {
                     s_logger.error("Problem with SG work", th);
@@ -204,24 +205,15 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
                 }
             }
         }
-
-        WorkerThread() {
-
-        }
     }
 
     public class CleanupThread extends ManagedContextRunnable {
         @Override
         protected void runInContext() {
             try {
-                Transaction txn = Transaction.open("SG Cleanup");
-                try {
-                    cleanupFinishedWork();
-                    cleanupUnfinishedWork();
-                    //processScheduledWork();
-                } finally {
-                    txn.close("SG Cleanup");
-                }
+                cleanupFinishedWork();
+                cleanupUnfinishedWork();
+                //processScheduledWork();
             } catch (Throwable th) {
                 try {
                     s_logger.error("Problem with SG Cleanup", th);
@@ -229,10 +221,6 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
                 }
             }
         }
-
-        CleanupThread() {
-
-        }
     }
 
     public static class PortAndProto implements Comparable<PortAndProto> {
@@ -400,7 +388,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
     }
 
     @DB
-    public void scheduleRulesetUpdateToHosts(List<Long> affectedVms, boolean updateSeqno, Long delayMs) {
+    public void scheduleRulesetUpdateToHosts(final List<Long> affectedVms, final boolean updateSeqno, Long delayMs) {
         if (affectedVms.size() == 0) {
             return;
         }
@@ -422,39 +410,43 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         if (s_logger.isTraceEnabled()) {
             s_logger.trace("Security Group Mgr: acquired global work lock");
         }
-        Transaction txn = Transaction.currentTxn();
+        
         try {
-            txn.start();
-            for (Long vmId : affectedVms) {
-                if (s_logger.isTraceEnabled()) {
-                    s_logger.trace("Security Group Mgr: scheduling ruleset update for " + vmId);
-                }
-                VmRulesetLogVO log = null;
-                SecurityGroupWorkVO work = null;
-
-                log = _rulesetLogDao.findByVmId(vmId);
-                if (log == null) {
-                    log = new VmRulesetLogVO(vmId);
-                    log = _rulesetLogDao.persist(log);
-                }
-
-                if (log != null && updateSeqno) {
-                    log.incrLogsequence();
-                    _rulesetLogDao.update(log.getId(), log);
-                }
-                work = _workDao.findByVmIdStep(vmId, Step.Scheduled);
-                if (work == null) {
-                    work = new SecurityGroupWorkVO(vmId, null, null, SecurityGroupWork.Step.Scheduled, null);
-                    work = _workDao.persist(work);
-                    if (s_logger.isTraceEnabled()) {
-                        s_logger.trace("Security Group Mgr: created new work item for " + vmId + "; id = " + work.getId());
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    for (Long vmId : affectedVms) {
+                        if (s_logger.isTraceEnabled()) {
+                            s_logger.trace("Security Group Mgr: scheduling ruleset update for " + vmId);
+                        }
+                        VmRulesetLogVO log = null;
+                        SecurityGroupWorkVO work = null;
+        
+                        log = _rulesetLogDao.findByVmId(vmId);
+                        if (log == null) {
+                            log = new VmRulesetLogVO(vmId);
+                            log = _rulesetLogDao.persist(log);
+                        }
+        
+                        if (log != null && updateSeqno) {
+                            log.incrLogsequence();
+                            _rulesetLogDao.update(log.getId(), log);
+                        }
+                        work = _workDao.findByVmIdStep(vmId, Step.Scheduled);
+                        if (work == null) {
+                            work = new SecurityGroupWorkVO(vmId, null, null, SecurityGroupWork.Step.Scheduled, null);
+                            work = _workDao.persist(work);
+                            if (s_logger.isTraceEnabled()) {
+                                s_logger.trace("Security Group Mgr: created new work item for " + vmId + "; id = " + work.getId());
+                            }
+                        }
+        
+                        work.setLogsequenceNumber(log.getLogsequence());
+                        _workDao.update(work.getId(), work);
                     }
                 }
+            });
 
-                work.setLogsequenceNumber(log.getLogsequence());
-                _workDao.update(work.getId(), work);
-            }
-            txn.commit();
             for (Long vmId : affectedVms) {
                 _executorPool.schedule(new WorkerThread(), delayMs, TimeUnit.MILLISECONDS);
             }
@@ -595,7 +587,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         return authorizeSecurityGroupRule(securityGroupId,protocol,startPort,endPort,icmpType,icmpCode,cidrList,groupList,SecurityRuleType.IngressRule);
     }
 
-    private List<SecurityGroupRuleVO> authorizeSecurityGroupRule(Long securityGroupId,String protocol,Integer startPort,Integer endPort,Integer icmpType,Integer icmpCode,List<String>  cidrList,Map groupList,SecurityRuleType ruleType) {
+    private List<SecurityGroupRuleVO> authorizeSecurityGroupRule(final Long securityGroupId, String protocol,Integer startPort,Integer endPort,Integer icmpType,Integer icmpCode,final List<String>  cidrList,Map groupList, final SecurityRuleType ruleType) {
         Integer startPortOrType = null;
         Integer endPortOrCode = null;
 
@@ -713,66 +705,71 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
             }
         }
 
-        final Transaction txn = Transaction.currentTxn();
         final Set<SecurityGroupVO> authorizedGroups2 = new TreeSet<SecurityGroupVO>(new SecurityGroupVOComparator());
 
         authorizedGroups2.addAll(authorizedGroups); // Ensure we don't re-lock the same row
-        txn.start();
 
-        // Prevents other threads/management servers from creating duplicate security rules
-        securityGroup = _securityGroupDao.acquireInLockTable(securityGroupId);
-        if (securityGroup == null) {
-            s_logger.warn("Could not acquire lock on network security group: id= " + securityGroupId);
-            return null;
-        }
-        List<SecurityGroupRuleVO> newRules = new ArrayList<SecurityGroupRuleVO>();
-        try {
-            for (final SecurityGroupVO ngVO : authorizedGroups2) {
-                final Long ngId = ngVO.getId();
-                // Don't delete the referenced group from under us
-                if (ngVO.getId() != securityGroup.getId()) {
-                    final SecurityGroupVO tmpGrp = _securityGroupDao.lockRow(ngId, false);
-                    if (tmpGrp == null) {
-                        s_logger.warn("Failed to acquire lock on security group: " + ngId);
-                        txn.rollback();
-                        return null;
-                    }
+        final Integer startPortOrTypeFinal = startPortOrType;
+        final Integer endPortOrCodeFinal = endPortOrCode;
+        final String protocolFinal = protocol;
+        return Transaction.execute(new TransactionCallback<List<SecurityGroupRuleVO>>() {
+            @Override
+            public List<SecurityGroupRuleVO> doInTransaction(TransactionStatus status) {
+                // Prevents other threads/management servers from creating duplicate security rules
+                SecurityGroup securityGroup = _securityGroupDao.acquireInLockTable(securityGroupId);
+                if (securityGroup == null) {
+                    s_logger.warn("Could not acquire lock on network security group: id= " + securityGroupId);
+                    return null;
                 }
-                SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndAllowedGroupId(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, ngVO.getId());
-                if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
-                    continue; // rule already exists.
-                }
-                securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrType, endPortOrCode, protocol, ngVO.getId());
-                securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
-                newRules.add(securityGroupRule);
-            }
-            if (cidrList != null) {
-                for (String cidr : cidrList) {
-                    SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndCidr(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, cidr);
-                    if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
-                        continue;
+                List<SecurityGroupRuleVO> newRules = new ArrayList<SecurityGroupRuleVO>();
+                try {
+                    for (final SecurityGroupVO ngVO : authorizedGroups2) {
+                        final Long ngId = ngVO.getId();
+                        // Don't delete the referenced group from under us
+                        if (ngVO.getId() != securityGroup.getId()) {
+                            final SecurityGroupVO tmpGrp = _securityGroupDao.lockRow(ngId, false);
+                            if (tmpGrp == null) {
+                                s_logger.warn("Failed to acquire lock on security group: " + ngId);
+                                throw new ConcurrentAccessException("Failed to acquire lock on security group: " + ngId);
+                            }
+                        }
+                        SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndAllowedGroupId(securityGroup.getId(), protocolFinal, startPortOrTypeFinal, endPortOrCodeFinal, ngVO.getId());
+                        if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
+                            continue; // rule already exists.
+                        }
+                        securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrTypeFinal, endPortOrCodeFinal, protocolFinal, ngVO.getId());
+                        securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
+                        newRules.add(securityGroupRule);
+                    }
+                    if (cidrList != null) {
+                        for (String cidr : cidrList) {
+                            SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndCidr(securityGroup.getId(), protocolFinal, startPortOrTypeFinal, endPortOrCodeFinal, cidr);
+                            if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
+                                continue;
+                            }
+                            securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrTypeFinal, endPortOrCodeFinal, protocolFinal, cidr);
+                            securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
+                            newRules.add(securityGroupRule);
+                        }
+                    }
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Added " + newRules.size() + " rules to security group " + securityGroup.getName());
+                    }
+                    final ArrayList<Long> affectedVms = new ArrayList<Long>();
+                    affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(securityGroup.getId()));
+                    scheduleRulesetUpdateToHosts(affectedVms, true, null);
+                    return newRules;
+                } catch (Exception e) {
+                    s_logger.warn("Exception caught when adding security group rules ", e);
+                    throw new CloudRuntimeException("Exception caught when adding security group rules", e);
+                } finally {
+                    if (securityGroup != null) {
+                        _securityGroupDao.releaseFromLockTable(securityGroup.getId());
                     }
-                    securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrType, endPortOrCode, protocol, cidr);
-                    securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
-                    newRules.add(securityGroupRule);
                 }
             }
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Added " + newRules.size() + " rules to security group " + securityGroup.getName());
-            }
-            txn.commit();
-            final ArrayList<Long> affectedVms = new ArrayList<Long>();
-            affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(securityGroup.getId()));
-            scheduleRulesetUpdateToHosts(affectedVms, true, null);
-            return newRules;
-        } catch (Exception e) {
-            s_logger.warn("Exception caught when adding security group rules ", e);
-            throw new CloudRuntimeException("Exception caught when adding security group rules", e);
-        } finally {
-            if (securityGroup != null) {
-                _securityGroupDao.releaseFromLockTable(securityGroup.getId());
-            }
-        }
+        });
+
     }
 
     @Override
@@ -792,11 +789,11 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         return revokeSecurityGroupRule(id, SecurityRuleType.IngressRule);
     }
 
-    private boolean revokeSecurityGroupRule(Long id, SecurityRuleType type) {
+    private boolean revokeSecurityGroupRule(final Long id, SecurityRuleType type) {
         // input validation
         Account caller = CallContext.current().getCallingAccount();
 
-        SecurityGroupRuleVO rule = _securityGroupRuleDao.findById(id);
+        final SecurityGroupRuleVO rule = _securityGroupRuleDao.findById(id);
         if (rule == null) {
             s_logger.debug("Unable to find security rule with id " + id);
             throw new InvalidParameterValueException("Unable to find security rule with id " + id);
@@ -812,36 +809,37 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         SecurityGroup securityGroup = _securityGroupDao.findById(rule.getSecurityGroupId());
         _accountMgr.checkAccess(caller, null, true, securityGroup);
 
-        SecurityGroupVO groupHandle = null;
-        final Transaction txn = Transaction.currentTxn();
-
-        try {
-            txn.start();
-            // acquire lock on parent group (preserving this logic)
-            groupHandle = _securityGroupDao.acquireInLockTable(rule.getSecurityGroupId());
-            if (groupHandle == null) {
-                s_logger.warn("Could not acquire lock on security group id: " + rule.getSecurityGroupId());
-                return false;
-            }
-
-            _securityGroupRuleDao.remove(id);
-            s_logger.debug("revokeSecurityGroupRule succeeded for security rule id: " + id);
-
-            final ArrayList<Long> affectedVms = new ArrayList<Long>();
-            affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(groupHandle.getId()));
-            scheduleRulesetUpdateToHosts(affectedVms, true, null);
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                SecurityGroupVO groupHandle = null;
 
-            return true;
-        } catch (Exception e) {
-            s_logger.warn("Exception caught when deleting security rules ", e);
-            throw new CloudRuntimeException("Exception caught when deleting security rules", e);
-        } finally {
-            if (groupHandle != null) {
-                _securityGroupDao.releaseFromLockTable(groupHandle.getId());
+                try {
+                    // acquire lock on parent group (preserving this logic)
+                    groupHandle = _securityGroupDao.acquireInLockTable(rule.getSecurityGroupId());
+                    if (groupHandle == null) {
+                        s_logger.warn("Could not acquire lock on security group id: " + rule.getSecurityGroupId());
+                        return false;
+                    }
+        
+                    _securityGroupRuleDao.remove(id);
+                    s_logger.debug("revokeSecurityGroupRule succeeded for security rule id: " + id);
+        
+                    final ArrayList<Long> affectedVms = new ArrayList<Long>();
+                    affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(groupHandle.getId()));
+                    scheduleRulesetUpdateToHosts(affectedVms, true, null);
+        
+                    return true;
+                } catch (Exception e) {
+                    s_logger.warn("Exception caught when deleting security rules ", e);
+                    throw new CloudRuntimeException("Exception caught when deleting security rules", e);
+                } finally {
+                    if (groupHandle != null) {
+                        _securityGroupDao.releaseFromLockTable(groupHandle.getId());
+                    }
+                }
             }
-            txn.commit();
-        }
-
+        });
     }
 
     @Override
@@ -939,7 +937,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
             }
             return;
         }
-        Long userVmId = work.getInstanceId();
+        final Long userVmId = work.getInstanceId();
         if (work.getStep() == Step.Done) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Security Group work: found a job in done state, rescheduling for vm: " + userVmId);
@@ -949,68 +947,73 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
             scheduleRulesetUpdateToHosts(affectedVms, false, _timeBetweenCleanups*1000l);
             return;
         }
-        UserVm vm = null;
-        Long seqnum = null;
         s_logger.debug("Working on " + work);
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-        boolean locked = false;
-        try {
-            vm = _userVMDao.acquireInLockTable(work.getInstanceId());
-            if (vm == null) {
-                vm = _userVMDao.findById(work.getInstanceId());
-                if (vm == null) {
-                    s_logger.info("VM " + work.getInstanceId() + " is removed");
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                UserVm vm = null;
+                Long seqnum = null;
+
+                boolean locked = false;
+                try {
+                    vm = _userVMDao.acquireInLockTable(work.getInstanceId());
+                    if (vm == null) {
+                        vm = _userVMDao.findById(work.getInstanceId());
+                        if (vm == null) {
+                            s_logger.info("VM " + work.getInstanceId() + " is removed");
+                            locked = true;
+                            return;
+                        }
+                        s_logger.warn("Unable to acquire lock on vm id=" + userVmId);
+                        return;
+                    }
                     locked = true;
-                    return;
-                }
-                s_logger.warn("Unable to acquire lock on vm id=" + userVmId);
-                return;
-            }
-            locked = true;
-            Long agentId = null;
-            VmRulesetLogVO log = _rulesetLogDao.findByVmId(userVmId);
-            if (log == null) {
-                s_logger.warn("Cannot find log record for vm id=" + userVmId);
-                return;
-            }
-            seqnum = log.getLogsequence();
-
-            if (vm != null && vm.getState() == State.Running) {
-                Map<PortAndProto, Set<String>> ingressRules = generateRulesForVM(userVmId, SecurityRuleType.IngressRule);
-                Map<PortAndProto, Set<String>> egressRules = generateRulesForVM(userVmId, SecurityRuleType.EgressRule);
-                agentId = vm.getHostId();
-                if (agentId != null) {
-                    // get nic secondary ip address
-                    String privateIp = vm.getPrivateIpAddress();
-                    NicVO nic = _nicDao.findByIp4AddressAndVmId(privateIp, vm.getId());
-                    List<String> nicSecIps = null;
-                    if (nic != null) {
-                        if (nic.getSecondaryIp()) {
-                            //get secondary ips of the vm
-                            long networkId = nic.getNetworkId();
-                            nicSecIps = _nicSecIpDao.getSecondaryIpAddressesForNic(nic.getId());
+                    Long agentId = null;
+                    VmRulesetLogVO log = _rulesetLogDao.findByVmId(userVmId);
+                    if (log == null) {
+                        s_logger.warn("Cannot find log record for vm id=" + userVmId);
+                        return;
+                    }
+                    seqnum = log.getLogsequence();
+        
+                    if (vm != null && vm.getState() == State.Running) {
+                        Map<PortAndProto, Set<String>> ingressRules = generateRulesForVM(userVmId, SecurityRuleType.IngressRule);
+                        Map<PortAndProto, Set<String>> egressRules = generateRulesForVM(userVmId, SecurityRuleType.EgressRule);
+                        agentId = vm.getHostId();
+                        if (agentId != null) {
+                            // get nic secondary ip address
+                            String privateIp = vm.getPrivateIpAddress();
+                            NicVO nic = _nicDao.findByIp4AddressAndVmId(privateIp, vm.getId());
+                            List<String> nicSecIps = null;
+                            if (nic != null) {
+                                if (nic.getSecondaryIp()) {
+                                    //get secondary ips of the vm
+                                    long networkId = nic.getNetworkId();
+                                    nicSecIps = _nicSecIpDao.getSecondaryIpAddressesForNic(nic.getId());
+                                }
+                            }
+                            SecurityGroupRulesCmd cmd = generateRulesetCmd( vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(ingressRules, egressRules), seqnum,
+                                    ingressRules, egressRules, nicSecIps);
+                            Commands cmds = new Commands(cmd);
+                            try {
+                                _agentMgr.send(agentId, cmds, _answerListener);
+                            } catch (AgentUnavailableException e) {
+                                s_logger.debug("Unable to send ingress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")");
+                                _workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
+                            }
+        
                         }
                     }
-                    SecurityGroupRulesCmd cmd = generateRulesetCmd( vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(ingressRules, egressRules), seqnum,
-                            ingressRules, egressRules, nicSecIps);
-                    Commands cmds = new Commands(cmd);
-                    try {
-                        _agentMgr.send(agentId, cmds, _answerListener);
-                    } catch (AgentUnavailableException e) {
-                        s_logger.debug("Unable to send ingress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")");
-                        _workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
+                } finally {
+                    if (locked) {
+                        _userVMDao.releaseFromLockTable(userVmId);
+                        _workDao.updateStep(work.getId(), Step.Done);
                     }
-
                 }
             }
-        } finally {
-            if (locked) {
-                _userVMDao.releaseFromLockTable(userVmId);
-                _workDao.updateStep(work.getId(), Step.Done);
-            }
-            txn.commit();
-        }
+        });
+
     }
 
     @Override
@@ -1021,41 +1024,40 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
             return false;
         }
         if (groups != null && !groups.isEmpty()) {
-
-            final Transaction txn = Transaction.currentTxn();
-            txn.start();
-            UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created.
-            List<SecurityGroupVO> sgs = new ArrayList<SecurityGroupVO>();
-            for (Long sgId : groups) {
-                sgs.add(_securityGroupDao.findById(sgId));
-            }
-            final Set<SecurityGroupVO> uniqueGroups = new TreeSet<SecurityGroupVO>(new SecurityGroupVOComparator());
-            uniqueGroups.addAll(sgs);
-            if (userVm == null) {
-                s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
-            }
-            try {
-                for (SecurityGroupVO securityGroup : uniqueGroups) {
-                    // don't let the group be deleted from under us.
-                    SecurityGroupVO ngrpLock = _securityGroupDao.lockRow(securityGroup.getId(), false);
-                    if (ngrpLock == null) {
-                        s_logger.warn("Failed to acquire lock on network group id=" + securityGroup.getId() + " name=" + securityGroup.getName());
-                        txn.rollback();
-                        return false;
+            return Transaction.execute(new TransactionCallback<Boolean>() {
+                @Override
+                public Boolean doInTransaction(TransactionStatus status) {
+                    UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created.
+                    List<SecurityGroupVO> sgs = new ArrayList<SecurityGroupVO>();
+                    for (Long sgId : groups) {
+                        sgs.add(_securityGroupDao.findById(sgId));
                     }
-                    if (_securityGroupVMMapDao.findByVmIdGroupId(userVmId, securityGroup.getId()) == null) {
-                        SecurityGroupVMMapVO groupVmMapVO = new SecurityGroupVMMapVO(securityGroup.getId(), userVmId);
-                        _securityGroupVMMapDao.persist(groupVmMapVO);
+                    final Set<SecurityGroupVO> uniqueGroups = new TreeSet<SecurityGroupVO>(new SecurityGroupVOComparator());
+                    uniqueGroups.addAll(sgs);
+                    if (userVm == null) {
+                        s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
+                    }
+                    try {
+                        for (SecurityGroupVO securityGroup : uniqueGroups) {
+                            // don't let the group be deleted from under us.
+                            SecurityGroupVO ngrpLock = _securityGroupDao.lockRow(securityGroup.getId(), false);
+                            if (ngrpLock == null) {
+                                s_logger.warn("Failed to acquire lock on network group id=" + securityGroup.getId() + " name=" + securityGroup.getName());
+                                throw new ConcurrentModificationException("Failed to acquire lock on network group id=" + securityGroup.getId() + " name=" + securityGroup.getName());
+                            }
+                            if (_securityGroupVMMapDao.findByVmIdGroupId(userVmId, securityGroup.getId()) == null) {
+                                SecurityGroupVMMapVO groupVmMapVO = new SecurityGroupVMMapVO(securityGroup.getId(), userVmId);
+                                _securityGroupVMMapDao.persist(groupVmMapVO);
+                            }
+                        }
+                        return true;
+                    } finally {
+                        if (userVm != null) {
+                            _userVMDao.releaseFromLockTable(userVmId);
+                        }
                     }
                 }
-                txn.commit();
-                return true;
-            } finally {
-                if (userVm != null) {
-                    _userVMDao.releaseFromLockTable(userVmId);
-                }
-            }
-
+            });
         }
         return false;
 
@@ -1063,22 +1065,24 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
 
     @Override
     @DB
-    public void removeInstanceFromGroups(long userVmId) {
+    public void removeInstanceFromGroups(final long userVmId) {
         if (_securityGroupVMMapDao.countSGForVm(userVmId) < 1) {
             s_logger.trace("No security groups found for vm id=" + userVmId + ", returning");
             return;
         }
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-        UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created in
-        // addInstance
-        if (userVm == null) {
-            s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
-        }
-        int n = _securityGroupVMMapDao.deleteVM(userVmId);
-        s_logger.info("Disassociated " + n + " network groups " + " from uservm " + userVmId);
-        _userVMDao.releaseFromLockTable(userVmId);
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created in
+                // addInstance
+                if (userVm == null) {
+                    s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
+                }
+                int n = _securityGroupVMMapDao.deleteVM(userVmId);
+                s_logger.info("Disassociated " + n + " network groups " + " from uservm " + userVmId);
+                _userVMDao.releaseFromLockTable(userVmId);
+            }
+        });
         s_logger.debug("Security group mappings are removed successfully for vm id=" + userVmId);
     }
 
@@ -1086,7 +1090,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_DELETE, eventDescription = "deleting security group")
     public boolean deleteSecurityGroup(DeleteSecurityGroupCmd cmd) throws ResourceInUseException {
-        Long groupId = cmd.getId();
+        final Long groupId = cmd.getId();
         Account caller = CallContext.current().getCallingAccount();
 
         SecurityGroupVO group = _securityGroupDao.findById(groupId);
@@ -1097,32 +1101,34 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         // check permissions
         _accountMgr.checkAccess(caller, null, true, group);
 
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        group = _securityGroupDao.lockRow(groupId, true);
-        if (group == null) {
-            throw new InvalidParameterValueException("Unable to find security group by id " + groupId);
-        }
-
-        if (group.getName().equalsIgnoreCase(SecurityGroupManager.DEFAULT_GROUP_NAME)) {
-            throw new InvalidParameterValueException("The network group default is reserved");
-        }
-
-        List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(groupId);
-        List<SecurityGroupVMMapVO> securityGroupVmMap = _securityGroupVMMapDao.listBySecurityGroup(groupId);
-        if (!allowingRules.isEmpty()) {
-            throw new ResourceInUseException("Cannot delete group when there are security rules that allow this group");
-        } else if (!securityGroupVmMap.isEmpty()) {
-            throw new ResourceInUseException("Cannot delete group when it's in use by virtual machines");
-        }
-
-        _securityGroupDao.expunge(groupId);
-        txn.commit();
+        return Transaction.executeWithException(new TransactionCallbackWithException<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) throws ResourceInUseException {
+                SecurityGroupVO group = _securityGroupDao.lockRow(groupId, true);
+                if (group == null) {
+                    throw new InvalidParameterValueException("Unable to find security group by id " + groupId);
+                }
+        
+                if (group.getName().equalsIgnoreCase(SecurityGroupManager.DEFAULT_GROUP_NAME)) {
+                    throw new InvalidParameterValueException("The network group default is reserved");
+                }
+        
+                List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(groupId);
+                List<SecurityGroupVMMapVO> securityGroupVmMap = _securityGroupVMMapDao.listBySecurityGroup(groupId);
+                if (!allowingRules.isEmpty()) {
+                    throw new ResourceInUseException("Cannot delete group when there are security rules that allow this group");
+                } else if (!securityGroupVmMap.isEmpty()) {
+                    throw new ResourceInUseException("Cannot delete group when it's in use by virtual machines");
+                }
+        
+                _securityGroupDao.expunge(groupId);
 
-        s_logger.debug("Deleted security group id=" + groupId);
+                s_logger.debug("Deleted security group id=" + groupId);
+        
+                return true;
+            }
+        }, ResourceInUseException.class);
 
-        return true;
     }
 
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
index 9923db5..30d39e0 100644
--- a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
@@ -23,7 +23,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.context.CallContext;
 
 import com.cloud.configuration.ConfigurationManager;
@@ -48,6 +47,8 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 
@@ -214,30 +215,35 @@ public class NetworkACLManagerImpl extends ManagerBase implements NetworkACLMana
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_NETWORK_ACL_ITEM_CREATE, eventDescription = "creating network ACL Item", create = true)
-    public NetworkACLItem createNetworkACLItem(Integer portStart, Integer portEnd, String protocol, List<String> sourceCidrList,
-                                                  Integer icmpCode, Integer icmpType, NetworkACLItem.TrafficType trafficType, Long aclId,
-                                                  String action, Integer number) {
-        NetworkACLItem.Action ruleAction = NetworkACLItem.Action.Allow;
-        if("deny".equalsIgnoreCase(action)){
-            ruleAction = NetworkACLItem.Action.Deny;
-        }
+    public NetworkACLItem createNetworkACLItem(final Integer portStart, final Integer portEnd, final String protocol, final List<String> sourceCidrList,
+                                                  final Integer icmpCode, final Integer icmpType, final NetworkACLItem.TrafficType trafficType, final Long aclId,
+                                                  final String action, Integer number) {
         // If number is null, set it to currentMax + 1 (for backward compatibility)
         if(number == null){
             number = _networkACLItemDao.getMaxNumberByACL(aclId) + 1;
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        final Integer numberFinal = number;
+        NetworkACLItemVO newRule = Transaction.execute(new TransactionCallback<NetworkACLItemVO>() {
+            @Override
+            public NetworkACLItemVO doInTransaction(TransactionStatus status) {
+                NetworkACLItem.Action ruleAction = NetworkACLItem.Action.Allow;
+                if("deny".equalsIgnoreCase(action)){
+                    ruleAction = NetworkACLItem.Action.Deny;
+                }
 
-        NetworkACLItemVO newRule = new NetworkACLItemVO(portStart, portEnd, protocol.toLowerCase(), aclId, sourceCidrList, icmpCode, icmpType, trafficType, ruleAction, number);
-        newRule = _networkACLItemDao.persist(newRule);
+                NetworkACLItemVO newRule = new NetworkACLItemVO(portStart, portEnd, protocol.toLowerCase(), aclId, sourceCidrList, icmpCode, icmpType, trafficType, ruleAction, numberFinal);
+                newRule = _networkACLItemDao.persist(newRule);
 
-        if (!_networkACLItemDao.setStateToAdd(newRule)) {
-            throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
-        }
-        CallContext.current().setEventDetails("ACL Item Id: " + newRule.getId());
+                if (!_networkACLItemDao.setStateToAdd(newRule)) {
+                    throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+                }
+                CallContext.current().setEventDetails("ACL Item Id: " + newRule.getId());
+
+                return newRule;
+            }
+        });
 
-        txn.commit();
 
         return getNetworkACLItem(newRule.getId());
     }


[12/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 4fda3b1..9131fa6 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -36,7 +36,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.SecurityChecker;
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -192,6 +191,10 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.NicIpAlias;
@@ -508,7 +511,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         }
 
         // Execute all updates in a single transaction
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         if (!_configDao.update(name, category, value)) {
@@ -906,7 +909,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 selectSql += " and removed IS NULL";
             }
 
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
                 stmt.setLong(1, podId);
@@ -992,9 +995,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @Override
     @DB
     public boolean deletePod(DeletePodCmd cmd) {
-        Long podId = cmd.getId();
-
-        Transaction txn = Transaction.currentTxn();
+        final Long podId = cmd.getId();
 
         // Make sure the pod exists
         if (!validPod(podId)) {
@@ -1003,50 +1004,52 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
         checkIfPodIsDeletable(podId);
 
-        HostPodVO pod = _podDao.findById(podId);
-
-        txn.start();
-
-        // Delete private ip addresses for the pod if there are any
-        List<DataCenterIpAddressVO> privateIps = _privateIpAddressDao.listByPodIdDcId(Long.valueOf(podId),
-                pod.getDataCenterId());
-        if (!privateIps.isEmpty()) {
-            if (!(_privateIpAddressDao.deleteIpAddressByPod(podId))) {
-                throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
-            }
-        }
+        final HostPodVO pod = _podDao.findById(podId);
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                // Delete private ip addresses for the pod if there are any
+                List<DataCenterIpAddressVO> privateIps = _privateIpAddressDao.listByPodIdDcId(Long.valueOf(podId),
+                        pod.getDataCenterId());
+                if (!privateIps.isEmpty()) {
+                    if (!(_privateIpAddressDao.deleteIpAddressByPod(podId))) {
+                        throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
+                    }
+                }
 
-        // Delete link local ip addresses for the pod
-        List<DataCenterLinkLocalIpAddressVO> localIps = _LinkLocalIpAllocDao.listByPodIdDcId(podId,
-                pod.getDataCenterId());
-        if (!localIps.isEmpty()) {
-            if (!(_LinkLocalIpAllocDao.deleteIpAddressByPod(podId))) {
-                throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
-            }
-        }
+                // Delete link local ip addresses for the pod
+                List<DataCenterLinkLocalIpAddressVO> localIps = _LinkLocalIpAllocDao.listByPodIdDcId(podId,
+                        pod.getDataCenterId());
+                if (!localIps.isEmpty()) {
+                    if (!(_LinkLocalIpAllocDao.deleteIpAddressByPod(podId))) {
+                        throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
+                    }
+                }
 
-        // Delete vlans associated with the pod
-        List<? extends Vlan> vlans = _networkModel.listPodVlans(podId);
-        if (vlans != null && !vlans.isEmpty()) {
-            for (Vlan vlan : vlans) {
-                _vlanDao.remove(vlan.getId());
-            }
-        }
+                // Delete vlans associated with the pod
+                List<? extends Vlan> vlans = _networkModel.listPodVlans(podId);
+                if (vlans != null && !vlans.isEmpty()) {
+                    for (Vlan vlan : vlans) {
+                        _vlanDao.remove(vlan.getId());
+                    }
+                }
 
-        // Delete corresponding capacity records
-        _capacityDao.removeBy(null, null, podId, null, null);
+                // Delete corresponding capacity records
+                _capacityDao.removeBy(null, null, podId, null, null);
 
-        // Delete the pod
-        if (!(_podDao.remove(podId))) {
-            throw new CloudRuntimeException("Failed to delete pod " + podId);
-        }
+                // Delete the pod
+                if (!(_podDao.remove(podId))) {
+                    throw new CloudRuntimeException("Failed to delete pod " + podId);
+                }
 
-        // remove from dedicated resources
-        DedicatedResourceVO dr = _dedicatedDao.findByPodId(podId);
-        if (dr != null) {
-            _dedicatedDao.remove(dr.getId());
-        }
-        txn.commit();
+                // remove from dedicated resources
+                DedicatedResourceVO dr = _dedicatedDao.findByPodId(podId);
+                if (dr != null) {
+                    _dedicatedDao.remove(dr.getId());
+                }
+            }
+        });
 
         return true;
     }
@@ -1059,12 +1062,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
     @Override
     @DB
-    public Pod editPod(long id, String name, String startIp, String endIp, String gateway, String netmask,
+    public Pod editPod(final long id, String name, String startIp, String endIp, String gateway, String netmask,
             String allocationStateStr) {
 
         // verify parameters
-        HostPodVO pod = _podDao.findById(id);
-        ;
+        final HostPodVO pod = _podDao.findById(id);
+
         if (pod == null) {
             throw new InvalidParameterValueException("Unable to find pod by id " + id);
         }
@@ -1146,59 +1149,73 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         }
 
         // Verify pod's attributes
-        String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+        final String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
         boolean checkForDuplicates = !oldPodName.equals(name);
         checkPodAttributes(id, name, pod.getDataCenterId(), gateway, cidr, startIp, endIp, allocationStateStr,
                 checkForDuplicates, false);
 
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
-            long zoneId = pod.getDataCenterId();
-
-            if (!allowToDownsize) {
-                if (leftRangeToAdd != null) {
-                    _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), leftRangeToAdd[0], leftRangeToAdd[1]);
-                }
 
-                if (rightRangeToAdd != null) {
-                    _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), rightRangeToAdd[0], rightRangeToAdd[1]);
-                }
-
-            } else {
-                // delete the old range
-                _zoneDao.deletePrivateIpAddressByPod(pod.getId());
-
-                // add the new one
-                if (startIp == null) {
-                    startIp = existingPodIpRange[0];
-                }
+            final String[] existingPodIpRangeFinal = existingPodIpRange;
+            final String[] leftRangeToAddFinal = leftRangeToAdd;
+            final String[] rightRangeToAddFinal = rightRangeToAdd;
+            final boolean allowToDownsizeFinal = allowToDownsize;
+            final String allocationStateStrFinal = allocationStateStr;
+            final String startIpFinal = startIp;
+            final String endIpFinal = endIp;
+            final String nameFinal = name;
+            final String gatewayFinal = gateway;
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    long zoneId = pod.getDataCenterId();
+
+                    String startIp = startIpFinal;
+                    String endIp = endIpFinal;
+
+                    if (!allowToDownsizeFinal) {
+                        if (leftRangeToAddFinal != null) {
+                            _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), leftRangeToAddFinal[0], leftRangeToAddFinal[1]);
+                        }
 
-                if (endIp == null) {
-                    endIp = existingPodIpRange[1];
-                }
+                        if (rightRangeToAddFinal != null) {
+                            _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), rightRangeToAddFinal[0], rightRangeToAddFinal[1]);
+                        }
 
-                _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
-            }
+                    } else {
+                        // delete the old range
+                        _zoneDao.deletePrivateIpAddressByPod(pod.getId());
 
-            pod.setName(name);
-            pod.setDataCenterId(zoneId);
-            pod.setGateway(gateway);
-            pod.setCidrAddress(getCidrAddress(cidr));
-            pod.setCidrSize(getCidrSize(cidr));
+                        // add the new one
+                        if (startIp == null) {
+                            startIp = existingPodIpRangeFinal[0];
+                        }
 
-            String ipRange = startIp + "-" + endIp;
-            pod.setDescription(ipRange);
-            Grouping.AllocationState allocationState = null;
-            if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
-                allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
-                _capacityDao.updateCapacityState(null, pod.getId(), null, null, allocationStateStr);
-                pod.setAllocationState(allocationState);
-            }
+                        if (endIp == null) {
+                            endIp = existingPodIpRangeFinal[1];
+                        }
 
-            _podDao.update(id, pod);
+                        _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
+                    }
 
-            txn.commit();
+                    pod.setName(nameFinal);
+                    pod.setDataCenterId(zoneId);
+                    pod.setGateway(gatewayFinal);
+                    pod.setCidrAddress(getCidrAddress(cidr));
+                    pod.setCidrSize(getCidrSize(cidr));
+
+                    String ipRange = startIp + "-" + endIp;
+                    pod.setDescription(ipRange);
+                    Grouping.AllocationState allocationState = null;
+                    if (allocationStateStrFinal != null && !allocationStateStrFinal.isEmpty()) {
+                        allocationState = Grouping.AllocationState.valueOf(allocationStateStrFinal);
+                        _capacityDao.updateCapacityState(null, pod.getId(), null, null, allocationStateStrFinal);
+                        pod.setAllocationState(allocationState);
+                    }
+        
+                    _podDao.update(id, pod);
+                }
+            });
         } catch (Exception e) {
             s_logger.error("Unable to edit pod due to " + e.getMessage(), e);
             throw new CloudRuntimeException("Failed to edit pod. Please contact Cloud Support.");
@@ -1221,7 +1238,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
     @Override
     @DB
-    public HostPodVO createPod(long userId, String podName, long zoneId, String gateway, String cidr, String startIp,
+    public HostPodVO createPod(long userId, String podName, final long zoneId, String gateway, String cidr, final String startIp,
             String endIp, String allocationStateStr, boolean skipGatewayOverlapCheck) {
 
         // Check if the zone is valid
@@ -1260,31 +1277,33 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             throw new InvalidParameterValueException("Start ip is required parameter");
         }
 
-        HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
+        final HostPodVO podFinal = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
 
         Grouping.AllocationState allocationState = null;
         if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
             allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
-            pod.setAllocationState(allocationState);
+            podFinal.setAllocationState(allocationState);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        pod = _podDao.persist(pod);
+        final String endIpFinal = endIp;
+        return Transaction.execute(new TransactionCallback<HostPodVO>() {
+            @Override
+            public HostPodVO doInTransaction(TransactionStatus status) {
 
-        if (startIp != null) {
-            _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
-        }
+                HostPodVO pod = _podDao.persist(podFinal);
 
-        String[] linkLocalIpRanges = getLinkLocalIPRange();
-        if (linkLocalIpRanges != null) {
-            _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
-        }
+                if (startIp != null) {
+                    _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIpFinal);
+                }
 
-        txn.commit();
+                String[] linkLocalIpRanges = getLinkLocalIPRange();
+                if (linkLocalIpRanges != null) {
+                    _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
+                }
 
-        return pod;
+                return pod;
+            }
+        });
     }
 
     @DB
@@ -1369,7 +1388,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 selectSql += " AND state != '" + VirtualMachine.State.Expunging.toString() + "'";
             }
 
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
                 stmt.setLong(1, zoneId);
@@ -1504,11 +1523,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @ActionEvent(eventType = EventTypes.EVENT_ZONE_DELETE, eventDescription = "deleting zone", async = false)
     public boolean deleteZone(DeleteZoneCmd cmd) {
 
-        Transaction txn = Transaction.currentTxn();
-        boolean success = false;
-
         Long userId = CallContext.current().getCallingUserId();
-        Long zoneId = cmd.getId();
+        final Long zoneId = cmd.getId();
 
         if (userId == null) {
             userId = Long.valueOf(User.UID_SYSTEM);
@@ -1521,38 +1537,38 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
         checkIfZoneIsDeletable(zoneId);
 
-        txn.start();
-
-        // delete vlans for this zone
-        List<VlanVO> vlans = _vlanDao.listByZone(zoneId);
-        for (VlanVO vlan : vlans) {
-            _vlanDao.remove(vlan.getId());
-        }
-
-        success = _zoneDao.remove(zoneId);
-
-        if (success) {
-            // delete all capacity records for the zone
-            _capacityDao.removeBy(null, zoneId, null, null, null);
-            // remove from dedicated resources
-            DedicatedResourceVO dr = _dedicatedDao.findByZoneId(zoneId);
-            if (dr != null) {
-                _dedicatedDao.remove(dr.getId());
-                // find the group associated and check if there are any more
-                // resources under that group
-                List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(dr
-                        .getAffinityGroupId());
-                if (resourcesInGroup.isEmpty()) {
-                    // delete the group
-                    _affinityGroupService.deleteAffinityGroup(dr.getAffinityGroupId(), null, null, null);
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                // delete vlans for this zone
+                List<VlanVO> vlans = _vlanDao.listByZone(zoneId);
+                for (VlanVO vlan : vlans) {
+                    _vlanDao.remove(vlan.getId());
                 }
-            }
-        }
 
-        txn.commit();
-
-        return success;
+                boolean success = _zoneDao.remove(zoneId);
+
+                if (success) {
+                    // delete all capacity records for the zone
+                    _capacityDao.removeBy(null, zoneId, null, null, null);
+                    // remove from dedicated resources
+                    DedicatedResourceVO dr = _dedicatedDao.findByZoneId(zoneId);
+                    if (dr != null) {
+                        _dedicatedDao.remove(dr.getId());
+                        // find the group associated and check if there are any more
+                        // resources under that group
+                        List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(dr
+                                .getAffinityGroupId());
+                        if (resourcesInGroup.isEmpty()) {
+                            // delete the group
+                            _affinityGroupService.deleteAffinityGroup(dr.getAffinityGroupId(), null, null, null);
+                        }
+                    }
+                }
 
+                return success;
+            }
+        });
     }
 
     @Override
@@ -1560,7 +1576,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @ActionEvent(eventType = EventTypes.EVENT_ZONE_EDIT, eventDescription = "editing zone", async = false)
     public DataCenter editZone(UpdateZoneCmd cmd) {
         // Parameter validation as from execute() method in V1
-        Long zoneId = cmd.getId();
+        final Long zoneId = cmd.getId();
         String zoneName = cmd.getZoneName();
         String dns1 = cmd.getDns1();
         String dns2 = cmd.getDns2();
@@ -1570,14 +1586,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         String internalDns2 = cmd.getInternalDns2();
         String guestCidr = cmd.getGuestCidrAddress();
         List<String> dnsSearchOrder = cmd.getDnsSearchOrder();
-        Boolean isPublic = cmd.isPublic();
-        String allocationStateStr = cmd.getAllocationState();
-        String dhcpProvider = cmd.getDhcpProvider();
+        final Boolean isPublic = cmd.isPublic();
+        final String allocationStateStr = cmd.getAllocationState();
+        final String dhcpProvider = cmd.getDhcpProvider();
         Map<?, ?> detailsMap = cmd.getDetails();
         String networkDomain = cmd.getDomain();
         Boolean localStorageEnabled = cmd.getLocalStorageEnabled();
 
-        Map<String, String> newDetails = new HashMap<String, String>();
+        final Map<String, String> newDetails = new HashMap<String, String>();
         if (detailsMap != null) {
             Collection<?> zoneDetailsCollection = detailsMap.values();
             Iterator<?> iter = zoneDetailsCollection.iterator();
@@ -1611,7 +1627,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             newDetails.put(ZoneConfig.DnsSearchOrder.getName(), StringUtils.join(dnsSearchOrder, ","));
         }
 
-        DataCenterVO zone = _zoneDao.findById(zoneId);
+        final DataCenterVO zone = _zoneDao.findById(zoneId);
         if (zone == null) {
             throw new InvalidParameterValueException("unable to find zone by id " + zoneId);
         }
@@ -1698,93 +1714,94 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        Map<String, String> updatedDetails = new HashMap<String, String>();
-        _zoneDao.loadDetails(zone);
-        if (zone.getDetails() != null) {
-            updatedDetails.putAll(zone.getDetails());
-        }
-        updatedDetails.putAll(newDetails);
-        zone.setDetails(updatedDetails);
-
-        if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
-            Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
-
-            if (allocationState == Grouping.AllocationState.Enabled) {
-                // check if zone has necessary trafficTypes before enabling
-                try {
-                    PhysicalNetwork mgmtPhyNetwork;
-                    // zone should have a physical network with management
-                    // traffiType
-                    mgmtPhyNetwork = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId,
-                            TrafficType.Management);
-                    if (NetworkType.Advanced == zone.getNetworkType() && !zone.isSecurityGroupEnabled()) {
-                        // advanced zone without SG should have a physical
-                        // network with public Thpe
-                        _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Public);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                Map<String, String> updatedDetails = new HashMap<String, String>();
+                _zoneDao.loadDetails(zone);
+                if (zone.getDetails() != null) {
+                    updatedDetails.putAll(zone.getDetails());
+                }
+                updatedDetails.putAll(newDetails);
+                zone.setDetails(updatedDetails);
+        
+                if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
+                    Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
+        
+                    if (allocationState == Grouping.AllocationState.Enabled) {
+                        // check if zone has necessary trafficTypes before enabling
+                        try {
+                            PhysicalNetwork mgmtPhyNetwork;
+                            // zone should have a physical network with management
+                            // traffiType
+                            mgmtPhyNetwork = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId,
+                                    TrafficType.Management);
+                            if (NetworkType.Advanced == zone.getNetworkType() && !zone.isSecurityGroupEnabled()) {
+                                // advanced zone without SG should have a physical
+                                // network with public Thpe
+                                _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Public);
+                            }
+        
+                            try {
+                                _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Storage);
+                            } catch (InvalidParameterValueException noStorage) {
+                                PhysicalNetworkTrafficTypeVO mgmtTraffic = _trafficTypeDao.findBy(mgmtPhyNetwork.getId(),
+                                        TrafficType.Management);
+                                _networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(),
+                                        TrafficType.Storage.toString(), mgmtTraffic.getXenNetworkLabel(),
+                                        mgmtTraffic.getKvmNetworkLabel(), mgmtTraffic.getVmwareNetworkLabel(),
+                                        mgmtTraffic.getSimulatorNetworkLabel(), mgmtTraffic.getVlan());
+                                s_logger.info("No storage traffic type was specified by admin, create default storage traffic on physical network "
+                                        + mgmtPhyNetwork.getId() + " with same configure of management traffic type");
+                            }
+                        } catch (InvalidParameterValueException ex) {
+                            throw new InvalidParameterValueException("Cannot enable this Zone since: " + ex.getMessage());
+                        }
                     }
+                    _capacityDao.updateCapacityState(zone.getId(), null, null, null, allocationStateStr);
+                    zone.setAllocationState(allocationState);
+                }
 
-                    try {
-                        _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Storage);
-                    } catch (InvalidParameterValueException noStorage) {
-                        PhysicalNetworkTrafficTypeVO mgmtTraffic = _trafficTypeDao.findBy(mgmtPhyNetwork.getId(),
-                                TrafficType.Management);
-                        _networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(),
-                                TrafficType.Storage.toString(), mgmtTraffic.getXenNetworkLabel(),
-                                mgmtTraffic.getKvmNetworkLabel(), mgmtTraffic.getVmwareNetworkLabel(),
-                                mgmtTraffic.getSimulatorNetworkLabel(), mgmtTraffic.getVlan());
-                        s_logger.info("No storage traffic type was specified by admin, create default storage traffic on physical network "
-                                + mgmtPhyNetwork.getId() + " with same configure of management traffic type");
-                    }
-                } catch (InvalidParameterValueException ex) {
-                    throw new InvalidParameterValueException("Cannot enable this Zone since: " + ex.getMessage());
+                if (dhcpProvider != null) {
+                    zone.setDhcpProvider(dhcpProvider);
                 }
-            }
-            _capacityDao.updateCapacityState(zone.getId(), null, null, null, allocationStateStr);
-            zone.setAllocationState(allocationState);
-        }
 
-        if (dhcpProvider != null) {
-            zone.setDhcpProvider(dhcpProvider);
-        }
-        
-        // update a private zone to public; not vice versa
-        if (isPublic != null && isPublic) {
-            zone.setDomainId(null);
-            zone.setDomain(null);
-
-            // release the dedication for this zone
-            DedicatedResourceVO resource = _dedicatedDao.findByZoneId(zoneId);
-            Long resourceId = null;
-            if (resource != null) {
-                resourceId = resource.getId();
-                if (!_dedicatedDao.remove(resourceId)) {
-                    throw new CloudRuntimeException("Failed to delete dedicated Zone Resource " + resourceId);
+                // update a private zone to public; not vice versa
+                if (isPublic != null && isPublic) {
+                    zone.setDomainId(null);
+                    zone.setDomain(null);
+
+                    // release the dedication for this zone
+                    DedicatedResourceVO resource = _dedicatedDao.findByZoneId(zoneId);
+                    Long resourceId = null;
+                    if (resource != null) {
+                        resourceId = resource.getId();
+                        if (!_dedicatedDao.remove(resourceId)) {
+                            throw new CloudRuntimeException("Failed to delete dedicated Zone Resource " + resourceId);
+                        }
+                        // find the group associated and check if there are any more
+                        // resources under that group
+                        List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(resource.getAffinityGroupId());
+                        if (resourcesInGroup.isEmpty()) {
+                            // delete the group
+                            _affinityGroupService.deleteAffinityGroup(resource.getAffinityGroupId(), null, null, null);
+                        }
+                    }
                 }
-                // find the group associated and check if there are any more
-                // resources under that group
-                List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(resource.getAffinityGroupId());
-                if (resourcesInGroup.isEmpty()) {
-                    // delete the group
-                    _affinityGroupService.deleteAffinityGroup(resource.getAffinityGroupId(), null, null, null);
+
+                if (!_zoneDao.update(zoneId, zone)) {
+                    throw new CloudRuntimeException("Failed to edit zone. Please contact Cloud Support.");
                 }
             }
-        }
+        });
 
-        if (!_zoneDao.update(zoneId, zone)) {
-            throw new CloudRuntimeException("Failed to edit zone. Please contact Cloud Support.");
-        }
-
-        txn.commit();
         return zone;
     }
 
     @Override
     @DB
     public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1,
-            String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType,
+            String internalDns2, String guestCidr, String domain, final Long domainId, NetworkType zoneType,
             String allocationStateStr, String networkDomain, boolean isSecurityGroupEnabled,
             boolean isLocalStorageEnabled, String ip6Dns1, String ip6Dns2) {
 
@@ -1809,43 +1826,40 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
         byte[] bytes = (zoneName + System.currentTimeMillis()).getBytes();
         String zoneToken = UUID.nameUUIDFromBytes(bytes).toString();
-        Transaction txn = Transaction.currentTxn();
-        try {
-            txn.start();
-            // Create the new zone in the database
-            DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr,
-                    domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled,
-                    isLocalStorageEnabled,
-                    ip6Dns1, ip6Dns2);
-            if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
-                Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
-                zone.setAllocationState(allocationState);
-            } else {
-                // Zone will be disabled since 3.0. Admin should enable it after
-                // physical network and providers setup.
-                zone.setAllocationState(Grouping.AllocationState.Disabled);
-            }
-            zone = _zoneDao.persist(zone);
-            if (domainId != null) {
-                // zone is explicitly dedicated to this domain
-                // create affinity group associated and dedicate the zone.
-                AffinityGroup group = createDedicatedAffinityGroup(null, domainId, null);
-                DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zone.getId(), null, null, null,
-                        domainId, null, group.getId());
-                _dedicatedDao.persist(dedicatedResource);
-            }
-
-            // Create default system networks
-            createDefaultSystemNetworks(zone.getId());
-            txn.commit();
-            return zone;
-        } catch (Exception ex) {
-            txn.rollback();
-            s_logger.warn("Exception: ", ex);
-            throw new CloudRuntimeException("Fail to create a network");
-        } finally {
-            txn.close();
-        }
+
+        // Create the new zone in the database
+        final DataCenterVO zoneFinal = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr,
+                domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled,
+                isLocalStorageEnabled,
+                ip6Dns1, ip6Dns2);
+        if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
+            Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
+            zoneFinal.setAllocationState(allocationState);
+        } else {
+            // Zone will be disabled since 3.0. Admin should enable it after
+            // physical network and providers setup.
+            zoneFinal.setAllocationState(Grouping.AllocationState.Disabled);
+        }
+
+        return Transaction.execute(new TransactionCallback<DataCenterVO>() {
+            @Override
+            public DataCenterVO doInTransaction(TransactionStatus status) {
+                DataCenterVO zone = _zoneDao.persist(zoneFinal);
+                if (domainId != null) {
+                    // zone is explicitly dedicated to this domain
+                    // create affinity group associated and dedicate the zone.
+                    AffinityGroup group = createDedicatedAffinityGroup(null, domainId, null);
+                    DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zone.getId(), null, null, null,
+                            domainId, null, group.getId());
+                    _dedicatedDao.persist(dedicatedResource);
+                }
+
+                // Create default system networks
+                createDefaultSystemNetworks(zone.getId());
+
+                return zone;
+            }
+        });
     }
 
     private AffinityGroup createDedicatedAffinityGroup(String affinityGroupName, Long domainId, Long accountId) {
@@ -2662,31 +2676,43 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         if (ipv4) {
             checkOverlapPrivateIpRange(zoneId, startIP, endIP);
         }
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
 
-        if ((sameSubnet == null || sameSubnet.first() == false) && (network.getTrafficType()== TrafficType.Guest) && (network.getGuestType() == GuestType.Shared) && (_vlanDao.listVlansByNetworkId(networkId) != null)) {
-            Map<Capability, String> dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(network.getNetworkOfferingId()), Service.Dhcp);
-            String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
-            if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) {
-                       throw new  InvalidParameterValueException("The Dhcp serivice provider for this network dose not support the dhcp  across multiple subnets");
-            }
-            s_logger.info("adding a new subnet to the network " + network.getId());
-        } else if (sameSubnet != null)  {
-            // if it is same subnet the user might not send the vlan and the
-            // netmask details. so we are
-            // figuring out while validation and setting them here.
-            newVlanGateway = sameSubnet.second().first();
-            newVlanNetmask = sameSubnet.second().second();
-        }
-        Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP,
-                endIP, newVlanGateway, newVlanNetmask, vlanId, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
-        // create an entry in the nic_secondary table. This will be the new
-        // gateway that will be configured on the corresponding routervm.
-
-        txn.commit();
+        return commitVlan(zoneId, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId,
+                forVirtualNetwork, networkId, physicalNetworkId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, vlanOwner,
+                network, sameSubnet);
+    }
 
-        return vlan;
+    private Vlan commitVlan(final Long zoneId, final Long podId, final String startIP, final String endIP, final String newVlanGatewayFinal,
+            final String newVlanNetmaskFinal, final String vlanId, final Boolean forVirtualNetwork, final Long networkId, final Long physicalNetworkId,
+            final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr, final Account vlanOwner, final Network network,
+            final Pair<Boolean, Pair<String, String>> sameSubnet) {
+        return Transaction.execute(new TransactionCallback<Vlan>() {
+            @Override
+            public Vlan doInTransaction(TransactionStatus status) {
+                String newVlanNetmask = newVlanNetmaskFinal;
+                String newVlanGateway = newVlanGatewayFinal;
+                
+                if ((sameSubnet == null || sameSubnet.first() == false) && (network.getTrafficType()== TrafficType.Guest) && (network.getGuestType() == GuestType.Shared) && (_vlanDao.listVlansByNetworkId(networkId) != null)) {
+                    Map<Capability, String> dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(network.getNetworkOfferingId()), Service.Dhcp);
+                    String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
+                    if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) {
+                               throw new  InvalidParameterValueException("The Dhcp serivice provider for this network dose not support the dhcp  across multiple subnets");
+                    }
+                    s_logger.info("adding a new subnet to the network " + network.getId());
+                } else if (sameSubnet != null)  {
+                    // if it is same subnet the user might not send the vlan and the
+                    // netmask details. so we are
+                    // figuring out while validation and setting them here.
+                    newVlanGateway = sameSubnet.second().first();
+                    newVlanNetmask = sameSubnet.second().second();
+                }
+                Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP,
+                        endIP, newVlanGateway, newVlanNetmask, vlanId, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
+                // create an entry in the nic_secondary table. This will be the new
+                // gateway that will be configured on the corresponding routervm.
+                return vlan;
+            }
+        });
     }
 
     public NetUtils.supersetOrSubset checkIfSubsetOrSuperset(String newVlanGateway, String newVlanNetmask, VlanVO vlan, String startIP,
@@ -3014,52 +3040,62 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         }
 
         // Everything was fine, so persist the VLAN
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway,
+                vlanNetmask, vlanId, vlanOwner, vlanIp6Gateway, vlanIp6Cidr, ipv4, zone, vlanType, ipv6Range, ipRange);
 
-        VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId,
-                physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range);
-        s_logger.debug("Saving vlan range " + vlan);
-        vlan = _vlanDao.persist(vlan);
+        return vlan;
+    }
 
-        // IPv6 use a used ip map, is different from ipv4, no need to save
-        // public ip range
-        if (ipv4) {
-            if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
-                throw new CloudRuntimeException("Failed to save IPv4 range. Please contact Cloud Support.");
-            }
-        }
+    private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId,
+            final String startIP, final String endIP, final String vlanGateway, final String vlanNetmask, final String vlanId, final Account vlanOwner,
+            final String vlanIp6Gateway, final String vlanIp6Cidr, final boolean ipv4, final DataCenterVO zone, final VlanType vlanType,
+            final String ipv6Range, final String ipRange) {
+        return Transaction.execute(new TransactionCallback<VlanVO>() {
+            @Override
+            public VlanVO doInTransaction(TransactionStatus status) {
+                VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId,
+                        physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range);
+                s_logger.debug("Saving vlan range " + vlan);
+                vlan = _vlanDao.persist(vlan);
+
+                // IPv6 use a used ip map, is different from ipv4, no need to save
+                // public ip range
+                if (ipv4) {
+                    if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
+                        throw new CloudRuntimeException("Failed to save IPv4 range. Please contact Cloud Support.");
+                    }
+                }
 
-        if (vlanOwner != null) {
-            // This VLAN is account-specific, so create an AccountVlanMapVO
-            // entry
-            AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
-            _accountVlanMapDao.persist(accountVlanMapVO);
+                if (vlanOwner != null) {
+                    // This VLAN is account-specific, so create an AccountVlanMapVO
+                    // entry
+                    AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
+                    _accountVlanMapDao.persist(accountVlanMapVO);
 
-            // generate usage event for dedication of every ip address in the
-            // range
-            List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlan.getId());
-            for (IPAddressVO ip : ips) {
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip
-                        .getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan
-                        .getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                    // generate usage event for dedication of every ip address in the
+                    // range
+                    List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlan.getId());
+                    for (IPAddressVO ip : ips) {
+                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip
+                                .getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan
+                                .getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                    }
+                    // increment resource count for dedicated public ip's
+                    _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
+                } else if (podId != null) {
+                    // This VLAN is pod-wide, so create a PodVlanMapVO entry
+                    PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId());
+                    _podVlanMapDao.persist(podVlanMapVO);
+                }
+                return vlan;
             }
-            // increment resource count for dedicated public ip's
-            _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
-        } else if (podId != null) {
-            // This VLAN is pod-wide, so create a PodVlanMapVO entry
-            PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId());
-            _podVlanMapDao.persist(podVlanMapVO);
-        }
+        });
 
-        txn.commit();
-
-        return vlan;
     }
 
     @Override
     @DB
-    public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) {
+    public boolean deleteVlanAndPublicIpRange(long userId, final long vlanDbId, Account caller) {
         VlanVO vlanRange = _vlanDao.findById(vlanDbId);
         if (vlanRange == null) {
             throw new InvalidParameterValueException("Please specify a valid IP range id.");
@@ -3146,12 +3182,13 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             }
         }
 
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        _publicIpAddressDao.deletePublicIPRange(vlanDbId);
-        _vlanDao.expunge(vlanDbId);
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                _publicIpAddressDao.deletePublicIPRange(vlanDbId);
+                _vlanDao.expunge(vlanDbId);
+            }
+        });
 
         return true;
     }
@@ -3229,15 +3266,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
         // Create an AccountVlanMapVO entry
         AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
         _accountVlanMapDao.persist(accountVlanMapVO);
 
-        txn.commit();
-
         // generate usage event for dedication of every ip address in the range
         for (IPAddressVO ip : ips) {
             UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(),
@@ -3332,16 +3364,20 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     }
 
     @DB
-    protected boolean savePublicIPRange(String startIP, String endIP, long zoneId, long vlanDbId, long sourceNetworkid,
-            long physicalNetworkId) {
-        long startIPLong = NetUtils.ip2Long(startIP);
-        long endIPLong = NetUtils.ip2Long(endIP);
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        IPRangeConfig config = new IPRangeConfig();
-        List<String> problemIps = config.savePublicIPRange(txn, startIPLong, endIPLong, zoneId, vlanDbId,
-                sourceNetworkid, physicalNetworkId);
-        txn.commit();
+    protected boolean savePublicIPRange(String startIP, String endIP, final long zoneId, final long vlanDbId, final long sourceNetworkid,
+            final long physicalNetworkId) {
+        final long startIPLong = NetUtils.ip2Long(startIP);
+        final long endIPLong = NetUtils.ip2Long(endIP);
+
+        List<String> problemIps = Transaction.execute(new TransactionCallback<List<String>>() {
+            @Override
+            public List<String> doInTransaction(TransactionStatus status) {
+                IPRangeConfig config = new IPRangeConfig();
+                return config.savePublicIPRange(TransactionLegacy.currentTxn(), startIPLong, endIPLong, zoneId, vlanDbId,
+                        sourceNetworkid, physicalNetworkId);
+            }
+        });
+
         return problemIps != null && problemIps.size() == 0;
     }
 
@@ -3957,10 +3993,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @DB
     public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType,
             String tags, boolean specifyVlan, Availability availability, Integer networkRate,
-            Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type,
+            final Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type,
             boolean systemOnly, Long serviceOfferingId, boolean conserveMode,
             Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent,
-            Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn) {
+            final Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, final Integer maxconn) {
 
         String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
         int multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
@@ -4100,13 +4136,13 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             publicLb = true;
         }
 
-        NetworkOfferingVO offering = new NetworkOfferingVO(name, displayText, trafficType, systemOnly, specifyVlan,
+        final NetworkOfferingVO offeringFinal = new NetworkOfferingVO(name, displayText, trafficType, systemOnly, specifyVlan,
                 networkRate, multicastRate, isDefault, availability, tags, type, conserveMode, dedicatedLb,
                 sharedSourceNat, redundantRouter, elasticIp, elasticLb, specifyIpRanges, inline, isPersistent,
                 associatePublicIp, publicLb, internalLb, egressDefaultPolicy);
 
         if (serviceOfferingId != null) {
-            offering.setServiceOfferingId(serviceOfferingId);
+            offeringFinal.setServiceOfferingId(serviceOfferingId);
         }
 
         // validate the details
@@ -4114,46 +4150,49 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             validateNtwkOffDetails(details, serviceProviderMap);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // 1) create network offering object
-        s_logger.debug("Adding network offering " + offering);
-        offering.setConcurrentConnections(maxconn);
-        offering = _networkOfferingDao.persist(offering, details);
-        // 2) populate services and providers
-        if (serviceProviderMap != null) {
-            for (Network.Service service : serviceProviderMap.keySet()) {
-                Set<Provider> providers = serviceProviderMap.get(service);
-                if (providers != null && !providers.isEmpty()) {
-                    boolean vpcOff = false;
-                    for (Network.Provider provider : providers) {
-                        if (provider == Provider.VPCVirtualRouter) {
-                            vpcOff = true;
+        return Transaction.execute(new TransactionCallback<NetworkOfferingVO>() {
+            @Override
+            public NetworkOfferingVO doInTransaction(TransactionStatus status) {
+                NetworkOfferingVO offering = offeringFinal;
+
+                // 1) create network offering object
+                s_logger.debug("Adding network offering " + offering);
+                offering.setConcurrentConnections(maxconn);
+                offering = _networkOfferingDao.persist(offering, details);
+                // 2) populate services and providers
+                if (serviceProviderMap != null) {
+                    for (Network.Service service : serviceProviderMap.keySet()) {
+                        Set<Provider> providers = serviceProviderMap.get(service);
+                        if (providers != null && !providers.isEmpty()) {
+                            boolean vpcOff = false;
+                            for (Network.Provider provider : providers) {
+                                if (provider == Provider.VPCVirtualRouter) {
+                                    vpcOff = true;
+                                }
+                                NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(),
+                                        service, provider);
+                                _ntwkOffServiceMapDao.persist(offService);
+                                s_logger.trace("Added service for the network offering: " + offService + " with provider "
+                                        + provider.getName());
+                            }
+
+                            if (vpcOff) {
+                                List<Service> supportedSvcs = new ArrayList<Service>();
+                                supportedSvcs.addAll(serviceProviderMap.keySet());
+                                _vpcMgr.validateNtwkOffForVpc(offering, supportedSvcs);
+                            }
+                        } else {
+                            NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), service,
+                                    null);
+                            _ntwkOffServiceMapDao.persist(offService);
+                            s_logger.trace("Added service for the network offering: " + offService + " with null provider");
                         }
-                        NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(),
-                                service, provider);
-                        _ntwkOffServiceMapDao.persist(offService);
-                        s_logger.trace("Added service for the network offering: " + offService + " with provider "
-                                + provider.getName());
-                    }
-
-                    if (vpcOff) {
-                        List<Service> supportedSvcs = new ArrayList<Service>();
-                        supportedSvcs.addAll(serviceProviderMap.keySet());
-                        _vpcMgr.validateNtwkOffForVpc(offering, supportedSvcs);
                     }
-                } else {
-                    NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), service,
-                            null);
-                    _ntwkOffServiceMapDao.persist(offService);
-                    s_logger.trace("Added service for the network offering: " + offService + " with null provider");
                 }
-            }
-        }
-
-        txn.commit();
 
-        return offering;
+                return offering;
+            }
+        });
     }
 
     protected void validateNtwkOffDetails(Map<Detail, String> details, Map<Service, Set<Provider>> serviceProviderMap) {
@@ -4680,27 +4719,29 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
     @Override
     @DB
-    public boolean releaseAccountSpecificVirtualRanges(long accountId) {
-        List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(accountId);
-        boolean result = true;
+    public boolean releaseAccountSpecificVirtualRanges(final long accountId) {
+        final List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(accountId);
         if (maps != null && !maps.isEmpty()) {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            for (AccountVlanMapVO map : maps) {
-                if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(),
-                        _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
-                    result = false;
-                }
-            }
-            if (result) {
-                txn.commit();
-            } else {
-                s_logger.error("Failed to release account specific virtual ip ranges for account id=" + accountId);
+            try {
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        for (AccountVlanMapVO map : maps) {
+                            if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(),
+                                    _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
+                                throw new CloudRuntimeException("Failed to release account specific virtual ip ranges for account id=" + accountId);
+                            }
+                        }
+                    }
+                });
+            } catch ( CloudRuntimeException e ) {
+                s_logger.error(e);
+                return false;
             }
         } else {
             s_logger.trace("Account id=" + accountId + " has no account specific virtual ip ranges, nothing to release");
         }
-        return result;
+        return true;
     }
 
     @Override
@@ -4771,14 +4812,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @ActionEvent(eventType = EventTypes.EVENT_PORTABLE_IP_RANGE_CREATE,
             eventDescription = "creating portable ip range", async = false)
     public PortableIpRange createPortableIpRange(CreatePortableIpRangeCmd cmd) throws ConcurrentOperationException {
-        Integer regionId = cmd.getRegionId();
-        String startIP = cmd.getStartIp();
-        String endIP = cmd.getEndIp();
-        String gateway = cmd.getGateway();
-        String netmask = cmd.getNetmask();
+        final Integer regionId = cmd.getRegionId();
+        final String startIP = cmd.getStartIp();
+        final String endIP = cmd.getEndIp();
+        final String gateway = cmd.getGateway();
+        final String netmask = cmd.getNetmask();
         String vlanId = cmd.getVlan();
 
-        RegionVO region = _regionDao.findById(regionId);
+        final RegionVO region = _regionDao.findById(regionId);
         if (region == null) {
             throw new InvalidParameterValueException("Invalid region ID: " + regionId);
         }
@@ -4822,28 +4863,33 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         }
         GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
         portableIpLock.lock(5);
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        PortableIpRangeVO portableIpRange = new PortableIpRangeVO(regionId, vlanId, gateway, netmask, startIP, endIP);
-        portableIpRange = _portableIpRangeDao.persist(portableIpRange);
+        try {
+            final String vlanIdFinal = vlanId;
+            return Transaction.execute(new TransactionCallback<PortableIpRangeVO>() {
+                @Override
+                public PortableIpRangeVO doInTransaction(TransactionStatus status) {
+                    PortableIpRangeVO portableIpRange = new PortableIpRangeVO(regionId, vlanIdFinal, gateway, netmask, startIP, endIP);
+                    portableIpRange = _portableIpRangeDao.persist(portableIpRange);
+
+                    long startIpLong = NetUtils.ip2Long(startIP);
+                    long endIpLong = NetUtils.ip2Long(endIP);
+                    while (startIpLong <= endIpLong) {
+                        PortableIpVO portableIP = new PortableIpVO(regionId, portableIpRange.getId(), vlanIdFinal, gateway, netmask,
+                                NetUtils.long2Ip(startIpLong));
+                        _portableIpDao.persist(portableIP);
+                        startIpLong++;
+                    }
 
-        long startIpLong = NetUtils.ip2Long(startIP);
-        long endIpLong = NetUtils.ip2Long(endIP);
-        while (startIpLong <= endIpLong) {
-            PortableIpVO portableIP = new PortableIpVO(regionId, portableIpRange.getId(), vlanId, gateway, netmask,
-                    NetUtils.long2Ip(startIpLong));
-            _portableIpDao.persist(portableIP);
-            startIpLong++;
+                    // implicitly enable portable IP service for the region
+                    region.setPortableipEnabled(true);
+                    _regionDao.update(region.getId(), region);
+                    
+                    return portableIpRange;
+                }
+            });
+        } finally {
+            portableIpLock.unlock();
         }
-
-        // implicitly enable portable IP service for the region
-        region.setPortableipEnabled(true);
-        _regionDao.update(region.getId(), region);
-
-        txn.commit();
-        portableIpLock.unlock();
-        return portableIpRange;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index 030a31f..e55477a 100755
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@ -118,6 +118,8 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.events.SubscriptionMgr;
@@ -569,10 +571,10 @@ VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
         } catch (ResourceUnavailableException e) {
             s_logger.warn("Exception while trying to start console proxy", e);
             return null;
-        } catch (CloudRuntimeException e) {
+        } catch (ConcurrentOperationException e) {
             s_logger.warn("Runtime Exception while trying to start console proxy", e);
             return null;
-        } catch (ConcurrentOperationException e) {
+        } catch (CloudRuntimeException e) {
             s_logger.warn("Runtime Exception while trying to start console proxy", e);
             return null;
         } catch (OperationTimedoutException e) {
@@ -1049,25 +1051,24 @@ VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
 
     @Override
     @DB
-    public void setManagementState(ConsoleProxyManagementState state) {
-        Transaction txn = Transaction.currentTxn();
+    public void setManagementState(final ConsoleProxyManagementState state) {
         try {
-            txn.start();
-
-            ConsoleProxyManagementState lastState = getManagementState();
+            final ConsoleProxyManagementState lastState = getManagementState();
             if (lastState == null) {
-                txn.commit();
                 return;
             }
 
             if (lastState != state) {
-                _configDao.update(Config.ConsoleProxyManagementLastState.key(), Config.ConsoleProxyManagementLastState.getCategory(), lastState.toString());
-                _configDao.update(Config.ConsoleProxyManagementState.key(), Config.ConsoleProxyManagementState.getCategory(), state.toString());
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        _configDao.update(Config.ConsoleProxyManagementLastState.key(), Config.ConsoleProxyManagementLastState.getCategory(), lastState.toString());
+                        _configDao.update(Config.ConsoleProxyManagementState.key(), Config.ConsoleProxyManagementState.getCategory(), state.toString());
+                    }
+                });
             }
-
-            txn.commit();
         } catch (Throwable e) {
-            txn.rollback();
+            s_logger.error("Failed to set managment state", e);
         }
     }
 
@@ -1090,23 +1091,18 @@ VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
     @Override
     @DB
     public void resumeLastManagementState() {
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
             ConsoleProxyManagementState state = getManagementState();
             ConsoleProxyManagementState lastState = getLastManagementState();
             if (lastState == null) {
-                txn.commit();
                 return;
             }
 
             if (lastState != state) {
                 _configDao.update(Config.ConsoleProxyManagementState.key(), Config.ConsoleProxyManagementState.getCategory(), lastState.toString());
             }
-
-            txn.commit();
         } catch (Throwable e) {
-            txn.rollback();
+            s_logger.error("Failed to resume last management state", e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java b/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
index 1936b85..3902847 100644
--- a/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
+++ b/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
@@ -338,7 +339,7 @@ public class DedicatedResourceDaoImpl extends GenericDaoBase<DedicatedResourceVO
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         DedicatedResourceVO resource = createForUpdate();
         update(id, resource);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index dcfb24c..98b74d1 100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -99,6 +99,9 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.vm.DiskProfile;
@@ -540,7 +543,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
     }
 
     @DB
-    private boolean checkIfHostFitsPlannerUsage(long hostId, PlannerResourceUsage resourceUsageRequired) {
+    private boolean checkIfHostFitsPlannerUsage(final long hostId, final PlannerResourceUsage resourceUsageRequired) {
         // TODO Auto-generated method stub
         // check if this host has been picked up by some other planner
         // exclusively
@@ -550,7 +553,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
 
         PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
         if (reservationEntry != null) {
-            long id = reservationEntry.getId();
+            final long id = reservationEntry.getId();
             PlannerResourceUsage hostResourceType = reservationEntry.getResourceUsage();
 
             if (hostResourceType != null) {
@@ -562,36 +565,35 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
                     return false;
                 }
             } else {
+                final PlannerResourceUsage hostResourceTypeFinal = hostResourceType;
                 // reserve the host for required resourceType
                 // let us lock the reservation entry before updating.
-                final Transaction txn = Transaction.currentTxn();
-
-                try {
-                    txn.start();
-
-                    final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
-                    if (lockedEntry == null) {
-                        s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
-                        return false;
-                    }
-                    // check before updating
-                    if (lockedEntry.getResourceUsage() == null) {
-                        lockedEntry.setResourceUsage(resourceUsageRequired);
-                        _plannerHostReserveDao.persist(lockedEntry);
-                        return true;
-                    } else {
-                        // someone updated it earlier. check if we can still use it
-                        if (lockedEntry.getResourceUsage() == resourceUsageRequired) {
+                return Transaction.execute(new TransactionCallback<Boolean>() {
+                    @Override
+                    public Boolean doInTransaction(TransactionStatus status) {
+                        final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
+                        if (lockedEntry == null) {
+                            s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
+                            return false;
+                        }
+                        // check before updating
+                        if (lockedEntry.getResourceUsage() == null) {
+                            lockedEntry.setResourceUsage(resourceUsageRequired);
+                            _plannerHostReserveDao.persist(lockedEntry);
                             return true;
                         } else {
-                            s_logger.debug("Cannot use this host for usage: " + resourceUsageRequired
-                                    + ", since this host has been reserved for planner usage : " + hostResourceType);
-                            return false;
+                            // someone updated it earlier. check if we can still use it
+                            if (lockedEntry.getResourceUsage() == resourceUsageRequired) {
+                                return true;
+                            } else {
+                                s_logger.debug("Cannot use this host for usage: " + resourceUsageRequired
+                                        + ", since this host has been reserved for planner usage : " + hostResourceTypeFinal);
+                                return false;
+                            }
                         }
                     }
-                } finally {
-                    txn.commit();
-                }
+                });
+
             }
 
         }
@@ -600,7 +602,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
     }
 
     @DB
-    public boolean checkHostReservationRelease(Long hostId) {
+    public boolean checkHostReservationRelease(final Long hostId) {
 
         if (hostId != null) {
             PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
@@ -662,26 +664,26 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
                     s_logger.debug("Host has no VMs associated, releasing the planner reservation for host " + hostId);
                 }
 
-                long id = reservationEntry.getId();
-                final Transaction txn = Transaction.currentTxn();
+                final long id = reservationEntry.getId();
 
-                try {
-                    txn.start();
+                return Transaction.execute(new TransactionCallback<Boolean>() {
+                    @Override
+                    public Boolean doInTransaction(TransactionStatus status) {
+                        final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
+                        if (lockedEntry == null) {
+                            s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
+                            return false;
+                        }
+                        // check before updating
+                        if (lockedEntry.getResourceUsage() != null) {
+                            lockedEntry.setResourceUsage(null);
+                            _plannerHostReserveDao.persist(lockedEntry);
+                            return true;
+                        }
 
-                    final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
-                    if (lockedEntry == null) {
-                        s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
                         return false;
                     }
-                    // check before updating
-                    if (lockedEntry.getResourceUsage() != null) {
-                        lockedEntry.setResourceUsage(null);
-                        _plannerHostReserveDao.persist(lockedEntry);
-                        return true;
-                    }
-                } finally {
-                    txn.commit();
-                }
+                });
             }
 
         }
@@ -1230,50 +1232,51 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
 
     @DB
     @Override
-    public String finalizeReservation(DeployDestination plannedDestination,
-            VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
+    public String finalizeReservation(final DeployDestination plannedDestination,
+            final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
             throws InsufficientServerCapacityException, AffinityConflictException {
 
-        VirtualMachine vm = vmProfile.getVirtualMachine();
-        long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
+        final VirtualMachine vm = vmProfile.getVirtualMachine();
+        final long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
 
-        boolean saveReservation = true;
-        final Transaction txn = Transaction.currentTxn();
-        try {
-            txn.start();
-            if (vmGroupCount > 0) {
-                List<Long> groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId());
-                SearchCriteria<AffinityGroupVO> criteria = _affinityGroupDao.createSearchCriteria();
-                criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()]));
-                List<AffinityGroupVO> groups = _affinityGroupDao.lockRows(criteria, null, true);
-
-                for (AffinityGroupProcessor processor : _affinityProcessors) {
-                    if (!processor.check(vmProfile, plannedDestination)) {
-                        saveReservation = false;
-                        break;
+        return Transaction.execute(new TransactionCallback<String>() {
+            @Override
+            public String doInTransaction(TransactionStatus status) {
+                boolean saveReservation = true;
+
+                if (vmGroupCount > 0) {
+                    List<Long> groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId());
+                    SearchCriteria<AffinityGroupVO> criteria = _affinityGroupDao.createSearchCriteria();
+                    criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()]));
+                    List<AffinityGroupVO> groups = _affinityGroupDao.lockRows(criteria, null, true);
+
+                    for (AffinityGroupProcessor processor : _affinityProcessors) {
+                        if (!processor.check(vmProfile, plannedDestination)) {
+                            saveReservation = false;
+                            break;
+                        }
                     }
                 }
-            }
 
-            if (saveReservation) {
-                VMReservationVO vmReservation = new VMReservationVO(vm.getId(), plannedDestination.getDataCenter()
-                        .getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster().getId(),
-                        plannedDestination.getHost().getId());
-                Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
+                if (saveReservation) {
+                    VMReservationVO vmReservation = new VMReservationVO(vm.getId(), plannedDestination.getDataCenter()
+                            .getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster().getId(),
+                            plannedDestination.getHost().getId());
+                    Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
 
-                if (vm.getHypervisorType() != HypervisorType.BareMetal) {
-                    for (Volume vo : plannedDestination.getStorageForDisks().keySet()) {
-                        volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId());
+                    if (vm.getHypervisorType() != HypervisorType.BareMetal) {
+                        for (Volume vo : plannedDestination.getStorageForDisks().keySet()) {
+                            volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId());
+                        }
+                        vmReservation.setVolumeReservation(volumeReservationMap);
                     }
-                    vmReservation.setVolumeReservation(volumeReservationMap);
+                    _reservationDao.persist(vmReservation);
+                    return vmReservation.getUuid();
                 }
-                _reservationDao.persist(vmReservation);
-                return vmReservation.getUuid();
+
+                return null;
             }
-        } finally {
-            txn.commit();
-        }
-        return null;
+        });
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
index 1107a7a..801e7da 100644
--- a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
@@ -24,14 +24,13 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 
 import com.cloud.alert.AlertManager;
 import com.cloud.usage.dao.UsageJobDao;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value={HighAvailabilityManager.class})
 public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl {
@@ -74,7 +73,7 @@ public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl
 
             try {
                 boolean isRunning = false;
-                Transaction txn = Transaction.open(Transaction.USAGE_DB);
+                TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
                 try {
                     Date lastHeartbeat = _usageJobDao.getLastHeartbeat();
                     if (lastHeartbeat != null) {
@@ -91,7 +90,7 @@ public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl
                     txn.close();
 
                     // switch back to VMOPS db
-                    Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+                    TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
                     swap.close();
                 }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java b/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
index 83a71b8..d800483 100644
--- a/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
+++ b/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -130,7 +131,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase<HaWorkVO, Long> impl
 
     @Override
     public HaWorkVO take(final long serverId) {
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             final SearchCriteria<HaWorkVO> sc = TBASearch.create();
             sc.setParameters("time", System.currentTimeMillis() >> 10);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index 5481ebb..6f43c96 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -36,6 +36,7 @@ import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.NicDetailDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
+
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -66,6 +67,8 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.uuididentity.dao.IdentityDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
@@ -190,51 +193,50 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_RESOURCE_DETAILS_CREATE, eventDescription = "creating resource meta data")
-    public boolean addResourceMetaData(String resourceId, TaggedResourceType resourceType, Map<String, String> details){
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+    public boolean addResourceMetaData(final String resourceId, final TaggedResourceType resourceType, final Map<String, String> details){
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                for (String key : details.keySet()) {
+                        Long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
+
+                        //check if object exists
+                        if (_daoMap.get(resourceType).findById(id) == null) {
+                            throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
+                                    " and type " + resourceType);
+                        }
+
+                        String value = details.get(key);
+
+                        if (value == null || value.isEmpty()) {
+                            throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+                        }
+
+                        // TODO - Have a better design here.
+                        if(resourceType == TaggedResourceType.Volume){
+                            VolumeDetailVO v = new VolumeDetailVO(id, key, value);
+                            _volumeDetailDao.persist(v);
+                        } else if (resourceType == TaggedResourceType.Nic){
+                            NicDetailVO n = new NicDetailVO(id, key, value);
+                            _nicDetailDao.persist(n);
+                        }else if (resourceType == TaggedResourceType.UserVm){
+                            UserVmDetailVO userVmDetail = new UserVmDetailVO(id, key, value);
+                            _userVmDetailDao.persist(userVmDetail);
+                        } else if (resourceType == TaggedResourceType.Zone){
+                             DcDetailVO dataCenterDetail = new DcDetailVO(id, key, value);
+                             _dcDetailsDao.persist(dataCenterDetail);
+                        } else if (resourceType == TaggedResourceType.Network){
+                            NetworkDetailVO networkDetail = new NetworkDetailVO(id, key, value);
+                            _networkDetailsDao.persist(networkDetail);
+                        } else {
+                            throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
+                        }
 
-        for (String key : details.keySet()) {
-                Long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
-
-                //check if object exists
-                if (_daoMap.get(resourceType).findById(id) == null) {
-                    throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
-                            " and type " + resourceType);
                 }
 
-                String value = details.get(key);
-
-                if (value == null || value.isEmpty()) {
-                    throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
-                }
-
-                // TODO - Have a better design here.
-                if(resourceType == TaggedResourceType.Volume){
-                    VolumeDetailVO v = new VolumeDetailVO(id, key, value);
-                    _volumeDetailDao.persist(v);
-                } else if (resourceType == TaggedResourceType.Nic){
-                    NicDetailVO n = new NicDetailVO(id, key, value);
-                    _nicDetailDao.persist(n);
-                }else if (resourceType == TaggedResourceType.UserVm){
-                    UserVmDetailVO userVmDetail = new UserVmDetailVO(id, key, value);
-                    _userVmDetailDao.persist(userVmDetail);
-                } else if (resourceType == TaggedResourceType.Zone){
-                     DcDetailVO dataCenterDetail = new DcDetailVO(id, key, value);
-                     _dcDetailsDao.persist(dataCenterDetail);
-                } else if (resourceType == TaggedResourceType.Network){
-                    NetworkDetailVO networkDetail = new NetworkDetailVO(id, key, value);
-                    _networkDetailsDao.persist(networkDetail);
-                } else {
-                    throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
-                }
-
-        }
-
-        txn.commit();
-
-        return true;
+                return true;
+            }
+        });
     }
 
 


[06/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 651e82c..8ab06b8 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -118,9 +118,14 @@ import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.exception.ExceptionUtil;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.ReservationContextImpl;
@@ -206,50 +211,50 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     @DB
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         //configure default vpc offering
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCOfferingName) == null) {
-            s_logger.debug("Creating default VPC offering " + VpcOffering.defaultVPCOfferingName);
-            
-            Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
-            Set<Provider> defaultProviders = new HashSet<Provider>();
-            defaultProviders.add(Provider.VPCVirtualRouter);
-            for (Service svc : getSupportedServices()) {
-                if (svc == Service.Lb) {
-                    Set<Provider> lbProviders = new HashSet<Provider>();
-                    lbProviders.add(Provider.VPCVirtualRouter);
-                    lbProviders.add(Provider.InternalLbVm);
-                    svcProviderMap.put(svc, lbProviders);
-                } else {
-                    svcProviderMap.put(svc, defaultProviders);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCOfferingName) == null) {
+                    s_logger.debug("Creating default VPC offering " + VpcOffering.defaultVPCOfferingName);
+                    
+                    Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
+                    Set<Provider> defaultProviders = new HashSet<Provider>();
+                    defaultProviders.add(Provider.VPCVirtualRouter);
+                    for (Service svc : getSupportedServices()) {
+                        if (svc == Service.Lb) {
+                            Set<Provider> lbProviders = new HashSet<Provider>();
+                            lbProviders.add(Provider.VPCVirtualRouter);
+                            lbProviders.add(Provider.InternalLbVm);
+                            svcProviderMap.put(svc, lbProviders);
+                        } else {
+                            svcProviderMap.put(svc, defaultProviders);
+                        }
+                    }
+                    createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap,
+                            true, State.Enabled);
                 }
-            }
-            createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap,
-                    true, State.Enabled);
-        }
-
-        //configure default vpc offering with Netscaler as LB Provider
-        if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCNSOfferingName ) == null) {
-            s_logger.debug("Creating default VPC offering with Netscaler as LB Provider" + VpcOffering.defaultVPCNSOfferingName);
-            Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
-            Set<Provider> defaultProviders = new HashSet<Provider>();
-            defaultProviders.add(Provider.VPCVirtualRouter);
-            for (Service svc : getSupportedServices()) {
-                if (svc == Service.Lb) {
-                    Set<Provider> lbProviders = new HashSet<Provider>();
-                    lbProviders.add(Provider.Netscaler);
-                    lbProviders.add(Provider.InternalLbVm);
-                    svcProviderMap.put(svc, lbProviders);
-                } else {
-                    svcProviderMap.put(svc, defaultProviders);
+        
+                //configure default vpc offering with Netscaler as LB Provider
+                if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCNSOfferingName ) == null) {
+                    s_logger.debug("Creating default VPC offering with Netscaler as LB Provider" + VpcOffering.defaultVPCNSOfferingName);
+                    Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
+                    Set<Provider> defaultProviders = new HashSet<Provider>();
+                    defaultProviders.add(Provider.VPCVirtualRouter);
+                    for (Service svc : getSupportedServices()) {
+                        if (svc == Service.Lb) {
+                            Set<Provider> lbProviders = new HashSet<Provider>();
+                            lbProviders.add(Provider.Netscaler);
+                            lbProviders.add(Provider.InternalLbVm);
+                            svcProviderMap.put(svc, lbProviders);
+                        } else {
+                            svcProviderMap.put(svc, defaultProviders);
+                        }
+                    }
+                    createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName,
+                            svcProviderMap, false, State.Enabled);
                 }
             }
-            createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName,
-                    svcProviderMap, false, State.Enabled);
-        }
-
-        txn.commit();
+        });
         
         Map<String, String> configs = _configDao.getConfiguration(params);
         String value = configs.get(Config.VpcCleanupInterval.key());
@@ -375,36 +380,38 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
 
     
     @DB
-    protected VpcOffering createVpcOffering(String name, String displayText, Map<Network.Service,
-            Set<Network.Provider>> svcProviderMap, boolean isDefault, State state) {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // create vpc offering object
-        VpcOfferingVO offering  = new VpcOfferingVO(name, displayText, isDefault, null);
-        
-        if (state != null) {
-            offering.setState(state);
-        }
-        s_logger.debug("Adding vpc offering " + offering);
-        offering = _vpcOffDao.persist(offering);
-        // populate services and providers
-        if (svcProviderMap != null) {
-            for (Network.Service service : svcProviderMap.keySet()) {
-                Set<Provider> providers = svcProviderMap.get(service);
-                if (providers != null && !providers.isEmpty()) {
-                    for (Network.Provider provider : providers) {
-                        VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
-                        _vpcOffSvcMapDao.persist(offService);
-                        s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName());
+    protected VpcOffering createVpcOffering(final String name, final String displayText, final Map<Network.Service,
+            Set<Network.Provider>> svcProviderMap, final boolean isDefault, final State state) {
+        return Transaction.execute(new TransactionCallback<VpcOffering>() {
+            @Override
+            public VpcOffering doInTransaction(TransactionStatus status) {
+                // create vpc offering object
+                VpcOfferingVO offering  = new VpcOfferingVO(name, displayText, isDefault, null);
+
+                if (state != null) {
+                    offering.setState(state);
+                }
+                s_logger.debug("Adding vpc offering " + offering);
+                offering = _vpcOffDao.persist(offering);
+                // populate services and providers
+                if (svcProviderMap != null) {
+                    for (Network.Service service : svcProviderMap.keySet()) {
+                        Set<Provider> providers = svcProviderMap.get(service);
+                        if (providers != null && !providers.isEmpty()) {
+                            for (Network.Provider provider : providers) {
+                                VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
+                                _vpcOffSvcMapDao.persist(offService);
+                                s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName());
+                            }
+                        } else {
+                            throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName());
+                        }
                     }
-                } else {
-                    throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName());
                 }
-            }
-        }
-        txn.commit();
 
-        return offering;
+                return offering;
+            }
+        });
     }
     
     @Override
@@ -635,14 +642,14 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
 
     
     @DB
-    protected Vpc createVpc(long zoneId, long vpcOffId, Account vpcOwner, String vpcName, String displayText, String cidr,
-            String networkDomain) {
-        
+    protected Vpc createVpc(final long zoneId, final long vpcOffId, final Account vpcOwner, final String vpcName, final String displayText, final String cidr,
+            final String networkDomain) {
+
         //Validate CIDR
         if (!NetUtils.isValidCIDR(cidr)) {
             throw new InvalidParameterValueException("Invalid CIDR specified " + cidr);
         }
-        
+
         //cidr has to be RFC 1918 complient
         if (!NetUtils.validateGuestCidr(cidr)) {
             throw new InvalidParameterValueException("Guest Cidr " + cidr + " is not RFC1918 compliant");
@@ -657,17 +664,19 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                             + "and the hyphen ('-'); can't start or end with \"-\"");
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        VpcVO vpc = new VpcVO (zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId, cidr,
-                networkDomain);
-        vpc = _vpcDao.persist(vpc, finalizeServicesAndProvidersForVpc(zoneId, vpcOffId));
-        _resourceLimitMgr.incrementResourceCount(vpcOwner.getId(), ResourceType.vpc);
-        txn.commit();
+        return Transaction.execute(new TransactionCallback<VpcVO>() {
+            @Override
+            public VpcVO doInTransaction(TransactionStatus status) {
+                VpcVO vpc = new VpcVO (zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId, cidr,
+                        networkDomain);
+                vpc = _vpcDao.persist(vpc, finalizeServicesAndProvidersForVpc(zoneId, vpcOffId));
+                _resourceLimitMgr.incrementResourceCount(vpcOwner.getId(), ResourceType.vpc);
 
-        s_logger.debug("Created VPC " + vpc);
+                s_logger.debug("Created VPC " + vpc);
 
-        return vpc;
+                return vpc;
+            }
+        });
     }
 
     private Map<String, List<String>> finalizeServicesAndProvidersForVpc(long zoneId, long offeringId) {
@@ -722,7 +731,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
 
     @Override
     @DB
-    public boolean destroyVpc(Vpc vpc, Account caller, Long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException {
+    public boolean destroyVpc(final Vpc vpc, Account caller, Long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException {
         s_logger.debug("Destroying vpc " + vpc);
         
         //don't allow to delete vpc if it's in use by existing non system networks (system networks are networks of a private gateway of the VPC,
@@ -735,16 +744,18 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         //mark VPC as inactive
         if (vpc.getState() != Vpc.State.Inactive) {
             s_logger.debug("Updating VPC " + vpc + " with state " + Vpc.State.Inactive + " as a part of vpc delete");
-            VpcVO vpcVO = _vpcDao.findById(vpc.getId());
+            final VpcVO vpcVO = _vpcDao.findById(vpc.getId());
             vpcVO.setState(Vpc.State.Inactive);
             
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            _vpcDao.update(vpc.getId(), vpcVO);
-            
-            //decrement resource count
-            _resourceLimitMgr.decrementResourceCount(vpc.getAccountId(), ResourceType.vpc);
-            txn.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    _vpcDao.update(vpc.getId(), vpcVO);
+
+                    //decrement resource count
+                    _resourceLimitMgr.decrementResourceCount(vpc.getAccountId(), ResourceType.vpc);
+                }
+            });
         }
         
         //shutdown VPC
@@ -1140,67 +1151,68 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     }
 
     @DB
-    protected void validateNewVpcGuestNetwork(String cidr, String gateway, Account networkOwner, Vpc vpc, String networkDomain) {
-        
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        Vpc locked = _vpcDao.acquireInLockTable(vpc.getId());
-        if (locked == null) {
-            throw new CloudRuntimeException("Unable to acquire lock on " + vpc);
-        }
-        
-        try {
-            //check number of active networks in vpc
-            if (_ntwkDao.countVpcNetworks(vpc.getId()) >= _maxNetworks) {
-                throw new CloudRuntimeException("Number of networks per VPC can't extend "
-                        + _maxNetworks + "; increase it using global config " + Config.VpcMaxNetworks);
-            }
-            
-            
-            //1) CIDR is required
-            if (cidr == null) {
-                throw new InvalidParameterValueException("Gateway/netmask are required when create network for VPC");
-            }
-            
-            //2) Network cidr should be within vpcCidr
-            if (!NetUtils.isNetworkAWithinNetworkB(cidr, vpc.getCidr())) {
-                throw new InvalidParameterValueException("Network cidr " + cidr + " is not within vpc " + vpc + " cidr");
-            }
-            
-            //3) Network cidr shouldn't cross the cidr of other vpc network cidrs
-            List<? extends Network> ntwks = _ntwkDao.listByVpc(vpc.getId());
-            for (Network ntwk : ntwks) {
-                assert (cidr != null) : "Why the network cidr is null when it belongs to vpc?";
+    protected void validateNewVpcGuestNetwork(final String cidr, final String gateway, final Account networkOwner, final Vpc vpc, final String networkDomain) {
+        
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                Vpc locked = _vpcDao.acquireInLockTable(vpc.getId());
+                if (locked == null) {
+                    throw new CloudRuntimeException("Unable to acquire lock on " + vpc);
+                }
                 
-                if (NetUtils.isNetworkAWithinNetworkB(ntwk.getCidr(), cidr)
-                        || NetUtils.isNetworkAWithinNetworkB(cidr, ntwk.getCidr())) {
-                    throw new InvalidParameterValueException("Network cidr " + cidr + " crosses other network cidr " + ntwk +
-                            " belonging to the same vpc " + vpc);
+                try {
+                    //check number of active networks in vpc
+                    if (_ntwkDao.countVpcNetworks(vpc.getId()) >= _maxNetworks) {
+                        throw new CloudRuntimeException("Number of networks per VPC can't extend "
+                                + _maxNetworks + "; increase it using global config " + Config.VpcMaxNetworks);
+                    }
+                    
+                    
+                    //1) CIDR is required
+                    if (cidr == null) {
+                        throw new InvalidParameterValueException("Gateway/netmask are required when create network for VPC");
+                    }
+                    
+                    //2) Network cidr should be within vpcCidr
+                    if (!NetUtils.isNetworkAWithinNetworkB(cidr, vpc.getCidr())) {
+                        throw new InvalidParameterValueException("Network cidr " + cidr + " is not within vpc " + vpc + " cidr");
+                    }
+                    
+                    //3) Network cidr shouldn't cross the cidr of other vpc network cidrs
+                    List<? extends Network> ntwks = _ntwkDao.listByVpc(vpc.getId());
+                    for (Network ntwk : ntwks) {
+                        assert (cidr != null) : "Why the network cidr is null when it belongs to vpc?";
+                        
+                        if (NetUtils.isNetworkAWithinNetworkB(ntwk.getCidr(), cidr)
+                                || NetUtils.isNetworkAWithinNetworkB(cidr, ntwk.getCidr())) {
+                            throw new InvalidParameterValueException("Network cidr " + cidr + " crosses other network cidr " + ntwk +
+                                    " belonging to the same vpc " + vpc);
+                        }
+                    }
+                    
+                    //4) vpc and network should belong to the same owner
+                    if (vpc.getAccountId() != networkOwner.getId()) {
+                        throw new InvalidParameterValueException("Vpc " + vpc + " owner is different from the network owner "
+                                + networkOwner);
+                    }
+                    
+                    //5) network domain should be the same as VPC's
+                    if (!networkDomain.equalsIgnoreCase(vpc.getNetworkDomain())) {
+                        throw new InvalidParameterValueException("Network domain of the new network should match network" +
+                        		" domain of vpc " + vpc);
+                    }
+                    
+                    //6) gateway should never be equal to the cidr subnet
+                    if (NetUtils.getCidrSubNet(cidr).equalsIgnoreCase(gateway)) {
+                        throw new InvalidParameterValueException("Invalid gateway specified. It should never be equal to the cidr subnet value");
+                    }
+                } finally {
+                    s_logger.debug("Releasing lock for " + locked);
+                    _vpcDao.releaseFromLockTable(locked.getId());
                 }
             }
-            
-            //4) vpc and network should belong to the same owner
-            if (vpc.getAccountId() != networkOwner.getId()) {
-                throw new InvalidParameterValueException("Vpc " + vpc + " owner is different from the network owner "
-                        + networkOwner);
-            }
-            
-            //5) network domain should be the same as VPC's
-            if (!networkDomain.equalsIgnoreCase(vpc.getNetworkDomain())) {
-                throw new InvalidParameterValueException("Network domain of the new network should match network" +
-                		" domain of vpc " + vpc);
-            }
-            
-            //6) gateway should never be equal to the cidr subnet
-            if (NetUtils.getCidrSubNet(cidr).equalsIgnoreCase(gateway)) {
-                throw new InvalidParameterValueException("Invalid gateway specified. It should never be equal to the cidr subnet value");
-            }
-
-            txn.commit();
-        } finally {
-            s_logger.debug("Releasing lock for " + locked);
-            _vpcDao.releaseFromLockTable(locked.getId());
-        }
+        });
     }
 
 
@@ -1361,12 +1373,12 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_PRIVATE_GATEWAY_CREATE, eventDescription = "creating vpc private gateway", create=true)
-    public PrivateGateway createVpcPrivateGateway(long vpcId, Long physicalNetworkId, String broadcastUri, String ipAddress,
-            String gateway, String netmask, long gatewayOwnerId, Long networkOfferingId, Boolean isSourceNat, Long aclId) throws ResourceAllocationException,
+    public PrivateGateway createVpcPrivateGateway(final long vpcId, Long physicalNetworkId, final String broadcastUri, final String ipAddress,
+            final String gateway, final String netmask, final long gatewayOwnerId, final Long networkOfferingId, final Boolean isSourceNat, final Long aclId) throws ResourceAllocationException,
             ConcurrentOperationException, InsufficientCapacityException {
         
         //Validate parameters
-        Vpc vpc = getActiveVpc(vpcId);
+        final Vpc vpc = getActiveVpc(vpcId);
         if (vpc == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find Enabled VPC by id specified");
             ex.addProxyObject(String.valueOf(vpcId), "VPC");
@@ -1387,66 +1399,79 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         if (physNet == null) {
             physNet = _entityMgr.findById(PhysicalNetwork.class,physicalNetworkId);
         }
-        Long dcId = physNet.getDataCenterId();
-        
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        s_logger.debug("Creating Private gateway for VPC " + vpc);
-        //1) create private network unless it is existing and lswitch'd
-        Network privateNtwk = null;
-        if (BroadcastDomainType.getSchemeValue(BroadcastDomainType.fromString(broadcastUri)) == BroadcastDomainType.Lswitch) {
-            String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
-
-            privateNtwk = _ntwkDao.getPrivateNetwork(broadcastUri, cidr,
-                    gatewayOwnerId, dcId, networkOfferingId);
-            s_logger.info("found and using existing network for vpc " + vpc + ": " + broadcastUri);
-        }
-        if (privateNtwk == null) {
-            s_logger.info("creating new network for vpc " + vpc + " using broadcast uri: " + broadcastUri);
-            String networkName = "vpc-" + vpc.getName() + "-privateNetwork";
-            privateNtwk = _ntwkSvc.createPrivateNetwork(networkName, networkName, physicalNetworkId, 
-                broadcastUri, ipAddress, null, gateway, netmask, gatewayOwnerId, vpcId, isSourceNat, networkOfferingId);
-        } else { // create the nic/ip as createPrivateNetwork doesn''t do that work for us now
-            DataCenterVO dc = _dcDao.lockRow(physNet.getDataCenterId(), true);
-
-            //add entry to private_ip_address table
-            PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNtwk.getId(), ipAddress);
-            if (privateIp != null) {
-                throw new InvalidParameterValueException("Private ip address " + ipAddress + " already used for private gateway" +
-                        " in zone " + _entityMgr.findById(DataCenter.class,dcId).getName());
-            }
-
-            Long mac = dc.getMacAddress();
-            Long nextMac = mac + 1;
-            dc.setMacAddress(nextMac);
-
-            privateIp = new PrivateIpVO(ipAddress, privateNtwk.getId(), nextMac, vpcId, true);
-            _privateIpDao.persist(privateIp);
-
-            _dcDao.update(dc.getId(), dc);
-        }
-
-        long networkAclId = NetworkACL.DEFAULT_DENY;
-        if (aclId != null) {
-            NetworkACLVO aclVO = _networkAclDao.findById(aclId);
-            if ( aclVO == null) {
-                throw new InvalidParameterValueException("Invalid network acl id passed ");
-            }
-            if ((aclVO.getVpcId() != vpcId) && !(aclId == NetworkACL.DEFAULT_DENY || aclId == NetworkACL.DEFAULT_ALLOW)) {
-                throw new InvalidParameterValueException("Private gateway and network acl are not in the same vpc");
-            }
-
-            networkAclId = aclId;
-        }
-
-        //2) create gateway entry
-        VpcGatewayVO gatewayVO = new VpcGatewayVO(ipAddress, VpcGateway.Type.Private, vpcId, privateNtwk.getDataCenterId(),
-                privateNtwk.getId(), broadcastUri, gateway, netmask, vpc.getAccountId(), vpc.getDomainId(), isSourceNat, networkAclId);
-        _vpcGatewayDao.persist(gatewayVO);
-        
-        s_logger.debug("Created vpc gateway entry " + gatewayVO);
+        final Long dcId = physNet.getDataCenterId();
         
-        txn.commit();
+        final Long physicalNetworkIdFinal = physicalNetworkId;
+        final PhysicalNetwork physNetFinal = physNet;
+        VpcGatewayVO gatewayVO = null;
+        try {
+            gatewayVO = Transaction.executeWithException(new TransactionCallbackWithException<VpcGatewayVO>() {
+                @Override
+                public VpcGatewayVO doInTransaction(TransactionStatus status) throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
+                    s_logger.debug("Creating Private gateway for VPC " + vpc);
+                    //1) create private network unless it is existing and lswitch'd
+                    Network privateNtwk = null;
+                    if (BroadcastDomainType.getSchemeValue(BroadcastDomainType.fromString(broadcastUri)) == BroadcastDomainType.Lswitch) {
+                        String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+            
+                        privateNtwk = _ntwkDao.getPrivateNetwork(broadcastUri, cidr,
+                                gatewayOwnerId, dcId, networkOfferingId);
+                        s_logger.info("found and using existing network for vpc " + vpc + ": " + broadcastUri);
+                    }
+                    if (privateNtwk == null) {
+                        s_logger.info("creating new network for vpc " + vpc + " using broadcast uri: " + broadcastUri);
+                        String networkName = "vpc-" + vpc.getName() + "-privateNetwork";
+                        privateNtwk = _ntwkSvc.createPrivateNetwork(networkName, networkName, physicalNetworkIdFinal, 
+                            broadcastUri, ipAddress, null, gateway, netmask, gatewayOwnerId, vpcId, isSourceNat, networkOfferingId);
+                    } else { // create the nic/ip as createPrivateNetwork doesn''t do that work for us now
+                        DataCenterVO dc = _dcDao.lockRow(physNetFinal.getDataCenterId(), true);
+            
+                        //add entry to private_ip_address table
+                        PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNtwk.getId(), ipAddress);
+                        if (privateIp != null) {
+                            throw new InvalidParameterValueException("Private ip address " + ipAddress + " already used for private gateway" +
+                                    " in zone " + _entityMgr.findById(DataCenter.class,dcId).getName());
+                        }
+            
+                        Long mac = dc.getMacAddress();
+                        Long nextMac = mac + 1;
+                        dc.setMacAddress(nextMac);
+            
+                        privateIp = new PrivateIpVO(ipAddress, privateNtwk.getId(), nextMac, vpcId, true);
+                        _privateIpDao.persist(privateIp);
+            
+                        _dcDao.update(dc.getId(), dc);
+                    }
+            
+                    long networkAclId = NetworkACL.DEFAULT_DENY;
+                    if (aclId != null) {
+                        NetworkACLVO aclVO = _networkAclDao.findById(aclId);
+                        if ( aclVO == null) {
+                            throw new InvalidParameterValueException("Invalid network acl id passed ");
+                        }
+                        if ((aclVO.getVpcId() != vpcId) && !(aclId == NetworkACL.DEFAULT_DENY || aclId == NetworkACL.DEFAULT_ALLOW)) {
+                            throw new InvalidParameterValueException("Private gateway and network acl are not in the same vpc");
+                        }
+            
+                        networkAclId = aclId;
+                    }
+            
+                    //2) create gateway entry
+                    VpcGatewayVO gatewayVO = new VpcGatewayVO(ipAddress, VpcGateway.Type.Private, vpcId, privateNtwk.getDataCenterId(),
+                            privateNtwk.getId(), broadcastUri, gateway, netmask, vpc.getAccountId(), vpc.getDomainId(), isSourceNat, networkAclId);
+                    _vpcGatewayDao.persist(gatewayVO);
+                    
+                    s_logger.debug("Created vpc gateway entry " + gatewayVO);
+                    
+                    return gatewayVO;
+                }
+            }, Exception.class);
+        } catch (Exception e) {
+            ExceptionUtil.rethrowRuntime(e);
+            ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
+            ExceptionUtil.rethrow(e, ResourceAllocationException.class);
+            throw new IllegalStateException(e);
+        }
         
         return getVpcPrivateGateway(gatewayVO.getId());
     }
@@ -1496,26 +1521,28 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     @DB
     public boolean deleteVpcPrivateGateway(long gatewayId) throws ConcurrentOperationException, ResourceUnavailableException {
         
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        VpcGatewayVO gatewayVO = _vpcGatewayDao.acquireInLockTable(gatewayId);
+        final VpcGatewayVO gatewayVO = _vpcGatewayDao.acquireInLockTable(gatewayId);
         if (gatewayVO == null || gatewayVO.getType() != VpcGateway.Type.Private) {
             throw new ConcurrentOperationException("Unable to lock gateway " + gatewayId);
         }
 
         try {
-            //don't allow to remove gateway when there are static routes associated with it
-            long routeCount = _staticRouteDao.countRoutesByGateway(gatewayVO.getId());
-            if (routeCount > 0) {
-                throw new CloudRuntimeException("Can't delete private gateway " + gatewayVO + " as it has " + routeCount +
-                        " static routes applied. Remove the routes first");
-            }
-            
-            gatewayVO.setState(VpcGateway.State.Deleting);
-            _vpcGatewayDao.update(gatewayVO.getId(), gatewayVO);
-            s_logger.debug("Marked gateway " + gatewayVO + " with state " + VpcGateway.State.Deleting);
-            
-            txn.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    //don't allow to remove gateway when there are static routes associated with it
+                    long routeCount = _staticRouteDao.countRoutesByGateway(gatewayVO.getId());
+                    if (routeCount > 0) {
+                        throw new CloudRuntimeException("Can't delete private gateway " + gatewayVO + " as it has " + routeCount +
+                                " static routes applied. Remove the routes first");
+                    }
+
+                    gatewayVO.setState(VpcGateway.State.Deleting);
+                    _vpcGatewayDao.update(gatewayVO.getId(), gatewayVO);
+                    s_logger.debug("Marked gateway " + gatewayVO + " with state " + VpcGateway.State.Deleting);
+                }
+            });
+
 
             //1) delete the gateway on the backend
             PrivateGateway gateway = getVpcPrivateGateway(gatewayId);
@@ -1539,9 +1566,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     }
     
     @DB
-    protected boolean deletePrivateGatewayFromTheDB(PrivateGateway gateway) {
+    protected boolean deletePrivateGatewayFromTheDB(final PrivateGateway gateway) {
         //check if there are ips allocted in the network
-        long networkId = gateway.getNetworkId();
+        final long networkId = gateway.getNetworkId();
         
         boolean deleteNetwork = true;
         List<PrivateIpVO> privateIps = _privateIpDao.listByNetworkId(networkId);
@@ -1550,27 +1577,31 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             deleteNetwork = false;
         }
         
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(), gateway.getIp4Address());
-        if (ip != null) {
-            _privateIpDao.remove(ip.getId());
-            s_logger.debug("Deleted private ip " + ip);
-        }
-        
-        if (deleteNetwork) {
-            User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
-            Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
-            ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner);
-            _ntwkMgr.destroyNetwork(networkId, context);
-            s_logger.debug("Deleted private network id=" + networkId);
-        }
-        
-        _vpcGatewayDao.remove(gateway.getId());
-        s_logger.debug("Deleted private gateway " + gateway);
+        //TODO: Clean this up, its bad.  There is a DB transaction wrapping calls to NetworkElements (destroyNetwork will
+        // call network elements).
+        final boolean deleteNetworkFinal = deleteNetwork;
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(), gateway.getIp4Address());
+                if (ip != null) {
+                    _privateIpDao.remove(ip.getId());
+                    s_logger.debug("Deleted private ip " + ip);
+                }
+                
+                if (deleteNetworkFinal) {
+                    User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
+                    Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
+                    ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner);
+                    _ntwkMgr.destroyNetwork(networkId, context);
+                    s_logger.debug("Deleted private network id=" + networkId);
+                }
+                
+                _vpcGatewayDao.remove(gateway.getId());
+                s_logger.debug("Deleted private gateway " + gateway);
+            }
+        });
         
-        txn.commit();
         return true;
     }
 
@@ -1729,18 +1760,20 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     }
     
     @DB
-    protected boolean revokeStaticRoutesForVpc(long vpcId, Account caller) throws ResourceUnavailableException {
+    protected boolean revokeStaticRoutesForVpc(long vpcId, final Account caller) throws ResourceUnavailableException {
         //get all static routes for the vpc
-        List<StaticRouteVO> routes = _staticRouteDao.listByVpcId(vpcId);
+        final List<StaticRouteVO> routes = _staticRouteDao.listByVpcId(vpcId);
         s_logger.debug("Found " + routes.size() + " to revoke for the vpc " + vpcId);
         if (!routes.isEmpty()) {
             //mark all of them as revoke
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            for (StaticRouteVO route : routes) {
-                markStaticRouteForRevoke(route, caller);
-            }
-            txn.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    for (StaticRouteVO route : routes) {
+                        markStaticRouteForRevoke(route, caller);
+                    }
+                }
+            });
             return applyStaticRoutes(vpcId);
         }
         
@@ -1750,11 +1783,11 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_STATIC_ROUTE_CREATE, eventDescription = "creating static route", create=true)
-    public StaticRoute createStaticRoute(long gatewayId, String cidr) throws NetworkRuleConflictException {
+    public StaticRoute createStaticRoute(long gatewayId, final String cidr) throws NetworkRuleConflictException {
         Account caller = CallContext.current().getCallingAccount();
         
         //parameters validation
-        VpcGateway gateway = _vpcGatewayDao.findById(gatewayId);
+        final VpcGateway gateway = _vpcGatewayDao.findById(gatewayId);
         if (gateway == null) {
             throw new InvalidParameterValueException("Invalid gateway id is given");
         }
@@ -1763,7 +1796,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             throw new InvalidParameterValueException("Gateway is not in the " + VpcGateway.State.Ready + " state: " + gateway.getState());
         }
         
-        Vpc vpc = getActiveVpc(gateway.getVpcId());
+        final Vpc vpc = getActiveVpc(gateway.getVpcId());
         if (vpc == null) {
             throw new InvalidParameterValueException("Can't add static route to VPC that is being deleted");
         }
@@ -1789,23 +1822,23 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             throw new InvalidParameterValueException("The static gateway cidr overlaps with one of the blacklisted routes of the zone the VPC belongs to");
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId());
-        s_logger.debug("Adding static route " + newRoute);
-        newRoute = _staticRouteDao.persist(newRoute);
-        
-        detectRoutesConflict(newRoute);
-
-        if (!_staticRouteDao.setStateToAdd(newRoute)) {
-            throw new CloudRuntimeException("Unable to update the state to add for " + newRoute);
-        }
-        CallContext.current().setEventDetails("Static route Id: " + newRoute.getId());
+        return Transaction.executeWithException(new TransactionCallbackWithException<StaticRouteVO>() {
+            @Override
+            public StaticRouteVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId());
+                s_logger.debug("Adding static route " + newRoute);
+                newRoute = _staticRouteDao.persist(newRoute);
+                
+                detectRoutesConflict(newRoute);
         
-        txn.commit();
-
-        return newRoute;
+                if (!_staticRouteDao.setStateToAdd(newRoute)) {
+                    throw new CloudRuntimeException("Unable to update the state to add for " + newRoute);
+                }
+                CallContext.current().setEventDetails("Static route Id: " + newRoute.getId());
+                
+                return newRoute;
+            }
+        }, NetworkRuleConflictException.class);
     }
 
     protected boolean isCidrBlacklisted(String cidr, long zoneId) {
@@ -1947,23 +1980,24 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                     return;
                 }
 
-                Transaction txn = null;
                 try {
-                    txn = Transaction.open(Transaction.CLOUD_DB);
-
-                    // Cleanup inactive VPCs
-                    List<VpcVO> inactiveVpcs = _vpcDao.listInactiveVpcs();
-                    s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup");
-                    for (VpcVO vpc : inactiveVpcs) {
-                        s_logger.debug("Cleaning up " + vpc);
-                        destroyVpc(vpc, _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
-                    }
+                    Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                        @Override
+                        public Object doInTransaction(TransactionStatus status) throws Exception {
+                            // Cleanup inactive VPCs
+                            List<VpcVO> inactiveVpcs = _vpcDao.listInactiveVpcs();
+                            s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup");
+                            for (VpcVO vpc : inactiveVpcs) {
+                                s_logger.debug("Cleaning up " + vpc);
+                                destroyVpc(vpc, _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
+                            }
+                            
+                            return null;
+                        }
+                    }, Exception.class);
                 } catch (Exception e) {
                     s_logger.error("Exception ", e);
                 } finally {
-                    if (txn != null) {
-                        txn.close();
-                    }
                     lock.unlock();
                 }
             } catch (Exception e) {
@@ -1976,7 +2010,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     @DB
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "associating Ip", async = true)
-    public IpAddress associateIPToVpc(long ipId, long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
+    public IpAddress associateIPToVpc(final long ipId, final long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
     InsufficientAddressCapacityException, ConcurrentOperationException {
         Account caller = CallContext.current().getCallingAccount();
         Account owner = null;
@@ -2005,17 +2039,20 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
 
         s_logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        IPAddressVO ip = _ipAddressDao.findById(ipId);
-        //update ip address with networkId
-        ip.setVpcId(vpcId);
-        ip.setSourceNat(isSourceNat);
-        _ipAddressDao.update(ipId, ip);
-
-        //mark ip as allocated
-        _ipAddrMgr.markPublicIpAsAllocated(ip);
-        txn.commit();
+        final boolean isSourceNatFinal = isSourceNat; 
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                IPAddressVO ip = _ipAddressDao.findById(ipId);
+                //update ip address with networkId
+                ip.setVpcId(vpcId);
+                ip.setSourceNat(isSourceNatFinal);
+                _ipAddressDao.update(ipId, ip);
+
+                //mark ip as allocated
+                _ipAddrMgr.markPublicIpAsAllocated(ip);
+            }
+        });
 
         s_logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + vpc);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
index 6cd164d..7912df4 100755
--- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
+++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.command.user.vpn.ListRemoteAccessVpnsCmd;
 import org.apache.cloudstack.api.command.user.vpn.ListVpnUsersCmd;
 import org.apache.cloudstack.context.CallContext;
@@ -80,8 +79,12 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.net.NetUtils;
 
 @Local(value = RemoteAccessVpnService.class)
@@ -114,13 +117,13 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
 
     @Override
     @DB
-    public RemoteAccessVpn createRemoteAccessVpn(long publicIpId, String ipRange, boolean openFirewall, long networkId)
+    public RemoteAccessVpn createRemoteAccessVpn(final long publicIpId, String ipRange, final boolean openFirewall, long networkId)
             throws NetworkRuleConflictException {
         CallContext ctx = CallContext.current();
-        Account caller = ctx.getCallingAccount();
+        final Account caller = ctx.getCallingAccount();
 
         // make sure ip address exists
-        PublicIpAddress ipAddr = _networkMgr.getPublicIpAddress(publicIpId);
+        final PublicIpAddress ipAddr = _networkMgr.getPublicIpAddress(publicIpId);
         if (ipAddr == null) {
             throw new InvalidParameterValueException("Unable to create remote access vpn, invalid public IP address id" + publicIpId);
         }
@@ -163,7 +166,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
         if (ipRange == null) {
             ipRange = RemoteAccessVpnClientIpRange.valueIn(ipAddr.getAccountId());
         }
-        String[] range = ipRange.split("-");
+        final String[] range = ipRange.split("-");
         if (range.length != 2) {
             throw new InvalidParameterValueException("Invalid ip range");
         }
@@ -187,19 +190,18 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
         // TODO: check overlap with private and public ip ranges in datacenter
 
         long startIp = NetUtils.ip2Long(range[0]);
-        String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1];
-        String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength);
-        
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        _rulesMgr.reservePorts(ipAddr, NetUtils.UDP_PROTO, Purpose.Vpn, openFirewall, caller, NetUtils.VPN_PORT, NetUtils.VPN_L2TP_PORT, NetUtils.VPN_NATT_PORT);
-        vpnVO = new RemoteAccessVpnVO(ipAddr.getAccountId(), ipAddr.getDomainId(), ipAddr.getAssociatedWithNetworkId(),
-                publicIpId, range[0], newIpRange, sharedSecret);
-        RemoteAccessVpn vpn = _remoteAccessVpnDao.persist(vpnVO);
+        final String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1];
+        final String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength);
         
-        txn.commit();
-        return vpn;
+        return Transaction.executeWithException(new TransactionCallbackWithException<RemoteAccessVpn>() {
+            @Override
+            public RemoteAccessVpn doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                _rulesMgr.reservePorts(ipAddr, NetUtils.UDP_PROTO, Purpose.Vpn, openFirewall, caller, NetUtils.VPN_PORT, NetUtils.VPN_L2TP_PORT, NetUtils.VPN_NATT_PORT);
+                RemoteAccessVpnVO vpnVO = new RemoteAccessVpnVO(ipAddr.getAccountId(), ipAddr.getDomainId(), ipAddr.getAssociatedWithNetworkId(),
+                        publicIpId, range[0], newIpRange, sharedSecret);
+                return _remoteAccessVpnDao.persist(vpnVO);
+            }
+        }, NetworkRuleConflictException.class);
     }
 
     private void validateRemoteAccessVpnConfiguration() throws ConfigurationException {
@@ -230,7 +232,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
 
     @Override @DB
     public void destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException {
-        RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipId);
+        final RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipId);
         if (vpn == null) {
             s_logger.debug("there are no Remote access vpns for public ip address id=" + ipId);
             return;
@@ -255,28 +257,28 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
         } finally {
             if (success) {
                 //Cleanup corresponding ports
-                List<? extends FirewallRule> vpnFwRules = _rulesDao.listByIpAndPurpose(ipId, Purpose.Vpn);
-                Transaction txn = Transaction.currentTxn();
+                final List<? extends FirewallRule> vpnFwRules = _rulesDao.listByIpAndPurpose(ipId, Purpose.Vpn);
 
                 boolean applyFirewall = false;
-                List<FirewallRuleVO> fwRules = new ArrayList<FirewallRuleVO>();
+                final List<FirewallRuleVO> fwRules = new ArrayList<FirewallRuleVO>();
                 //if related firewall rule is created for the first vpn port, it would be created for the 2 other ports as well, so need to cleanup the backend
                 if (_rulesDao.findByRelatedId(vpnFwRules.get(0).getId()) != null) {
                     applyFirewall = true;
                 }
 
                 if (applyFirewall) {
-                    txn.start();
-
-                    for (FirewallRule vpnFwRule : vpnFwRules) {
-                        //don't apply on the backend yet; send all 3 rules in a banch
-                        _firewallMgr.revokeRelatedFirewallRule(vpnFwRule.getId(), false);
-                        fwRules.add(_rulesDao.findByRelatedId(vpnFwRule.getId()));
-                    }
-
-                    s_logger.debug("Marked " + fwRules.size() + " firewall rules as Revoked as a part of disable remote access vpn");
-
-                    txn.commit();
+                    Transaction.execute(new TransactionCallbackNoReturn() {
+                        @Override
+                        public void doInTransactionWithoutResult(TransactionStatus status) {
+                            for (FirewallRule vpnFwRule : vpnFwRules) {
+                                //don't apply on the backend yet; send all 3 rules in a banch
+                                _firewallMgr.revokeRelatedFirewallRule(vpnFwRule.getId(), false);
+                                fwRules.add(_rulesDao.findByRelatedId(vpnFwRule.getId()));
+                            }
+        
+                            s_logger.debug("Marked " + fwRules.size() + " firewall rules as Revoked as a part of disable remote access vpn");
+                        }
+                    });
 
                     //now apply vpn rules on the backend
                     s_logger.debug("Reapplying firewall rules for ip id=" + ipId + " as a part of disable remote access vpn");
@@ -285,26 +287,28 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
 
                 if (success) {
                     try {
-                        txn.start();
-                        _remoteAccessVpnDao.remove(vpn.getId());
-                        // Stop billing of VPN users when VPN is removed. VPN_User_ADD events will be generated when VPN is created again
-                        List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
-                        for(VpnUserVO user : vpnUsers){
-                            // VPN_USER_REMOVE event is already generated for users in Revoke state
-                            if(user.getState() != VpnUser.State.Revoke){
-                                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
-                                        0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
-                            }
-                        }
-                        if (vpnFwRules != null) {
-                            for (FirewallRule vpnFwRule : vpnFwRules) {
-                                _rulesDao.remove(vpnFwRule.getId());
-                                s_logger.debug("Successfully removed firewall rule with ip id=" + vpnFwRule.getSourceIpAddressId() + " and port " + vpnFwRule.getSourcePortStart() + " as a part of vpn cleanup");
+                        Transaction.execute(new TransactionCallbackNoReturn() {
+                            @Override
+                            public void doInTransactionWithoutResult(TransactionStatus status) {
+                                _remoteAccessVpnDao.remove(vpn.getId());
+                                // Stop billing of VPN users when VPN is removed. VPN_User_ADD events will be generated when VPN is created again
+                                List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
+                                for(VpnUserVO user : vpnUsers){
+                                    // VPN_USER_REMOVE event is already generated for users in Revoke state
+                                    if(user.getState() != VpnUser.State.Revoke){
+                                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
+                                                0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+                                    }
+                                }
+                                if (vpnFwRules != null) {
+                                    for (FirewallRule vpnFwRule : vpnFwRules) {
+                                        _rulesDao.remove(vpnFwRule.getId());
+                                        s_logger.debug("Successfully removed firewall rule with ip id=" + vpnFwRule.getSourceIpAddressId() + " and port " + vpnFwRule.getSourcePortStart() + " as a part of vpn cleanup");
+                                    }
+                                }
                             }
-                        }
-                        txn.commit();
+                        });
                     } catch (Exception ex) {
-                        txn.rollback();
                         s_logger.warn("Unable to release the three vpn ports from the firewall rules", ex);
                     }
                 }
@@ -314,8 +318,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
 
     @Override
     @DB
-    public VpnUser addVpnUser(long vpnOwnerId, String username, String password) {
-        Account caller = CallContext.current().getCallingAccount();
+    public VpnUser addVpnUser(final long vpnOwnerId, final String username, final String password) {
+        final Account caller = CallContext.current().getCallingAccount();
 
         if (!username.matches("^[a-zA-Z0-9][a-zA-Z0-9@._-]{2,63}$")) {
             throw new InvalidParameterValueException(
@@ -324,46 +328,54 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
         if (!password.matches("^[a-zA-Z0-9][a-zA-Z0-9@#+=._-]{2,31}$")) {
             throw new InvalidParameterValueException("Password has to be 3-32 characters including alphabets, numbers and the set '@#+=.-_'");
         }
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        Account owner = _accountDao.lockRow(vpnOwnerId, true);
-        if (owner == null) {
-            throw new InvalidParameterValueException("Unable to add vpn user: Another operation active");
-        }
-        _accountMgr.checkAccess(caller, null, true, owner);
 
-        //don't allow duplicated user names for the same account
-        VpnUserVO vpnUser = _vpnUsersDao.findByAccountAndUsername(owner.getId(), username);
-        if (vpnUser != null) {
-            throw new InvalidParameterValueException("VPN User with name " + username + " is already added for account " + owner);
-        }
-
-        long userCount = _vpnUsersDao.getVpnUserCount(owner.getId());
-        if (userCount >= _userLimit) {
-            throw new AccountLimitException("Cannot add more than " + _userLimit + " remote access vpn users");
-        }
-
-        VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(),
-                user.getUsername(), user.getClass().getName(), user.getUuid());
-        txn.commit();
-        return user;
+        return Transaction.execute(new TransactionCallback<VpnUser>() {
+            @Override
+            public VpnUser doInTransaction(TransactionStatus status) {
+                Account owner = _accountDao.lockRow(vpnOwnerId, true);
+                if (owner == null) {
+                    throw new InvalidParameterValueException("Unable to add vpn user: Another operation active");
+                }
+                _accountMgr.checkAccess(caller, null, true, owner);
+        
+                //don't allow duplicated user names for the same account
+                VpnUserVO vpnUser = _vpnUsersDao.findByAccountAndUsername(owner.getId(), username);
+                if (vpnUser != null) {
+                    throw new InvalidParameterValueException("VPN User with name " + username + " is already added for account " + owner);
+                }
+        
+                long userCount = _vpnUsersDao.getVpnUserCount(owner.getId());
+                if (userCount >= _userLimit) {
+                    throw new AccountLimitException("Cannot add more than " + _userLimit + " remote access vpn users");
+                }
+        
+                VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(),
+                        user.getUsername(), user.getClass().getName(), user.getUuid());
+                
+                return user;
+            }
+        });
     }
 
     @DB @Override
     public boolean removeVpnUser(long vpnOwnerId, String username, Account caller) {
-        VpnUserVO user = _vpnUsersDao.findByAccountAndUsername(vpnOwnerId, username);
+        final VpnUserVO user = _vpnUsersDao.findByAccountAndUsername(vpnOwnerId, username);
         if (user == null) {
             throw new InvalidParameterValueException("Could not find vpn user " + username);
         }
         _accountMgr.checkAccess(caller, null, true, user);
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        user.setState(State.Revoke);
-        _vpnUsersDao.update(user.getId(), user);
-        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(),
-                user.getUsername(), user.getClass().getName(), user.getUuid());
-        txn.commit();
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                user.setState(State.Revoke);
+                _vpnUsersDao.update(user.getId(), user);
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(),
+                        user.getUsername(), user.getClass().getName(), user.getUuid());
+            }
+        });
+
         return true;
     }
 
@@ -379,7 +391,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
     public RemoteAccessVpnVO startRemoteAccessVpn(long ipAddressId, boolean openFirewall) throws ResourceUnavailableException {
         Account caller = CallContext.current().getCallingAccount();
 
-        RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipAddressId);
+        final RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipAddressId);
         if (vpn == null) {
             throw new InvalidParameterValueException("Unable to find your vpn: " + ipAddressId);
         }
@@ -407,20 +419,22 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
             return vpn;
         } finally {
             if (started) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                vpn.setState(RemoteAccessVpn.State.Running);
-                _remoteAccessVpnDao.update(vpn.getId(), vpn);
-
-                // Start billing of existing VPN users in ADD and Active state
-                List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
-                for(VpnUserVO user : vpnUsers){
-                    if(user.getState() != VpnUser.State.Revoke){
-                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0,
-                                user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        vpn.setState(RemoteAccessVpn.State.Running);
+                        _remoteAccessVpnDao.update(vpn.getId(), vpn);
+        
+                        // Start billing of existing VPN users in ADD and Active state
+                        List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
+                        for(VpnUserVO user : vpnUsers){
+                            if(user.getState() != VpnUser.State.Revoke){
+                                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0,
+                                        user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+                            }
+                        }
                     }
-                }
-                txn.commit();
+                });
             }
         }
     }
@@ -479,7 +493,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
         }
 
         for (int i = 0; i < finals.length; i++) {
-            VpnUserVO user = users.get(i);
+            final VpnUserVO user = users.get(i);
             if (finals[i]) {
                 if (user.getState() == State.Add) {
                     user.setState(State.Active);
@@ -489,12 +503,14 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
                 }
             } else {
                 if (user.getState() == State.Add && (user.getUsername()).equals(userName)) {
-                    Transaction txn = Transaction.currentTxn();
-                    txn.start();
-                    _vpnUsersDao.remove(user.getId());
-                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
-                            0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
-                    txn.commit();
+                    Transaction.execute(new TransactionCallbackNoReturn() {
+                        @Override
+                        public void doInTransactionWithoutResult(TransactionStatus status) {
+                            _vpnUsersDao.remove(user.getId());
+                            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
+                                    0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+                        }
+                    });
                 }
                 s_logger.warn("Failed to apply vpn for user " + user.getUsername() + ", accountId=" + user.getAccountId());
             }


[09/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 61c070a..e0e90d9 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -41,7 +41,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
@@ -159,9 +158,15 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.exception.ExceptionUtil;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicSecondaryIp;
@@ -635,11 +640,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
 
     @Override
-    public NicSecondaryIp allocateSecondaryGuestIP (Account ipOwner, long zoneId, Long nicId, Long networkId, String requestedIp) throws InsufficientAddressCapacityException {
+    public NicSecondaryIp allocateSecondaryGuestIP (Account ipOwner, long zoneId, final Long nicId, final Long networkId, String requestedIp) throws InsufficientAddressCapacityException {
 
-        Long accountId = null;
-        Long domainId = null;
-        Long vmId = null;
         String ipaddr = null;
 
         if (networkId == null) {
@@ -649,7 +651,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         Account caller = CallContext.current().getCallingAccount();
 
         //check whether the nic belongs to user vm.
-        NicVO nicVO = _nicDao.findById(nicId);
+        final NicVO nicVO = _nicDao.findById(nicId);
         if (nicVO == null) {
             throw new InvalidParameterValueException("There is no nic for the " + nicId);
         }
@@ -670,8 +672,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         if (network == null) {
             throw new InvalidParameterValueException("Invalid network id is given");
         }
-        accountId = ipOwner.getAccountId();
-        domainId = ipOwner.getDomainId();
+        final Long accountId = ipOwner.getAccountId();
+        final Long domainId = ipOwner.getDomainId();
 
         // Validate network offering
         NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(network.getNetworkOfferingId());
@@ -716,26 +718,29 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             return null;
         }
 
-        NicSecondaryIpVO secondaryIpVO;
         if (ipaddr != null) {
             // we got the ip addr so up the nics table and secodary ip
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-
-            boolean nicSecondaryIpSet = nicVO.getSecondaryIp();
-            if (!nicSecondaryIpSet) {
-                nicVO.setSecondaryIp(true);
-                // commit when previously set ??
-                s_logger.debug("Setting nics table ...");
-                _nicDao.update(nicId, nicVO);
-            }
-
-            s_logger.debug("Setting nic_secondary_ip table ...");
-            vmId = nicVO.getInstanceId();
-            secondaryIpVO = new NicSecondaryIpVO(nicId, ipaddr, vmId, accountId, domainId, networkId);
-            _nicSecondaryIpDao.persist(secondaryIpVO);
-            txn.commit();
-           return  getNicSecondaryIp(secondaryIpVO.getId());
+            final String addrFinal = ipaddr;
+            long id = Transaction.execute(new TransactionCallback<Long>() {
+                @Override
+                public Long doInTransaction(TransactionStatus status) {
+                    boolean nicSecondaryIpSet = nicVO.getSecondaryIp();
+                    if (!nicSecondaryIpSet) {
+                        nicVO.setSecondaryIp(true);
+                        // commit when previously set ??
+                        s_logger.debug("Setting nics table ...");
+                        _nicDao.update(nicId, nicVO);
+                    }
+        
+                    s_logger.debug("Setting nic_secondary_ip table ...");
+                    Long vmId = nicVO.getInstanceId();
+                    NicSecondaryIpVO secondaryIpVO = new NicSecondaryIpVO(nicId, addrFinal, vmId, accountId, domainId, networkId);
+                    _nicSecondaryIpDao.persist(secondaryIpVO);
+                    return secondaryIpVO.getId();
+                }
+            });
+
+           return getNicSecondaryIp(id);
         } else {
             return null;
         }
@@ -805,13 +810,15 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 throw new InvalidParameterValueException("Can' remove the ip " + secondaryIp + "is associate with static NAT rule public IP address id " + publicIpVO.getId());
             }
         } else if (dc.getNetworkType() == NetworkType.Basic || ntwkOff.getGuestType()  == Network.GuestType.Shared) {
-            IPAddressVO ip = _ipAddressDao.findByIpAndNetworkId(secIpVO.getNetworkId(), secIpVO.getIp4Address());
+            final IPAddressVO ip = _ipAddressDao.findByIpAndNetworkId(secIpVO.getNetworkId(), secIpVO.getIp4Address());
             if (ip != null) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                _ipAddrMgr.markIpAsUnavailable(ip.getId());
-                _ipAddressDao.unassignIpAddress(ip.getId());
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        _ipAddrMgr.markIpAsUnavailable(ip.getId());
+                        _ipAddressDao.unassignIpAddress(ip.getId());
+                    }
+                });
             }
         } else {
             throw new InvalidParameterValueException("Not supported for this network now");
@@ -821,22 +828,24 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         return success;
     }
 
-    boolean removeNicSecondaryIP(NicSecondaryIpVO ipVO, boolean lastIp) {
-        Transaction txn = Transaction.currentTxn();
-        long nicId = ipVO.getNicId();
-        NicVO nic = _nicDao.findById(nicId);
+    boolean removeNicSecondaryIP(final NicSecondaryIpVO ipVO, final boolean lastIp) {
+        final long nicId = ipVO.getNicId();
+        final NicVO nic = _nicDao.findById(nicId);
 
-        txn.start();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                if (lastIp) {
+                    nic.setSecondaryIp(false);
+                    s_logger.debug("Setting nics secondary ip to false ...");
+                    _nicDao.update(nicId, nic);
+                }
 
-        if (lastIp) {
-            nic.setSecondaryIp(false);
-            s_logger.debug("Setting nics secondary ip to false ...");
-            _nicDao.update(nicId, nic);
-        }
+                s_logger.debug("Revoving nic secondary ip entry ...");
+                _nicSecondaryIpDao.remove(ipVO.getId());
+            }
+        });
 
-        s_logger.debug("Revoving nic secondary ip entry ...");
-        _nicSecondaryIpDao.remove(ipVO.getId());
-        txn.commit();
         return true;
     }
 
@@ -1255,67 +1264,10 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             throw ex;
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        Long sharedDomainId = null;
-        if (isDomainSpecific) {
-            if (domainId != null) {
-                sharedDomainId = domainId;
-            } else {
-                sharedDomainId = _domainMgr.getDomain(Domain.ROOT_DOMAIN).getId();
-                subdomainAccess = true;
-            }
-        }
-
-        // default owner to system if network has aclType=Domain
-        if (aclType == ACLType.Domain) {
-            owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
-        }
-
-        //Create guest network
-        Network network = null;
-        if (vpcId != null) {
-            if (!_configMgr.isOfferingForVpc(ntwkOff)){
-                throw new InvalidParameterValueException("Network offering can't be used for VPC networks");
-            }
-
-            if(aclId != null){
-                NetworkACL acl = _networkACLDao.findById(aclId);
-                if(acl == null){
-                    throw new InvalidParameterValueException("Unable to find specified NetworkACL");
-                }
-
-                if(aclId != NetworkACL.DEFAULT_DENY && aclId != NetworkACL.DEFAULT_ALLOW) {
-                    //ACL is not default DENY/ALLOW
-                    // ACL should be associated with a VPC
-                    if(!vpcId.equals(acl.getVpcId())){
-                        throw new InvalidParameterValueException("ACL: "+aclId+" do not belong to the VPC");
-                    }
-                }
-            }
-            network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
-                    networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, aclId, caller, displayNetwork);
-        } else {
-            if (_configMgr.isOfferingForVpc(ntwkOff)){
-                throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
-            }
-            if (ntwkOff.getInternalLb()) {
-                throw new InvalidParameterValueException("Internal Lb can be enabled on vpc networks only");
-            }
-
-            network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
-            		networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId,
-            		ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan);
-        }
-
-        if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan) {
-            // Create vlan ip range
-            _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId,
-                    false, null, startIP, endIP, gateway, netmask, vlanId, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
-        }
-
-        txn.commit();
+        Network network = commitNetwork(networkOfferingId, gateway, startIP, endIP, netmask, networkDomain, vlanId,
+                name, displayText, caller, physicalNetworkId, zoneId, domainId, isDomainSpecific, subdomainAccess,
+                vpcId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, displayNetwork, aclId, isolatedPvlan, ntwkOff, pNtwk,
+                aclType, owner, cidr, createVlan);
 
         // if the network offering has persistent set to true, implement the network
         if ( ntwkOff.getIsPersistent() ) {
@@ -1344,6 +1296,87 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         return network;
     }
 
+    private Network commitNetwork(final Long networkOfferingId, final String gateway, final String startIP, final String endIP, final String netmask,
+            final String networkDomain, final String vlanId, final String name, final String displayText, final Account caller,
+            final Long physicalNetworkId, final Long zoneId, final Long domainId, final boolean isDomainSpecific, final Boolean subdomainAccessFinal,
+            final Long vpcId, final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr, final Boolean displayNetwork,
+            final Long aclId, final String isolatedPvlan, final NetworkOfferingVO ntwkOff, final PhysicalNetwork pNtwk, final ACLType aclType,
+            final Account ownerFinal, final String cidr, final boolean createVlan) throws InsufficientCapacityException,
+            ResourceAllocationException {
+        try {
+            return Transaction.executeWithException(new TransactionCallbackWithException<Network>() {
+                @Override
+                public Network doInTransaction(TransactionStatus status) throws Exception {
+                    Account owner = ownerFinal;
+                    Boolean subdomainAccess = subdomainAccessFinal;
+                    
+                    Long sharedDomainId = null;
+                    if (isDomainSpecific) {
+                        if (domainId != null) {
+                            sharedDomainId = domainId;
+                        } else {
+                            sharedDomainId = _domainMgr.getDomain(Domain.ROOT_DOMAIN).getId();
+                            subdomainAccess = true;
+                        }
+                    }
+            
+                    // default owner to system if network has aclType=Domain
+                    if (aclType == ACLType.Domain) {
+                        owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
+                    }
+            
+                    //Create guest network
+                    Network network = null;
+                    if (vpcId != null) {
+                        if (!_configMgr.isOfferingForVpc(ntwkOff)){
+                            throw new InvalidParameterValueException("Network offering can't be used for VPC networks");
+                        }
+            
+                        if(aclId != null){
+                            NetworkACL acl = _networkACLDao.findById(aclId);
+                            if(acl == null){
+                                throw new InvalidParameterValueException("Unable to find specified NetworkACL");
+                            }
+            
+                            if(aclId != NetworkACL.DEFAULT_DENY && aclId != NetworkACL.DEFAULT_ALLOW) {
+                                //ACL is not default DENY/ALLOW
+                                // ACL should be associated with a VPC
+                                if(!vpcId.equals(acl.getVpcId())){
+                                    throw new InvalidParameterValueException("ACL: "+aclId+" do not belong to the VPC");
+                                }
+                            }
+                        }
+                        network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
+                                networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, aclId, caller, displayNetwork);
+                    } else {
+                        if (_configMgr.isOfferingForVpc(ntwkOff)){
+                            throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
+                        }
+                        if (ntwkOff.getInternalLb()) {
+                            throw new InvalidParameterValueException("Internal Lb can be enabled on vpc networks only");
+                        }
+            
+                        network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
+                        		networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId,
+                        		ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan);
+                    }
+            
+                    if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan) {
+                        // Create vlan ip range
+                        _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId,
+                                false, null, startIP, endIP, gateway, netmask, vlanId, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
+                    }
+                    return network;
+                }
+            }, Exception.class);
+        } catch (Exception e) {
+            ExceptionUtil.rethrowRuntime(e);
+            ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
+            ExceptionUtil.rethrow(e, ResourceAllocationException.class);
+            throw new IllegalStateException(e);
+        }
+    }
+
     @Override
     public List<? extends Network> searchForNetworks(ListNetworksCmd cmd) {
         Long id = cmd.getId();
@@ -1915,13 +1948,13 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_NETWORK_UPDATE, eventDescription = "updating network", async = true)
-    public Network updateGuestNetwork(long networkId, String name, String displayText, Account callerAccount,
-            User callerUser, String domainSuffix, Long networkOfferingId, Boolean changeCidr, String guestVmCidr, Boolean displayNetwork) {
+    public Network updateGuestNetwork(final long networkId, String name, String displayText, Account callerAccount,
+            User callerUser, String domainSuffix, final Long networkOfferingId, Boolean changeCidr, String guestVmCidr, Boolean displayNetwork) {
 
         boolean restartNetwork = false;
 
         // verify input parameters
-        NetworkVO network = _networksDao.findById(networkId);
+        final NetworkVO network = _networksDao.findById(networkId);
         if (network == null) {
             // see NetworkVO.java
             InvalidParameterValueException ex = new InvalidParameterValueException("Specified network id doesn't exist in the system");
@@ -1975,7 +2008,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         boolean networkOfferingChanged = false;
 
-        long oldNetworkOfferingId = network.getNetworkOfferingId();
+        final long oldNetworkOfferingId = network.getNetworkOfferingId();
         NetworkOffering oldNtwkOff = _networkOfferingDao.findByIdIncludingRemoved(oldNetworkOfferingId);
         NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId);
         if (networkOfferingId != null) {
@@ -2024,10 +2057,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             }
         }
 
-        Map<String, String> newSvcProviders = new HashMap<String, String>();
-        if (networkOfferingChanged) {
-            newSvcProviders = _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId());
-        }
+        final Map<String, String> newSvcProviders = networkOfferingChanged ? _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId())
+                : new HashMap<String, String>();
 
         // don't allow to modify network domain if the service is not supported
         if (domainSuffix != null) {
@@ -2201,29 +2232,31 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         if (networkOfferingId != null) {
             if (networkOfferingChanged) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                network.setNetworkOfferingId(networkOfferingId);
-                _networksDao.update(networkId, network, newSvcProviders);
-                // get all nics using this network
-                // log remove usage events for old offering
-                // log assign usage events for new offering
-                List<NicVO> nics = _nicDao.listByNetworkId(networkId);
-                for (NicVO nic : nics) {
-                    long vmId = nic.getInstanceId();
-                    VMInstanceVO vm = _vmDao.findById(vmId);
-                    if (vm == null) {
-                        s_logger.error("Vm for nic " + nic.getId() + " not found with Vm Id:" + vmId);
-                        continue;
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        network.setNetworkOfferingId(networkOfferingId);
+                        _networksDao.update(networkId, network, newSvcProviders);
+                        // get all nics using this network
+                        // log remove usage events for old offering
+                        // log assign usage events for new offering
+                        List<NicVO> nics = _nicDao.listByNetworkId(networkId);
+                        for (NicVO nic : nics) {
+                            long vmId = nic.getInstanceId();
+                            VMInstanceVO vm = _vmDao.findById(vmId);
+                            if (vm == null) {
+                                s_logger.error("Vm for nic " + nic.getId() + " not found with Vm Id:" + vmId);
+                                continue;
+                            }
+                            long isDefault = (nic.isDefaultNic()) ? 1 : 0;
+                            String nicIdString = Long.toString(nic.getId());
+                            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(),
+                                    vm.getId(), nicIdString, oldNetworkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
+                            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vm.getAccountId(), vm.getDataCenterId(),
+                                    vm.getId(), nicIdString, networkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
+                        }
                     }
-                    long isDefault = (nic.isDefaultNic()) ? 1 : 0;
-                    String nicIdString = Long.toString(nic.getId());
-                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(),
-                            vm.getId(), nicIdString, oldNetworkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
-                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vm.getAccountId(), vm.getDataCenterId(),
-                            vm.getId(), nicIdString, networkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
-                }
-                txn.commit();
+                });
             }   else {
                 network.setNetworkOfferingId(networkOfferingId);
                 _networksDao.update(networkId, network, _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId()));
@@ -2379,8 +2412,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_CREATE, eventDescription = "Creating Physical Network", create = true)
-    public PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List<String>
-    isolationMethods, String broadcastDomainRangeStr, Long domainId, List<String> tags, String name) {
+    public PhysicalNetwork createPhysicalNetwork(final Long zoneId, final String vnetRange, final String networkSpeed, final List<String>
+    isolationMethods, String broadcastDomainRangeStr, final Long domainId, final List<String> tags, final String name) {
 
         // Check if zone exists
         if (zoneId == null) {
@@ -2445,39 +2478,42 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
-            // Create the new physical network in the database
-            long id = _physicalNetworkDao.getNextInSequence(Long.class, "id");
-            PhysicalNetworkVO pNetwork = new PhysicalNetworkVO(id, zoneId, vnetRange, networkSpeed, domainId, broadcastDomainRange, name);
-            pNetwork.setTags(tags);
-            pNetwork.setIsolationMethods(isolationMethods);
-
-            pNetwork = _physicalNetworkDao.persist(pNetwork);
-
-            // Add vnet entries for the new zone if zone type is Advanced
-            if (vnetRange != null) {
-                addOrRemoveVnets(vnetRange.split(","), pNetwork);
-            }
-
-            // add VirtualRouter as the default network service provider
-            addDefaultVirtualRouterToPhysicalNetwork(pNetwork.getId());
+            final BroadcastDomainRange broadcastDomainRangeFinal = broadcastDomainRange;
+            return Transaction.execute(new TransactionCallback<PhysicalNetworkVO>() {
+                @Override
+                public PhysicalNetworkVO doInTransaction(TransactionStatus status) {
+                    // Create the new physical network in the database
+                    long id = _physicalNetworkDao.getNextInSequence(Long.class, "id");
+                    PhysicalNetworkVO pNetwork = new PhysicalNetworkVO(id, zoneId, vnetRange, networkSpeed, domainId, broadcastDomainRangeFinal, name);
+                    pNetwork.setTags(tags);
+                    pNetwork.setIsolationMethods(isolationMethods);
+
+                    pNetwork = _physicalNetworkDao.persist(pNetwork);
+
+                    // Add vnet entries for the new zone if zone type is Advanced
+                    if (vnetRange != null) {
+                        addOrRemoveVnets(vnetRange.split(","), pNetwork);
+                    }
 
-            // add security group provider to the physical network
-            addDefaultSecurityGroupProviderToPhysicalNetwork(pNetwork.getId());
+                    // add VirtualRouter as the default network service provider
+                    addDefaultVirtualRouterToPhysicalNetwork(pNetwork.getId());
 
-            // add VPCVirtualRouter as the defualt network service provider
-            addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId());
+                    // add security group provider to the physical network
+                    addDefaultSecurityGroupProviderToPhysicalNetwork(pNetwork.getId());
 
-            // add baremetal as the defualt network service provider
-            addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId());
+                    // add VPCVirtualRouter as the defualt network service provider
+                    addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId());
 
-            //Add Internal Load Balancer element as a default network service provider
-            addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId());
+                    // add baremetal as the defualt network service provider
+                    addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId());
 
-            txn.commit();
-            return pNetwork;
+                    //Add Internal Load Balancer element as a default network service provider
+                    addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId());
+                    
+                    return pNetwork;
+                }
+            });
         } catch (Exception ex) {
             s_logger.warn("Exception: ", ex);
             throw new CloudRuntimeException("Fail to create a physical network");
@@ -2568,7 +2604,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     }
 
     @DB
-    public void addOrRemoveVnets(String [] listOfRanges,  PhysicalNetworkVO network) {
+    public void addOrRemoveVnets(String [] listOfRanges, final PhysicalNetworkVO network) {
         List<String>  addVnets = null;
         List<String>  removeVnets =null;
         HashSet<String> tempVnets = new HashSet<String>();
@@ -2611,22 +2647,27 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             }
             network.setVnet(comaSeperatedStingOfVnetRanges);
 
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            if (addVnets != null) {
-                s_logger.debug("Adding vnet range " + addVnets.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
-                        + " as a part of updatePhysicalNetwork call");
-                //add vnet takes a list of strings to be added. each string is a vnet.
-                _dcDao.addVnet(network.getDataCenterId(), network.getId(), addVnets);
-            }
-            if (removeVnets != null) {
-                s_logger.debug("removing vnet range " + removeVnets.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
-                        + " as a part of updatePhysicalNetwork call");
-                //deleteVnets  takes a list of strings to be removed. each string is a vnet.
-                _datacneter_vnet.deleteVnets(txn, network.getDataCenterId(), network.getId(), removeVnets);
-            }
-            _physicalNetworkDao.update(network.getId(), network);
-            txn.commit();
+            final List<String> addVnetsFinal = addVnets;
+            final List<String> removeVnetsFinal = removeVnets;
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    if (addVnetsFinal != null) {
+                        s_logger.debug("Adding vnet range " + addVnetsFinal.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
+                                + " as a part of updatePhysicalNetwork call");
+                        //add vnet takes a list of strings to be added. each string is a vnet.
+                        _dcDao.addVnet(network.getDataCenterId(), network.getId(), addVnetsFinal);
+                    }
+                    if (removeVnetsFinal != null) {
+                        s_logger.debug("removing vnet range " + removeVnetsFinal.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
+                                + " as a part of updatePhysicalNetwork call");
+                        //deleteVnets  takes a list of strings to be removed. each string is a vnet.
+                        _datacneter_vnet.deleteVnets(TransactionLegacy.currentTxn(), network.getDataCenterId(), network.getId(), removeVnetsFinal);
+                    }
+                    _physicalNetworkDao.update(network.getId(), network);
+                }
+            });
+
             _physicalNetworkDao.releaseFromLockTable(network.getId());
         }
     }
@@ -2771,7 +2812,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_DELETE, eventDescription = "deleting physical network", async = true)
     @DB
-    public boolean deletePhysicalNetwork(Long physicalNetworkId) {
+    public boolean deletePhysicalNetwork(final Long physicalNetworkId) {
 
         // verify input parameters
         PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId);
@@ -2783,48 +2824,47 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         checkIfPhysicalNetworkIsDeletable(physicalNetworkId);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        // delete vlans for this zone
-        List<VlanVO> vlans = _vlanDao.listVlansByPhysicalNetworkId(physicalNetworkId);
-        for (VlanVO vlan : vlans) {
-            _vlanDao.remove(vlan.getId());
-        }
-
-        // Delete networks
-        List<NetworkVO> networks = _networksDao.listByPhysicalNetwork(physicalNetworkId);
-        if (networks != null && !networks.isEmpty()) {
-            for (NetworkVO network : networks) {
-                _networksDao.remove(network.getId());
-            }
-        }
-
-        // delete vnets
-        _dcDao.deleteVnet(physicalNetworkId);
-
-        // delete service providers
-        List<PhysicalNetworkServiceProviderVO> providers = _pNSPDao.listBy(physicalNetworkId);
-
-        for(PhysicalNetworkServiceProviderVO provider : providers){
-            try {
-                deleteNetworkServiceProvider(provider.getId());
-            }catch (ResourceUnavailableException e) {
-                s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
-                return false;
-            } catch (ConcurrentOperationException e) {
-                s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
-                return false;
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                // delete vlans for this zone
+                List<VlanVO> vlans = _vlanDao.listVlansByPhysicalNetworkId(physicalNetworkId);
+                for (VlanVO vlan : vlans) {
+                    _vlanDao.remove(vlan.getId());
+                }
+        
+                // Delete networks
+                List<NetworkVO> networks = _networksDao.listByPhysicalNetwork(physicalNetworkId);
+                if (networks != null && !networks.isEmpty()) {
+                    for (NetworkVO network : networks) {
+                        _networksDao.remove(network.getId());
+                    }
+                }
+        
+                // delete vnets
+                _dcDao.deleteVnet(physicalNetworkId);
+        
+                // delete service providers
+                List<PhysicalNetworkServiceProviderVO> providers = _pNSPDao.listBy(physicalNetworkId);
+        
+                for(PhysicalNetworkServiceProviderVO provider : providers){
+                    try {
+                        deleteNetworkServiceProvider(provider.getId());
+                    }catch (ResourceUnavailableException e) {
+                        s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
+                        return false;
+                    } catch (ConcurrentOperationException e) {
+                        s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
+                        return false;
+                    }
+                }
+        
+                // delete traffic types
+                _pNTrafficTypeDao.deleteTrafficTypes(physicalNetworkId);
+        
+                return _physicalNetworkDao.remove(physicalNetworkId);
             }
-        }
-
-        // delete traffic types
-        _pNTrafficTypeDao.deleteTrafficTypes(physicalNetworkId);
-
-        boolean success = _physicalNetworkDao.remove(physicalNetworkId);
-
-        txn.commit();
-
-        return success;
+        });
     }
 
     @DB
@@ -2882,7 +2922,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 selectSql += " AND taken IS NOT NULL";
             }
 
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             try {
                 PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
                 stmt.setLong(1, physicalNetworkId);
@@ -3045,12 +3085,9 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             accountGuestVlanMapVO.setGuestVlanRange(updatedVlanRange);
             _accountGuestVlanMapDao.update(guestVlanMapId, accountGuestVlanMapVO);
         } else {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
             accountGuestVlanMapVO = new AccountGuestVlanMapVO(vlanOwner.getAccountId(), physicalNetworkId);
             accountGuestVlanMapVO.setGuestVlanRange(startVlan + "-" +  endVlan);
             _accountGuestVlanMapDao.persist(accountGuestVlanMapVO);
-            txn.commit();
         }
         // For every guest vlan set the corresponding account guest vlan map id
         List<Integer> finaVlanTokens = getVlanFromRange(accountGuestVlanMapVO.getGuestVlanRange());
@@ -3276,9 +3313,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             services = new ArrayList<Service>(element.getCapabilities().keySet());
         }
 
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
             // Create the new physical network in the database
             PhysicalNetworkServiceProviderVO nsp = new PhysicalNetworkServiceProviderVO(physicalNetworkId, providerName);
             // set enabled services
@@ -3289,7 +3324,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             }
             nsp = _pNSPDao.persist(nsp);
 
-            txn.commit();
             return nsp;
         } catch (Exception ex) {
             s_logger.warn("Exception: ", ex);
@@ -3537,9 +3571,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
             // Create the new traffic type in the database
             if (xenLabel == null) {
                 xenLabel = getDefaultXenNetworkLabel(trafficType);
@@ -3547,7 +3579,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             PhysicalNetworkTrafficTypeVO pNetworktrafficType = new PhysicalNetworkTrafficTypeVO(physicalNetworkId, trafficType, xenLabel, kvmLabel, vmwareLabel, simulatorLabel, vlan);
             pNetworktrafficType = _pNTrafficTypeDao.persist(pNetworktrafficType);
 
-            txn.commit();
             return pNetworktrafficType;
         } catch (Exception ex) {
             s_logger.warn("Exception: ", ex);
@@ -3809,11 +3840,11 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
 
     @Override @DB
-    public Network createPrivateNetwork(String networkName, String displayText, long physicalNetworkId,
-            String broadcastUriString, String startIp, String endIp, String gateway, String netmask, long networkOwnerId, Long vpcId, Boolean sourceNat, Long networkOfferingId)
+    public Network createPrivateNetwork(final String networkName, final String displayText, long physicalNetworkId,
+            String broadcastUriString, final String startIp, String endIp, final String gateway, String netmask, final long networkOwnerId, final Long vpcId, final Boolean sourceNat, final Long networkOfferingId)
                     throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
 
-        Account owner = _accountMgr.getAccount(networkOwnerId);
+        final Account owner = _accountMgr.getAccount(networkOwnerId);
 
         // Get system network offering
         NetworkOfferingVO ntwkOff = null;
@@ -3827,7 +3858,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         }
 
         // Validate physical network
-        PhysicalNetwork pNtwk = _physicalNetworkDao.findById(physicalNetworkId);
+        final PhysicalNetwork pNtwk = _physicalNetworkDao.findById(physicalNetworkId);
         if (pNtwk == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find a physical network" +
                     " having the given id");
@@ -3846,7 +3877,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             throw new InvalidParameterValueException("Invalid format for the endIp address parameter");
         }
 
-        String cidr = null;
         if (!NetUtils.isValidIp(gateway)) {
             throw new InvalidParameterValueException("Invalid gateway");
         }
@@ -3854,10 +3884,10 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             throw new InvalidParameterValueException("Invalid netmask");
         }
 
-        cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+        final String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
 
         URI uri = BroadcastDomainType.fromString(broadcastUriString);
-        String uriString = uri.toString();
+        final String uriString = uri.toString();
         BroadcastDomainType tiep = BroadcastDomainType.getSchemeValue(uri);
         // numeric vlan or vlan uri are ok for now
         // TODO make a test for any supported scheme
@@ -3866,49 +3896,58 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             throw new InvalidParameterValueException("unsupported type of broadcastUri specified: " + broadcastUriString);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        //lock datacenter as we need to get mac address seq from there
-        DataCenterVO dc = _dcDao.lockRow(pNtwk.getDataCenterId(), true);
-
-        //check if we need to create guest network
-        Network privateNetwork = _networksDao.getPrivateNetwork(uriString, cidr,
-                networkOwnerId, pNtwk.getDataCenterId(), networkOfferingId);
-        if (privateNetwork == null) {
-            //create Guest network
-            privateNetwork = _networkMgr.createGuestNetwork(ntwkOff.getId(), networkName, displayText, gateway, cidr, uriString,
-                    null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, vpcId, null, null, true, null);
-            s_logger.debug("Created private network " + privateNetwork);
-        } else {
-            s_logger.debug("Private network already exists: " + privateNetwork);
-            //Do not allow multiple private gateways with same Vlan within a VPC
-            if(vpcId.equals(privateNetwork.getVpcId())){
-                throw new InvalidParameterValueException("Private network for the vlan: " + uriString + " and cidr  "+ cidr +"  already exists " +
-                        "for Vpc "+vpcId+" in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
-            }
-        }
-
-        //add entry to private_ip_address table
-        PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkIdAndVpcId(privateNetwork.getId(), startIp, vpcId);
-        if (privateIp != null) {
-            throw new InvalidParameterValueException("Private ip address " + startIp + " already used for private gateway" +
-                    " in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
+        final NetworkOfferingVO ntwkOffFinal = ntwkOff; 
+        try {
+            return Transaction.executeWithException(new TransactionCallbackWithException<Network>() {
+                @Override
+                public Network doInTransaction(TransactionStatus status) throws ResourceAllocationException, InsufficientCapacityException {
+                    //lock datacenter as we need to get mac address seq from there
+                    DataCenterVO dc = _dcDao.lockRow(pNtwk.getDataCenterId(), true);
+            
+                    //check if we need to create guest network
+                    Network privateNetwork = _networksDao.getPrivateNetwork(uriString, cidr,
+                            networkOwnerId, pNtwk.getDataCenterId(), networkOfferingId);
+                    if (privateNetwork == null) {
+                        //create Guest network
+                        privateNetwork = _networkMgr.createGuestNetwork(ntwkOffFinal.getId(), networkName, displayText, gateway, cidr, uriString,
+                                null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, vpcId, null, null, true, null);
+                        s_logger.debug("Created private network " + privateNetwork);
+                    } else {
+                        s_logger.debug("Private network already exists: " + privateNetwork);
+                        //Do not allow multiple private gateways with same Vlan within a VPC
+                        if(vpcId.equals(privateNetwork.getVpcId())){
+                            throw new InvalidParameterValueException("Private network for the vlan: " + uriString + " and cidr  "+ cidr +"  already exists " +
+                                    "for Vpc "+vpcId+" in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
+                        }
+                    }
+            
+                    //add entry to private_ip_address table
+                    PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkIdAndVpcId(privateNetwork.getId(), startIp, vpcId);
+                    if (privateIp != null) {
+                        throw new InvalidParameterValueException("Private ip address " + startIp + " already used for private gateway" +
+                                " in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
+                    }
+            
+                    Long mac = dc.getMacAddress();
+                    Long nextMac = mac + 1;
+                    dc.setMacAddress(nextMac);
+            
+                    privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac, vpcId, sourceNat);
+                    _privateIpDao.persist(privateIp);
+            
+                    _dcDao.update(dc.getId(), dc);
+            
+                    s_logger.debug("Private network " + privateNetwork + " is created");
+            
+                    return privateNetwork;
+                }
+            }, Exception.class);
+        } catch (Exception e) {
+            ExceptionUtil.rethrowRuntime(e);
+            ExceptionUtil.rethrow(e, ResourceAllocationException.class);
+            ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
+            throw new IllegalStateException(e);
         }
-
-        Long mac = dc.getMacAddress();
-        Long nextMac = mac + 1;
-        dc.setMacAddress(nextMac);
-
-        privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac, vpcId, sourceNat);
-        _privateIpDao.persist(privateIp);
-
-        _dcDao.update(dc.getId(), dc);
-
-        txn.commit();
-        s_logger.debug("Private network " + privateNetwork + " is created");
-
-        return privateNetwork;
     }
 
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/NetworkUsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkUsageManagerImpl.java b/server/src/com/cloud/network/NetworkUsageManagerImpl.java
index 41c1bc2..0f2feb0 100755
--- a/server/src/com/cloud/network/NetworkUsageManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkUsageManagerImpl.java
@@ -88,6 +88,8 @@ import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -290,11 +292,11 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
             return false;
         }
 
-        private boolean collectDirectNetworkUsage(HostVO host){
+        private boolean collectDirectNetworkUsage(final HostVO host){
             s_logger.debug("Direct Network Usage stats collector is running...");
 
-            long zoneId = host.getDataCenterId();
-            DetailVO lastCollectDetail = _detailsDao.findDetail(host.getId(),"last_collection");
+            final long zoneId = host.getDataCenterId();
+            final DetailVO lastCollectDetail = _detailsDao.findDetail(host.getId(),"last_collection");
             if(lastCollectDetail == null){
                 s_logger.warn("Last collection time not available. Skipping direct usage collection for Traffic Monitor: "+host.getId());
                 return false;
@@ -309,7 +311,7 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
             // This coule be made configurable
 
             rightNow.add(Calendar.HOUR_OF_DAY, -2);
-            Date now = rightNow.getTime();  
+            final Date now = rightNow.getTime();  
             
             if(lastCollection.after(now)){
                 s_logger.debug("Current time is less than 2 hours after last collection time : " + lastCollection.toString() + ". Skipping direct network usage collection");
@@ -361,7 +363,7 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
 
             }
 
-            List<UserStatisticsVO> collectedStats = new ArrayList<UserStatisticsVO>();
+            final List<UserStatisticsVO> collectedStats = new ArrayList<UserStatisticsVO>();
             
             //Get usage for Ips which were assigned for the entire duration
             if(fullDurationIpUsage.size() > 0){
@@ -431,28 +433,26 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
             	return false;
             }
             //Persist all the stats and last_collection time in a single transaction
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
-            try {
-                txn.start();
-                for(UserStatisticsVO stat : collectedStats){
-                    UserStatisticsVO stats = _statsDao.lock(stat.getAccountId(), stat.getDataCenterId(), 0L, null, host.getId(), "DirectNetwork");
-                    if (stats == null) {
-                        stats = new UserStatisticsVO(stat.getAccountId(), zoneId, null, host.getId(), "DirectNetwork", 0L);
-                        stats.setCurrentBytesSent(stat.getCurrentBytesSent());
-                        stats.setCurrentBytesReceived(stat.getCurrentBytesReceived());
-                        _statsDao.persist(stats);
-                    } else {
-                        stats.setCurrentBytesSent(stats.getCurrentBytesSent() + stat.getCurrentBytesSent());
-                        stats.setCurrentBytesReceived(stats.getCurrentBytesReceived() + stat.getCurrentBytesReceived());
-                        _statsDao.update(stats.getId(), stats);
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    for(UserStatisticsVO stat : collectedStats){
+                        UserStatisticsVO stats = _statsDao.lock(stat.getAccountId(), stat.getDataCenterId(), 0L, null, host.getId(), "DirectNetwork");
+                        if (stats == null) {
+                            stats = new UserStatisticsVO(stat.getAccountId(), zoneId, null, host.getId(), "DirectNetwork", 0L);
+                            stats.setCurrentBytesSent(stat.getCurrentBytesSent());
+                            stats.setCurrentBytesReceived(stat.getCurrentBytesReceived());
+                            _statsDao.persist(stats);
+                        } else {
+                            stats.setCurrentBytesSent(stats.getCurrentBytesSent() + stat.getCurrentBytesSent());
+                            stats.setCurrentBytesReceived(stats.getCurrentBytesReceived() + stat.getCurrentBytesReceived());
+                            _statsDao.update(stats.getId(), stats);
+                        }
                     }
+                    lastCollectDetail.setValue(""+now.getTime());
+                    _detailsDao.update(lastCollectDetail.getId(), lastCollectDetail);
                 }
-                lastCollectDetail.setValue(""+now.getTime());
-                _detailsDao.update(lastCollectDetail.getId(), lastCollectDetail);
-                txn.commit();
-            } finally {
-                txn.close();
-            }
+            });
 
             return true;
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/PortProfileManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/PortProfileManagerImpl.java b/server/src/com/cloud/network/PortProfileManagerImpl.java
index f17ee6f..c7315979 100644
--- a/server/src/com/cloud/network/PortProfileManagerImpl.java
+++ b/server/src/com/cloud/network/PortProfileManagerImpl.java
@@ -55,18 +55,7 @@ public class PortProfileManagerImpl {
     	// Else, go ahead and create the port profile.
     	PortProfileVO portProfileObj = new PortProfileVO(portProfName, vsmId, vlanId, pType, bType);
 
-    	Transaction txn = Transaction.currentTxn();
-    	try {
-    		txn.start();
-    		_portProfileDao.persist(portProfileObj);
-    		txn.commit();
-    	} catch (Exception e) {
-    		txn.rollback();
-    		throw new CloudRuntimeException(e.getMessage());
-    	}
-
-    	// Return the PortProfileVO object created.
-        return portProfileObj;        
+		return _portProfileDao.persist(portProfileObj);
     }
     
     @DB    
@@ -95,18 +84,7 @@ public class PortProfileManagerImpl {
     	// Else, go ahead and create the port profile.
     	portProfileObj = new PortProfileVO(portProfName, vsmId, lowVlanId, highVlanId, pType, bType);
 
-    	Transaction txn = Transaction.currentTxn();
-    	try {
-    		txn.start();
-    		_portProfileDao.persist(portProfileObj);
-    		txn.commit();
-    	} catch (Exception e) {
-    		txn.rollback();
-    		throw new CloudRuntimeException(e.getMessage());
-    	}
-
-    	// Return the PortProfileVO object created.
-        return portProfileObj;        
+		return _portProfileDao.persist(portProfileObj);
     }
     
     @DB
@@ -121,16 +99,7 @@ public class PortProfileManagerImpl {
         // TODO: Should we be putting any checks here before removing
         // the port profile record from the db?
         
-        Transaction txn = Transaction.currentTxn();
-        try {
-            txn.start();
-            // Remove the VSM entry in CiscoNexusVSMDeviceVO's table.            
-            _portProfileDao.remove(portProfileId);            
-            txn.commit();
-        } catch (Exception e) {
-        	s_logger.info("Caught exception when trying to delete Port Profile record.." + e.getMessage());        	
-        	throw new CloudRuntimeException("Failed to delete Port Profile");
-        }        
-        return true;
+        // Remove the VSM entry in CiscoNexusVSMDeviceVO's table.            
+        return _portProfileDao.remove(portProfileId);            
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/StorageNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/StorageNetworkManagerImpl.java b/server/src/com/cloud/network/StorageNetworkManagerImpl.java
index c0cb289..73b45ab 100755
--- a/server/src/com/cloud/network/StorageNetworkManagerImpl.java
+++ b/server/src/com/cloud/network/StorageNetworkManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.api.command.admin.network.CreateStorageNetworkIpRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.DeleteStorageNetworkIpRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.ListStorageNetworkIpRangeCmd;
@@ -46,8 +45,12 @@ import com.cloud.network.dao.NetworkVO;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.SecondaryStorageVmVO;
@@ -93,7 +96,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
         }
     }
 
-    private void createStorageIpEntires(Transaction txn, long rangeId, String startIp, String endIp, long zoneId) throws SQLException {
+    private void createStorageIpEntires(TransactionLegacy txn, long rangeId, String startIp, String endIp, long zoneId) throws SQLException {
         long startIPLong = NetUtils.ip2Long(startIp);
         long endIPLong = NetUtils.ip2Long(endIp);
         String insertSql = "INSERT INTO `cloud`.`op_dc_storage_network_ip_address` (range_id, ip_address, mac_address, taken) VALUES (?, ?, (select mac_address from `cloud`.`data_center` where id=?), ?)";
@@ -120,11 +123,11 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
     @Override
     @DB
     public StorageNetworkIpRange updateIpRange(UpdateStorageNetworkIpRangeCmd cmd) {
-        Integer vlan = cmd.getVlan();
-        Long rangeId = cmd.getId();
+        final Integer vlan = cmd.getVlan();
+        final Long rangeId = cmd.getId();
         String startIp = cmd.getStartIp();
         String endIp = cmd.getEndIp();
-        String netmask = cmd.getNetmask();
+        final String netmask = cmd.getNetmask();
 
         if (netmask != null && !NetUtils.isValidNetmask(netmask)) {
             throw new CloudRuntimeException("Invalid netmask:" + netmask);
@@ -147,45 +150,50 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
             checkOverlapStorageIpRange(podId, startIp, endIp);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        try {
-            range = _sNwIpRangeDao.acquireInLockTable(range.getId());
-            if (range == null) {
-                throw new CloudRuntimeException("Cannot acquire lock on storage ip range " + rangeId);
-            }
-            StorageNetworkIpRangeVO vo = _sNwIpRangeDao.createForUpdate();
-            if (vlan != null) {
-                vo.setVlan(vlan);
-            }
-            if (startIp != null) {
-                vo.setStartIp(startIp);
-            }
-            if (endIp != null) {
-                vo.setEndIp(endIp);
-            }
-            if (netmask != null) {
-                vo.setNetmask(netmask);
-            }
-            _sNwIpRangeDao.update(rangeId, vo);
-        } finally {
-            if (range != null) {
-                _sNwIpRangeDao.releaseFromLockTable(range.getId());
+        final String startIpFinal = startIp;
+        final String endIpFinal = endIp;
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                StorageNetworkIpRangeVO range = null;
+                try {
+                    range = _sNwIpRangeDao.acquireInLockTable(rangeId);
+                    if (range == null) {
+                        throw new CloudRuntimeException("Cannot acquire lock on storage ip range " + rangeId);
+                    }
+                    StorageNetworkIpRangeVO vo = _sNwIpRangeDao.createForUpdate();
+                    if (vlan != null) {
+                        vo.setVlan(vlan);
+                    }
+                    if (startIpFinal != null) {
+                        vo.setStartIp(startIpFinal);
+                    }
+                    if (endIpFinal != null) {
+                        vo.setEndIp(endIpFinal);
+                    }
+                    if (netmask != null) {
+                        vo.setNetmask(netmask);
+                    }
+                    _sNwIpRangeDao.update(rangeId, vo);
+                } finally {
+                    if (range != null) {
+                        _sNwIpRangeDao.releaseFromLockTable(range.getId());
+                    }
+                }
             }
-        }
-        txn.commit();
+        });
 
         return _sNwIpRangeDao.findById(rangeId);
     }
 
     @Override
     @DB
-    public StorageNetworkIpRange createIpRange(CreateStorageNetworkIpRangeCmd cmd) throws SQLException {
-        Long podId = cmd.getPodId();
-        String startIp = cmd.getStartIp();
+    public StorageNetworkIpRange createIpRange(final CreateStorageNetworkIpRangeCmd cmd) throws SQLException {
+        final Long podId = cmd.getPodId();
+        final String startIp = cmd.getStartIp();
         String endIp = cmd.getEndIp();
-        Integer vlan = cmd.getVlan();
-        String netmask = cmd.getNetmask();
+        final Integer vlan = cmd.getVlan();
+        final String netmask = cmd.getNetmask();
 
         if (endIp == null) {
             endIp = startIp;
@@ -199,7 +207,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
         if (pod == null) {
             throw new CloudRuntimeException("Cannot find pod " + podId);
         }
-        Long zoneId = pod.getDataCenterId();
+        final Long zoneId = pod.getDataCenterId();
 
         List<NetworkVO> nws = _networkDao.listByZoneAndTrafficType(zoneId, TrafficType.Storage);
         if (nws.size() == 0) {
@@ -208,34 +216,35 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
         if (nws.size() > 1) {
             throw new CloudRuntimeException("Find more than one storage network in zone " + zoneId + "," + nws.size() + " found");
         }
-        NetworkVO nw = nws.get(0);
+        final NetworkVO nw = nws.get(0);
 
         checkOverlapPrivateIpRange(podId, startIp, endIp);
         checkOverlapStorageIpRange(podId, startIp, endIp);
 
-        Transaction txn = Transaction.currentTxn();
         StorageNetworkIpRangeVO range = null;
 
-        txn.start();
-        range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIp, vlan, netmask, cmd.getGateWay());
-        _sNwIpRangeDao.persist(range);
-        try {
-            createStorageIpEntires(txn, range.getId(), startIp, endIp, zoneId);
-        } catch (SQLException e) {
-            txn.rollback();
-            StringBuilder err = new StringBuilder();
-            err.append("Create storage network range failed.");
-            err.append("startIp=" + startIp);
-            err.append("endIp=" + endIp);
-            err.append("netmask=" + netmask);
-            err.append("zoneId=" + zoneId);
-            s_logger.debug(err.toString(), e);
-            throw e;
-        }
-
-        txn.commit();
+        final String endIpFinal = endIp;
+        return Transaction.executeWithException(new TransactionCallbackWithException<StorageNetworkIpRangeVO>() {
+            @Override
+            public StorageNetworkIpRangeVO doInTransaction(TransactionStatus status) throws SQLException {
+                StorageNetworkIpRangeVO range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIpFinal, vlan, netmask, cmd.getGateWay());
+                _sNwIpRangeDao.persist(range);
+                try {
+                    createStorageIpEntires(TransactionLegacy.currentTxn(), range.getId(), startIp, endIpFinal, zoneId);
+                } catch (SQLException e) {
+                    StringBuilder err = new StringBuilder();
+                    err.append("Create storage network range failed.");
+                    err.append("startIp=" + startIp);
+                    err.append("endIp=" + endIpFinal);
+                    err.append("netmask=" + netmask);
+                    err.append("zoneId=" + zoneId);
+                    s_logger.debug(err.toString(), e);
+                    throw e;
+                }
 
-        return range;
+                return range;
+            }
+        }, SQLException.class);
     }
 
     private String getInUseIpAddress(long rangeId) {
@@ -251,7 +260,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
     @Override
     @DB
     public void deleteIpRange(DeleteStorageNetworkIpRangeCmd cmd) {
-        long rangeId = cmd.getId();
+        final long rangeId = cmd.getId();
         StorageNetworkIpRangeVO range = _sNwIpRangeDao.findById(rangeId);
         if (range == null) {
             throw new CloudRuntimeException("Can not find storage network ip range " + rangeId);
@@ -261,26 +270,30 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
             throw new CloudRuntimeException(getInUseIpAddress(rangeId));
         }
 
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-        try {
-            range = _sNwIpRangeDao.acquireInLockTable(rangeId);
-            if (range == null) {
-                String msg = "Unable to acquire lock on storage network ip range id=" + rangeId + ", delete failed";
-                s_logger.warn(msg);
-                throw new CloudRuntimeException(msg);
-            }
-            /*
-             * entries in op_dc_storage_network_ip_address will be deleted automatically due to
-             * fk_storage_ip_address__range_id constraint key
-             */
-            _sNwIpRangeDao.remove(rangeId);
-        } finally {
-            if (range != null) {
-                _sNwIpRangeDao.releaseFromLockTable(rangeId);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                StorageNetworkIpRangeVO range = null;
+                try {
+                    range = _sNwIpRangeDao.acquireInLockTable(rangeId);
+                    if (range == null) {
+                        String msg = "Unable to acquire lock on storage network ip range id=" + rangeId + ", delete failed";
+                        s_logger.warn(msg);
+                        throw new CloudRuntimeException(msg);
+                    }
+                    /*
+                     * entries in op_dc_storage_network_ip_address will be deleted automatically due to
+                     * fk_storage_ip_address__range_id constraint key
+                     */
+                    _sNwIpRangeDao.remove(rangeId);
+                } finally {
+                    if (range != null) {
+                        _sNwIpRangeDao.releaseFromLockTable(rangeId);
+                    }
+                }
             }
-        }
-        txn.commit();
+        });
+
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
index 859211b..58a90bb 100644
--- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
@@ -95,8 +95,10 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.net.NetUtils;
 
 @Local(value = { AutoScaleService.class, AutoScaleManager.class })
@@ -428,9 +430,9 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
     }
 
     @DB
-    protected AutoScalePolicyVO checkValidityAndPersist(AutoScalePolicyVO autoScalePolicyVO, List<Long> conditionIds) {
-        int duration = autoScalePolicyVO.getDuration();
-        int quietTime = autoScalePolicyVO.getQuietTime();
+    protected AutoScalePolicyVO checkValidityAndPersist(final AutoScalePolicyVO autoScalePolicyVOFinal, final List<Long> conditionIds) {
+        final int duration = autoScalePolicyVOFinal.getDuration();
+        final int quietTime = autoScalePolicyVOFinal.getQuietTime();
 
         if (duration < 0) {
             throw new InvalidParameterValueException("duration is an invalid value: " + duration);
@@ -440,48 +442,49 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
             throw new InvalidParameterValueException("quiettime is an invalid value: " + quietTime);
         }
 
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        autoScalePolicyVO = _autoScalePolicyDao.persist(autoScalePolicyVO);
-
-        if (conditionIds != null) {
-            SearchBuilder<ConditionVO> conditionsSearch = _conditionDao.createSearchBuilder();
-            conditionsSearch.and("ids", conditionsSearch.entity().getId(), Op.IN);
-            conditionsSearch.done();
-            SearchCriteria<ConditionVO> sc = conditionsSearch.create();
-
-            sc.setParameters("ids", conditionIds.toArray(new Object[0]));
-            List<ConditionVO> conditions = _conditionDao.search(sc, null);
-
-            ControlledEntity[] sameOwnerEntities = conditions.toArray(new ControlledEntity[conditions.size() + 1]);
-            sameOwnerEntities[sameOwnerEntities.length - 1] = autoScalePolicyVO;
-            _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, sameOwnerEntities);
-
-            if (conditionIds.size() != conditions.size()) {
-                // TODO report the condition id which could not be found
-                throw new InvalidParameterValueException("Unable to find the condition specified");
-            }
-
-            ArrayList<Long> counterIds = new ArrayList<Long>();
-            for (ConditionVO condition : conditions) {
-                if (counterIds.contains(condition.getCounterid())) {
-                    throw new InvalidParameterValueException("atleast two conditions in the conditionids have the same counter. It is not right to apply two different conditions for the same counter");
+        return Transaction.execute(new TransactionCallback<AutoScalePolicyVO>() {
+            @Override
+            public AutoScalePolicyVO doInTransaction(TransactionStatus status) {
+                AutoScalePolicyVO autoScalePolicyVO = _autoScalePolicyDao.persist(autoScalePolicyVOFinal);
+        
+                if (conditionIds != null) {
+                    SearchBuilder<ConditionVO> conditionsSearch = _conditionDao.createSearchBuilder();
+                    conditionsSearch.and("ids", conditionsSearch.entity().getId(), Op.IN);
+                    conditionsSearch.done();
+                    SearchCriteria<ConditionVO> sc = conditionsSearch.create();
+        
+                    sc.setParameters("ids", conditionIds.toArray(new Object[0]));
+                    List<ConditionVO> conditions = _conditionDao.search(sc, null);
+        
+                    ControlledEntity[] sameOwnerEntities = conditions.toArray(new ControlledEntity[conditions.size() + 1]);
+                    sameOwnerEntities[sameOwnerEntities.length - 1] = autoScalePolicyVO;
+                    _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, sameOwnerEntities);
+        
+                    if (conditionIds.size() != conditions.size()) {
+                        // TODO report the condition id which could not be found
+                        throw new InvalidParameterValueException("Unable to find the condition specified");
+                    }
+        
+                    ArrayList<Long> counterIds = new ArrayList<Long>();
+                    for (ConditionVO condition : conditions) {
+                        if (counterIds.contains(condition.getCounterid())) {
+                            throw new InvalidParameterValueException("atleast two conditions in the conditionids have the same counter. It is not right to apply two different conditions for the same counter");
+                        }
+                        counterIds.add(condition.getCounterid());
+                    }
+        
+                    /* For update case remove the existing mappings and create fresh ones */
+                    _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(autoScalePolicyVO.getId());
+        
+                    for (Long conditionId : conditionIds) {
+                        AutoScalePolicyConditionMapVO policyConditionMapVO = new AutoScalePolicyConditionMapVO(autoScalePolicyVO.getId(), conditionId);
+                        _autoScalePolicyConditionMapDao.persist(policyConditionMapVO);
+                    }
                 }
-                counterIds.add(condition.getCounterid());
-            }
 
-            /* For update case remove the existing mappings and create fresh ones */
-            _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(autoScalePolicyVO.getId());
-
-            for (Long conditionId : conditionIds) {
-                AutoScalePolicyConditionMapVO policyConditionMapVO = new AutoScalePolicyConditionMapVO(autoScalePolicyVO.getId(), conditionId);
-                _autoScalePolicyConditionMapDao.persist(policyConditionMapVO);
+                return autoScalePolicyVO;
             }
-        }
-
-        txn.commit();
-        return autoScalePolicyVO;
+        });
     }
 
     @Override
@@ -511,7 +514,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEPOLICY_DELETE, eventDescription = "deleting autoscale policy")
-    public boolean deleteAutoScalePolicy(long id) {
+    public boolean deleteAutoScalePolicy(final long id) {
         /* Check if entity is in database */
         getEntityInDatabase(CallContext.current().getCallingAccount(), "AutoScale Policy", id, _autoScalePolicyDao);
 
@@ -519,23 +522,25 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
             throw new InvalidParameterValueException("Cannot delete AutoScale Policy when it is in use by one or more AutoScale Vm Groups");
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                boolean success = true;
+                success = _autoScalePolicyDao.remove(id);
+                if (!success) {
+                    s_logger.warn("Failed to remove AutoScale Policy db object");
+                    return false;
+                }
+                success = _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(id);
+                if (!success) {
+                    s_logger.warn("Failed to remove AutoScale Policy Condition mappings");
+                    return false;
+                }
+                s_logger.info("Successfully deleted autoscale policy id : " + id);
 
-        boolean success = true;
-        success = _autoScalePolicyDao.remove(id);
-        if (!success) {
-            s_logger.warn("Failed to remove AutoScale Policy db object");
-            return false;
-        }
-        success = _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(id);
-        if (!success) {
-            s_logger.warn("Failed to remove AutoScale Policy Condition mappings");
-            return false;
-        }
-        txn.commit();
-        s_logger.info("Successfully deleted autoscale policy id : " + id);
-        return true; // successful
+                return success;
+            }
+        });
     }
 
     public void checkCallerAccess(String accountName, Long domainId)
@@ -745,7 +750,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMGROUP_DELETE, eventDescription = "deleting autoscale vm group")
-    public boolean deleteAutoScaleVmGroup(long id) {
+    public boolean deleteAutoScaleVmGroup(final long id) {
         AutoScaleVmGroupVO autoScaleVmGroupVO = getEntityInDatabase(CallContext.current().getCallingAccount(), "AutoScale Vm Group", id, _autoScaleVmGroupDao);
 
         if (autoScaleVmGroupVO.getState().equals(AutoScaleVmGroup.State_New)) {
@@ -769,24 +774,27 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        success = _autoScaleVmGroupDao.remove(id);
-
-        if (!success) {
-            s_logger.warn("Failed to remove AutoScale Group db object");
-            return false;
-        }
-
-        success = _autoScaleVmGroupPolicyMapDao.removeByGroupId(id);
-        if (!success) {
-            s_logger.warn("Failed to remove AutoScale Group Policy mappings");
-            return false;
-        }
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                boolean success = _autoScaleVmGroupDao.remove(id);
+        
+                if (!success) {
+                    s_logger.warn("Failed to remove AutoScale Group db object");
+                    return false;
+                }
+        
+                success = _autoScaleVmGroupPolicyMapDao.removeByGroupId(id);
+                if (!success) {
+                    s_logger.warn("Failed to remove AutoScale Group Policy mappings");
+                    return false;
+                }
+        
+                s_logger.info("Successfully deleted autoscale vm group id : " + id);
+                return success; // Successfull
+            }
+        });
 
-        txn.commit();
-        s_logger.info("Successfully deleted autoscale vm group id : " + id);
-        return success; // Successfull
     }
 
     @Override
@@ -831,13 +839,13 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
     }
 
     @DB
-    protected AutoScaleVmGroupVO checkValidityAndPersist(AutoScaleVmGroupVO vmGroup, List<Long> passedScaleUpPolicyIds, List<Long> passedScaleDownPolicyIds) {
+    protected AutoScaleVmGroupVO checkValidityAndPersist(final AutoScaleVmGroupVO vmGroup, final List<Long> passedScaleUpPolicyIds, final List<Long> passedScaleDownPolicyIds) {
         int minMembers = vmGroup.getMinMembers();
         int maxMembers = vmGroup.getMaxMembers();
         int interval = vmGroup.getInterval();
         List<Counter> counters = new ArrayList<Counter>();
         List<AutoScalePolicyVO> policies = new ArrayList<AutoScalePolicyVO>();
-        List<Long> policyIds = new ArrayList<Long>();
+        final List<Long> policyIds = new ArrayList<Long>();
         List<Long> currentScaleUpPolicyIds = new ArrayList<Long>();
         List<Long> currentScaleDownPolicyIds = new ArrayList<Long>();
         if (vmGroup.getCreated() != null) {
@@ -887,20 +895,23 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
         sameOwnerEntities[sameOwnerEntities.length - 1] = profileVO;
         _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, sameOwnerEntities);
 
-        final Transaction txn = Transaction.currentTxn();
-        txn.start();
-        vmGroup = _autoScaleVmGroupDao.persist(vmGroup);
-
-        if (passedScaleUpPolicyIds != null || passedScaleDownPolicyIds != null) {
-            _autoScaleVmGroupPolicyMapDao.removeByGroupId(vmGroup.getId());
+        return Transaction.execute(new TransactionCallback<AutoScaleVmGroupVO>() {
+            @Override
+            public AutoScaleVmGroupVO doInTransaction(TransactionStatus status) {
+                AutoScaleVmGroupVO vmGroupNew = _autoScaleVmGroupDao.persist(vmGroup);
+        
+                if (passedScaleUpPolicyIds != null || passedScaleDownPolicyIds != null) {
+                    _autoScaleVmGroupPolicyMapDao.removeByGroupId(vmGroupNew.getId());
+        
+                    for (Long policyId : policyIds) {
+                        _autoScaleVmGroupPolicyMapDao.persist(new AutoScaleVmGroupPolicyMapVO(vmGroupNew.getId(), policyId));
+                    }
+                }
 
-            for (Long policyId : policyIds) {
-                _autoScaleVmGroupPolicyMapDao.persist(new AutoScaleVmGroupPolicyMapVO(vmGroup.getId(), policyId));
+                return vmGroupNew;
             }
-        }
-        txn.commit();
+        });
 
-        return vmGroup;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index c86476e..e0d23ad 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -29,7 +29,6 @@ import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
 import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
 import org.apache.cloudstack.context.CallContext;
@@ -89,6 +88,9 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -181,9 +183,9 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
     }
 
     @DB
-    protected FirewallRule createFirewallRule(Long ipAddrId, Account caller, String xId, Integer portStart,
-            Integer portEnd, String protocol, List<String> sourceCidrList, Integer icmpCode, Integer icmpType,
-            Long relatedRuleId, FirewallRule.FirewallRuleType type, Long networkId, FirewallRule.TrafficType trafficType) throws NetworkRuleConflictException {
+    protected FirewallRule createFirewallRule(final Long ipAddrId, Account caller, final String xId, final Integer portStart,
+            final Integer portEnd, final String protocol, final List<String> sourceCidrList, final Integer icmpCode, final Integer icmpType,
+            final Long relatedRuleId, final FirewallRule.FirewallRuleType type, final Long networkId, final FirewallRule.TrafficType trafficType) throws NetworkRuleConflictException {
 
         IPAddressVO ipAddress = null;
         if (ipAddrId != null){
@@ -222,25 +224,27 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
                 domainId = network.getDomainId();
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId,
-                accountId, domainId, Purpose.Firewall, sourceCidrList, icmpCode, icmpType, relatedRuleId, trafficType);
-        newRule.setType(type);
-        newRule = _firewallDao.persist(newRule);
-
-        if (type == FirewallRuleType.User)
-            detectRulesConflict(newRule);
-
-        if (!_firewallDao.setStateToAdd(newRule)) {
-            throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
-        }
-        CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
-
-        txn.commit();
-
-        return newRule;
+        final Long accountIdFinal = accountId;
+        final Long domainIdFinal = domainId;
+        return Transaction.executeWithException(new TransactionCallbackWithException<FirewallRuleVO>() {
+            @Override
+            public FirewallRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId,
+                        accountIdFinal, domainIdFinal, Purpose.Firewall, sourceCidrList, icmpCode, icmpType, relatedRuleId, trafficType);
+                newRule.setType(type);
+                newRule = _firewallDao.persist(newRule);
+        
+                if (type == FirewallRuleType.User)
+                    detectRulesConflict(newRule);
+        
+                if (!_firewallDao.setStateToAdd(newRule)) {
+                    throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+                }
+                CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
+                
+                return newRule;
+            }
+        }, NetworkRuleConflictException.class);
     }
 
     @Override
@@ -724,33 +728,34 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
 
     @Override
     @DB
-    public void revokeRule(FirewallRuleVO rule, Account caller, long userId, boolean needUsageEvent) {
+    public void revokeRule(final FirewallRuleVO rule, Account caller, long userId, final boolean needUsageEvent) {
         if (caller != null) {
             _accountMgr.checkAccess(caller, null, true, rule);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        boolean generateUsageEvent = false;
-
-        txn.start();
-        if (rule.getState() == State.Staged) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Found a rule that is still in stage state so just removing it: " + rule);
-            }
-            removeRule(rule);
-            generateUsageEvent = true;
-        } else if (rule.getState() == State.Add || rule.getState() == State.Active) {
-            rule.setState(State.Revoke);
-            _firewallDao.update(rule.getId(), rule);
-            generateUsageEvent = true;
-        }
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                boolean generateUsageEvent = false;
 
-        if (generateUsageEvent && needUsageEvent) {
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_DELETE, rule.getAccountId(), 0, rule.getId(),
-                    null, rule.getClass().getName(), rule.getUuid());
-        }
+                if (rule.getState() == State.Staged) {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Found a rule that is still in stage state so just removing it: " + rule);
+                    }
+                    removeRule(rule);
+                    generateUsageEvent = true;
+                } else if (rule.getState() == State.Add || rule.getState() == State.Active) {
+                    rule.setState(State.Revoke);
+                    _firewallDao.update(rule.getId(), rule);
+                    generateUsageEvent = true;
+                }
 
-        txn.commit();
+                if (generateUsageEvent && needUsageEvent) {
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_DELETE, rule.getAccountId(), 0, rule.getId(),
+                            null, rule.getClass().getName(), rule.getUuid());
+                }
+            }
+        });
     }
 
     @Override


[10/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java
index 74f316b..dd30aa1 100644
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -29,7 +29,6 @@ import java.util.UUID;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.context.CallContext;
@@ -133,16 +132,21 @@ import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.utils.Journal;
 import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
@@ -609,28 +613,30 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @DB
     @Override
-    public boolean releasePortableIpAddress(long addrId) {
-        Transaction txn = Transaction.currentTxn();
-        GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
+    public boolean releasePortableIpAddress(final long addrId) {
+        final GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
 
-        txn.start();
         try {
-            portableIpLock.lock(5);
-            IPAddressVO ip = _ipAddressDao.findById(addrId);
+            return Transaction.execute(new TransactionCallback<Boolean>() {
+                @Override
+                public Boolean doInTransaction(TransactionStatus status) {
+                    portableIpLock.lock(5);
+                    IPAddressVO ip = _ipAddressDao.findById(addrId);
 
-            // unassign portable IP
-            PortableIpVO portableIp = _portableIpDao.findByIpAddress(ip.getAddress().addr());
-            _portableIpDao.unassignIpAddress(portableIp.getId());
+                    // unassign portable IP
+                    PortableIpVO portableIp = _portableIpDao.findByIpAddress(ip.getAddress().addr());
+                    _portableIpDao.unassignIpAddress(portableIp.getId());
 
-            // removed the provisioned vlan
-            VlanVO vlan = _vlanDao.findById(ip.getVlanId());
-            _vlanDao.remove(vlan.getId());
+                    // removed the provisioned vlan
+                    VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+                    _vlanDao.remove(vlan.getId());
 
-            // remove the provisioned public ip address
-            _ipAddressDao.remove(ip.getId());
+                    // remove the provisioned public ip address
+                    _ipAddressDao.remove(ip.getId());
 
-            txn.commit();
-            return true;
+                    return true;
+                }
+            });
         } finally {
             portableIpLock.releaseRef();
         }
@@ -649,135 +655,138 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
     }
 
     @DB
-    public PublicIp fetchNewPublicIp(long dcId, Long podId, List<Long> vlanDbIds, Account owner, VlanType vlanUse, Long guestNetworkId, boolean sourceNat, boolean assign,
-        String requestedIp, boolean isSystem, Long vpcId) throws InsufficientAddressCapacityException {
-        StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
-        boolean fetchFromDedicatedRange = false;
-        List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
-        List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        SearchCriteria<IPAddressVO> sc = null;
-        if (podId != null) {
-            sc = AssignIpAddressFromPodVlanSearch.create();
-            sc.setJoinParameters("podVlanMapSB", "podId", podId);
-            errorMessage.append(" pod id=" + podId);
-        } else {
-            sc = AssignIpAddressSearch.create();
-            errorMessage.append(" zone id=" + dcId);
-        }
-
-        // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
-        // Otherwise fetch IP from the system pool
-        List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
-        for (AccountVlanMapVO map : maps) {
-            if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
-                dedicatedVlanDbIds.add(map.getVlanDbId());
-        }
-        List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
-        for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
-            if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
-                nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
-        }
-        if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
-            fetchFromDedicatedRange = true;
-            sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
-            errorMessage.append(", vlanId id=" + dedicatedVlanDbIds.toArray());
-        } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
-            sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
-            errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
-        } else {
-            if (podId != null) {
-                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
-                ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
-                throw ex;
-            }
-            s_logger.warn(errorMessage.toString());
-            InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
-            ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
-            throw ex;
-        }
+    public PublicIp fetchNewPublicIp(final long dcId, final Long podId, final List<Long> vlanDbIds, final Account owner, final VlanType vlanUse, final Long guestNetworkId, final boolean sourceNat, final boolean assign,
+            final String requestedIp, final boolean isSystem, final Long vpcId) throws InsufficientAddressCapacityException {
+        IPAddressVO addr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() {
+            @Override
+            public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+                StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
+                boolean fetchFromDedicatedRange = false;
+                List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
+                List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
+
+                SearchCriteria<IPAddressVO> sc = null;
+                if (podId != null) {
+                    sc = AssignIpAddressFromPodVlanSearch.create();
+                    sc.setJoinParameters("podVlanMapSB", "podId", podId);
+                    errorMessage.append(" pod id=" + podId);
+                } else {
+                    sc = AssignIpAddressSearch.create();
+                    errorMessage.append(" zone id=" + dcId);
+                }
 
-        sc.setParameters("dc", dcId);
+                // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
+                // Otherwise fetch IP from the system pool
+                List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
+                for (AccountVlanMapVO map : maps) {
+                    if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
+                        dedicatedVlanDbIds.add(map.getVlanDbId());
+                }
+                List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
+                for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
+                    if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
+                        nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
+                }
+                if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
+                    fetchFromDedicatedRange = true;
+                    sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
+                    errorMessage.append(", vlanId id=" + dedicatedVlanDbIds.toArray());
+                } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
+                    sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
+                    errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
+                } else {
+                    if (podId != null) {
+                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
+                        ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
+                        throw ex;
+                    }
+                    s_logger.warn(errorMessage.toString());
+                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
+                    ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
+                    throw ex;
+                }
 
-        DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
+                sc.setParameters("dc", dcId);
 
-        // for direct network take ip addresses only from the vlans belonging to the network
-        if (vlanUse == VlanType.DirectAttached) {
-            sc.setJoinParameters("vlan", "networkId", guestNetworkId);
-            errorMessage.append(", network id=" + guestNetworkId);
-        }
-        sc.setJoinParameters("vlan", "type", vlanUse);
+                DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
 
-        if (requestedIp != null) {
-            sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
-            errorMessage.append(": requested ip " + requestedIp + " is not available");
-        }
+                // for direct network take ip addresses only from the vlans belonging to the network
+                if (vlanUse == VlanType.DirectAttached) {
+                    sc.setJoinParameters("vlan", "networkId", guestNetworkId);
+                    errorMessage.append(", network id=" + guestNetworkId);
+                }
+                sc.setJoinParameters("vlan", "type", vlanUse);
 
-        Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
+                if (requestedIp != null) {
+                    sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
+                    errorMessage.append(": requested ip " + requestedIp + " is not available");
+                }
 
-        List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
+                Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
 
-        // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
-        if (addrs.size() == 0 && fetchFromDedicatedRange) {
-            // Verify if account is allowed to acquire IPs from the system
-            boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
-            if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
-                fetchFromDedicatedRange = false;
-                sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
-                errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
-                addrs = _ipAddressDao.lockRows(sc, filter, true);
-            }
-        }
+                List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
 
-        if (addrs.size() == 0) {
-            if (podId != null) {
-                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
-                // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
-                ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
-                throw ex;
-            }
-            s_logger.warn(errorMessage.toString());
-            InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
-            ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
-            throw ex;
-        }
+                // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
+                if (addrs.size() == 0 && fetchFromDedicatedRange) {
+                    // Verify if account is allowed to acquire IPs from the system
+                    boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
+                    if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
+                        fetchFromDedicatedRange = false;
+                        sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
+                        errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
+                        addrs = _ipAddressDao.lockRows(sc, filter, true);
+                    }
+                }
 
-        assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
+                if (addrs.size() == 0) {
+                    if (podId != null) {
+                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
+                        // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
+                        ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
+                        throw ex;
+                    }
+                    s_logger.warn(errorMessage.toString());
+                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
+                    ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
+                    throw ex;
+                }
 
-        if (!fetchFromDedicatedRange) {
-            // Check that the maximum number of public IPs for the given accountId will not be exceeded
-            try {
-                _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
-            } catch (ResourceAllocationException ex) {
-                s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
-                throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
-            }
-        }
+                assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
 
-        IPAddressVO addr = addrs.get(0);
-        addr.setSourceNat(sourceNat);
-        addr.setAllocatedTime(new Date());
-        addr.setAllocatedInDomainId(owner.getDomainId());
-        addr.setAllocatedToAccountId(owner.getId());
-        addr.setSystem(isSystem);
+                if (!fetchFromDedicatedRange) {
+                    // Check that the maximum number of public IPs for the given accountId will not be exceeded
+                    try {
+                        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
+                    } catch (ResourceAllocationException ex) {
+                        s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
+                        throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
+                    }
+                }
 
-        if (assign) {
-            markPublicIpAsAllocated(addr);
-        } else {
-            addr.setState(IpAddress.State.Allocating);
-        }
-        addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating);
+                IPAddressVO addr = addrs.get(0);
+                addr.setSourceNat(sourceNat);
+                addr.setAllocatedTime(new Date());
+                addr.setAllocatedInDomainId(owner.getDomainId());
+                addr.setAllocatedToAccountId(owner.getId());
+                addr.setSystem(isSystem);
 
-        if (vlanUse != VlanType.DirectAttached) {
-            addr.setAssociatedWithNetworkId(guestNetworkId);
-            addr.setVpcId(vpcId);
-        }
+                if (assign) {
+                    markPublicIpAsAllocated(addr);
+                } else {
+                    addr.setState(IpAddress.State.Allocating);
+                }
+                addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating);
 
-        _ipAddressDao.update(addr.getId(), addr);
+                if (vlanUse != VlanType.DirectAttached) {
+                    addr.setAssociatedWithNetworkId(guestNetworkId);
+                    addr.setVpcId(vpcId);
+                }
 
-        txn.commit();
+                _ipAddressDao.update(addr.getId(), addr);
+
+                return addr;
+            }
+        }, InsufficientAddressCapacityException.class);
 
         if (vlanUse == VlanType.VirtualNetwork) {
             _firewallMgr.addSystemFirewallRules(addr, owner);
@@ -788,44 +797,43 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @DB
     @Override
-    public void markPublicIpAsAllocated(IPAddressVO addr) {
+    public void markPublicIpAsAllocated(final IPAddressVO addr) {
 
         assert (addr.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Free) : "Unable to transition from state " + addr.getState() + " to " +
                                                                                                             IpAddress.State.Allocated;
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                Account owner = _accountMgr.getAccount(addr.getAllocatedToAccountId());
+
+                addr.setState(IpAddress.State.Allocated);
+                _ipAddressDao.update(addr.getId(), addr);
+
+                // Save usage event
+                if (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM) {
+                    VlanVO vlan = _vlanDao.findById(addr.getVlanId());
+
+                    String guestType = vlan.getVlanType().toString();
+
+                    if (!isIpDedicated(addr)) {
+                        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN,
+                            owner.getId(),
+                            addr.getDataCenterId(),
+                            addr.getId(),
+                            addr.getAddress().toString(),
+                            addr.isSourceNat(),
+                            guestType,
+                            addr.getSystem(),
+                            addr.getClass().getName(),
+                            addr.getUuid());
+                    }
 
-        Transaction txn = Transaction.currentTxn();
-
-        Account owner = _accountMgr.getAccount(addr.getAllocatedToAccountId());
-
-        txn.start();
-        addr.setState(IpAddress.State.Allocated);
-        _ipAddressDao.update(addr.getId(), addr);
-
-        // Save usage event
-        if (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM) {
-            VlanVO vlan = _vlanDao.findById(addr.getVlanId());
-
-            String guestType = vlan.getVlanType().toString();
-
-            if (!isIpDedicated(addr)) {
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN,
-                    owner.getId(),
-                    addr.getDataCenterId(),
-                    addr.getId(),
-                    addr.getAddress().toString(),
-                    addr.isSourceNat(),
-                    guestType,
-                    addr.getSystem(),
-                    addr.getClass().getName(),
-                    addr.getUuid());
-            }
-
-            if (updateIpResourceCount(addr)) {
-                _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
+                    if (updateIpResourceCount(addr)) {
+                        _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
+                    }
+                }
             }
-        }
-
-        txn.commit();
+        });
     }
 
     private boolean isIpDedicated(IPAddressVO addr) {
@@ -855,35 +863,38 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @DB
     @Override
-    public PublicIp assignDedicateIpAddress(Account owner, Long guestNtwkId, Long vpcId, long dcId, boolean isSourceNat) throws ConcurrentOperationException,
+    public PublicIp assignDedicateIpAddress(Account owner, final Long guestNtwkId, final Long vpcId, final long dcId, final boolean isSourceNat) throws ConcurrentOperationException,
         InsufficientAddressCapacityException {
 
-        long ownerId = owner.getId();
+        final long ownerId = owner.getId();
 
         PublicIp ip = null;
-        Transaction txn = Transaction.currentTxn();
         try {
-            txn.start();
-
-            owner = _accountDao.acquireInLockTable(ownerId);
+            ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+                @Override
+                public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+                    Account owner = _accountDao.acquireInLockTable(ownerId);
+
+                    if (owner == null) {
+                        // this ownerId comes from owner or type Account. See the class "AccountVO" and the annotations in that class
+                        // to get the table name and field name that is queried to fill this ownerid.
+                        ConcurrentOperationException ex = new ConcurrentOperationException("Unable to lock account");
+                        throw ex;
+                    }
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("lock account " + ownerId + " is acquired");
+                    }
 
-            if (owner == null) {
-                // this ownerId comes from owner or type Account. See the class "AccountVO" and the annotations in that class
-                // to get the table name and field name that is queried to fill this ownerid.
-                ConcurrentOperationException ex = new ConcurrentOperationException("Unable to lock account");
-                throw ex;
-            }
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("lock account " + ownerId + " is acquired");
-            }
+                    PublicIp ip = fetchNewPublicIp(dcId, null, null, owner, VlanType.VirtualNetwork, guestNtwkId, isSourceNat, false, null, false, vpcId);
+                    IPAddressVO publicIp = ip.ip();
 
-            ip = fetchNewPublicIp(dcId, null, null, owner, VlanType.VirtualNetwork, guestNtwkId, isSourceNat, false, null, false, vpcId);
-            IPAddressVO publicIp = ip.ip();
+                    markPublicIpAsAllocated(publicIp);
+                    _ipAddressDao.update(publicIp.getId(), publicIp);
 
-            markPublicIpAsAllocated(publicIp);
-            _ipAddressDao.update(publicIp.getId(), publicIp);
+                    return ip;
+                }
+            }, InsufficientAddressCapacityException.class);
 
-            txn.commit();
             return ip;
         } finally {
             if (owner != null) {
@@ -894,7 +905,6 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
                 _accountDao.releaseFromLockTable(ownerId);
             }
             if (ip == null) {
-                txn.rollback();
                 s_logger.error("Unable to get source nat ip address for account " + ownerId);
             }
         }
@@ -977,11 +987,11 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @DB
     @Override
-    public IpAddress allocateIp(Account ipOwner, boolean isSystem, Account caller, long callerUserId, DataCenter zone) throws ConcurrentOperationException,
+    public IpAddress allocateIp(final Account ipOwner, final boolean isSystem, Account caller, long callerUserId, final DataCenter zone) throws ConcurrentOperationException,
         ResourceAllocationException, InsufficientAddressCapacityException {
 
-        VlanType vlanType = VlanType.VirtualNetwork;
-        boolean assign = false;
+        final VlanType vlanType = VlanType.VirtualNetwork;
+        final boolean assign = false;
 
         if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getType())) {
             // zone is of type DataCenter. See DataCenterVO.java.
@@ -992,7 +1002,6 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
         PublicIp ip = null;
 
-        Transaction txn = Transaction.currentTxn();
         Account accountToLock = null;
         try {
             if (s_logger.isDebugEnabled()) {
@@ -1008,21 +1017,25 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
                 s_logger.debug("Associate IP address lock acquired");
             }
 
-            txn.start();
+            ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+                @Override
+                public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+                    PublicIp ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null);
 
-            ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null);
+                    if (ip == null) {
+                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zone.getId());
+                        ex.addProxyObject(ApiDBUtils.findZoneById(zone.getId()).getUuid());
+                        throw ex;
+                    }
+                    CallContext.current().setEventDetails("Ip Id: " + ip.getId());
+                    Ip ipAddress = ip.getAddress();
 
-            if (ip == null) {
-                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zone.getId());
-                ex.addProxyObject(ApiDBUtils.findZoneById(zone.getId()).getUuid());
-                throw ex;
-            }
-            CallContext.current().setEventDetails("Ip Id: " + ip.getId());
-            Ip ipAddress = ip.getAddress();
+                    s_logger.debug("Got " + ipAddress + " to assign for account " + ipOwner.getId() + " in zone " + zone.getId());
 
-            s_logger.debug("Got " + ipAddress + " to assign for account " + ipOwner.getId() + " in zone " + zone.getId());
+                    return ip;
+                }
+            }, InsufficientAddressCapacityException.class);
 
-            txn.commit();
         } finally {
             if (accountToLock != null) {
                 if (s_logger.isDebugEnabled()) {
@@ -1037,75 +1050,77 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @Override
     @DB
-    public IpAddress allocatePortableIp(Account ipOwner, Account caller, long dcId, Long networkId, Long vpcID) throws ConcurrentOperationException, ResourceAllocationException,
+    public IpAddress allocatePortableIp(final Account ipOwner, Account caller, final long dcId, final Long networkId, final Long vpcID) throws ConcurrentOperationException, ResourceAllocationException,
         InsufficientAddressCapacityException {
 
-        Transaction txn = Transaction.currentTxn();
         GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
-        PortableIpVO allocatedPortableIp;
         IPAddressVO ipaddr;
 
         try {
             portableIpLock.lock(5);
 
-            txn.start();
-
-            List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free);
-            if (portableIpVOs == null || portableIpVOs.isEmpty()) {
-                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available portable IP addresses", Region.class, new Long(1));
-                throw ex;
-            }
-
-            // allocate first portable IP to the user
-            allocatedPortableIp = portableIpVOs.get(0);
-            allocatedPortableIp.setAllocatedTime(new Date());
-            allocatedPortableIp.setAllocatedToAccountId(ipOwner.getAccountId());
-            allocatedPortableIp.setAllocatedInDomainId(ipOwner.getDomainId());
-            allocatedPortableIp.setState(PortableIp.State.Allocated);
-            _portableIpDao.update(allocatedPortableIp.getId(), allocatedPortableIp);
-
-            // To make portable IP available as a zone level resource we need to emulate portable IP's (which are
-            // provisioned at region level) as public IP provisioned in a zone. user_ip_address and vlan combo give the
-            // identity of a public IP in zone. Create entry for portable ip in these tables.
-
-            // provision portable IP range VLAN into the zone
-            long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dcId, TrafficType.Public).getId();
-            Network network = _networkModel.getSystemNetworkByZoneAndTrafficType(dcId, TrafficType.Public);
-            String range = allocatedPortableIp.getAddress() + "-" + allocatedPortableIp.getAddress();
-            VlanVO vlan = new VlanVO(VlanType.VirtualNetwork,
-                allocatedPortableIp.getVlan(),
-                allocatedPortableIp.getGateway(),
-                allocatedPortableIp.getNetmask(),
-                dcId,
-                range,
-                network.getId(),
-                physicalNetworkId,
-                null,
-                null,
-                null);
-            vlan = _vlanDao.persist(vlan);
-
-            // provision the portable IP in to user_ip_address table
-            ipaddr = new IPAddressVO(new Ip(allocatedPortableIp.getAddress()), dcId, networkId, vpcID, physicalNetworkId, network.getId(), vlan.getId(), true);
-            ipaddr.setState(State.Allocated);
-            ipaddr.setAllocatedTime(new Date());
-            ipaddr.setAllocatedInDomainId(ipOwner.getDomainId());
-            ipaddr.setAllocatedToAccountId(ipOwner.getId());
-            ipaddr = _ipAddressDao.persist(ipaddr);
-
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_PORTABLE_IP_ASSIGN,
-                ipaddr.getId(),
-                ipaddr.getDataCenterId(),
-                ipaddr.getId(),
-                ipaddr.getAddress().toString(),
-                ipaddr.isSourceNat(),
-                null,
-                ipaddr.getSystem(),
-                ipaddr.getClass().getName(),
-                ipaddr.getUuid());
-
-            txn.commit();
+            ipaddr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() {
+                @Override
+                public IPAddressVO doInTransaction(TransactionStatus status) throws Exception {
+                    PortableIpVO allocatedPortableIp;
 
+                    List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free);
+                    if (portableIpVOs == null || portableIpVOs.isEmpty()) {
+                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available portable IP addresses", Region.class, new Long(1));
+                        throw ex;
+                    }
+        
+                    // allocate first portable IP to the user
+                    allocatedPortableIp = portableIpVOs.get(0);
+                    allocatedPortableIp.setAllocatedTime(new Date());
+                    allocatedPortableIp.setAllocatedToAccountId(ipOwner.getAccountId());
+                    allocatedPortableIp.setAllocatedInDomainId(ipOwner.getDomainId());
+                    allocatedPortableIp.setState(PortableIp.State.Allocated);
+                    _portableIpDao.update(allocatedPortableIp.getId(), allocatedPortableIp);
+        
+                    // To make portable IP available as a zone level resource we need to emulate portable IP's (which are
+                    // provisioned at region level) as public IP provisioned in a zone. user_ip_address and vlan combo give the
+                    // identity of a public IP in zone. Create entry for portable ip in these tables.
+        
+                    // provision portable IP range VLAN into the zone
+                    long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dcId, TrafficType.Public).getId();
+                    Network network = _networkModel.getSystemNetworkByZoneAndTrafficType(dcId, TrafficType.Public);
+                    String range = allocatedPortableIp.getAddress() + "-" + allocatedPortableIp.getAddress();
+                    VlanVO vlan = new VlanVO(VlanType.VirtualNetwork,
+                        allocatedPortableIp.getVlan(),
+                        allocatedPortableIp.getGateway(),
+                        allocatedPortableIp.getNetmask(),
+                        dcId,
+                        range,
+                        network.getId(),
+                        physicalNetworkId,
+                        null,
+                        null,
+                        null);
+                    vlan = _vlanDao.persist(vlan);
+
+                    // provision the portable IP in to user_ip_address table
+                    IPAddressVO ipaddr = new IPAddressVO(new Ip(allocatedPortableIp.getAddress()), dcId, networkId, vpcID, physicalNetworkId, network.getId(), vlan.getId(), true);
+                    ipaddr.setState(State.Allocated);
+                    ipaddr.setAllocatedTime(new Date());
+                    ipaddr.setAllocatedInDomainId(ipOwner.getDomainId());
+                    ipaddr.setAllocatedToAccountId(ipOwner.getId());
+                    ipaddr = _ipAddressDao.persist(ipaddr);
+
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_PORTABLE_IP_ASSIGN,
+                        ipaddr.getId(),
+                        ipaddr.getDataCenterId(),
+                        ipaddr.getId(),
+                        ipaddr.getAddress().toString(),
+                        ipaddr.isSourceNat(),
+                        null,
+                        ipaddr.getSystem(),
+                        ipaddr.getClass().getName(),
+                        ipaddr.getUuid());
+
+                    return ipaddr;
+                }
+            }, InsufficientAddressCapacityException.class);
         } finally {
             portableIpLock.unlock();
         }
@@ -1392,7 +1407,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @DB
     @Override
-    public void transferPortableIP(long ipAddrId, long currentNetworkId, long newNetworkId) throws ResourceAllocationException, ResourceUnavailableException,
+    public void transferPortableIP(final long ipAddrId, long currentNetworkId, long newNetworkId) throws ResourceAllocationException, ResourceUnavailableException,
         InsufficientAddressCapacityException, ConcurrentOperationException {
 
         Network srcNetwork = _networksDao.findById(currentNetworkId);
@@ -1400,18 +1415,16 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
             throw new InvalidParameterValueException("Invalid source network id " + currentNetworkId + " is given");
         }
 
-        Network dstNetwork = _networksDao.findById(newNetworkId);
+        final Network dstNetwork = _networksDao.findById(newNetworkId);
         if (dstNetwork == null) {
             throw new InvalidParameterValueException("Invalid source network id " + newNetworkId + " is given");
         }
 
-        IPAddressVO ip = _ipAddressDao.findById(ipAddrId);
+        final IPAddressVO ip = _ipAddressDao.findById(ipAddrId);
         if (ip == null) {
             throw new InvalidParameterValueException("Invalid portable ip address id is given");
         }
 
-        Transaction txn = Transaction.currentTxn();
-
         assert (isPortableIpTransferableFromNetwork(ipAddrId, currentNetworkId));
 
         // disassociate portable IP with current network/VPC network
@@ -1424,39 +1437,42 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
         // If portable IP need to be transferred across the zones, then mark the entry corresponding to portable ip
         // in user_ip_address and vlan tables so as to emulate portable IP as provisioned in destination data center
         if (srcNetwork.getDataCenterId() != dstNetwork.getDataCenterId()) {
-            txn.start();
-
-            long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
-            long publicNetworkId = _networkModel.getSystemNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
-
-            ip.setDataCenterId(dstNetwork.getDataCenterId());
-            ip.setPhysicalNetworkId(physicalNetworkId);
-            ip.setSourceNetworkId(publicNetworkId);
-            _ipAddressDao.update(ipAddrId, ip);
-
-            VlanVO vlan = _vlanDao.findById(ip.getVlanId());
-            vlan.setPhysicalNetworkId(physicalNetworkId);
-            vlan.setNetworkId(publicNetworkId);
-            vlan.setDataCenterId(dstNetwork.getDataCenterId());
-            _vlanDao.update(ip.getVlanId(), vlan);
-
-            txn.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
+                    long publicNetworkId = _networkModel.getSystemNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
+
+                    ip.setDataCenterId(dstNetwork.getDataCenterId());
+                    ip.setPhysicalNetworkId(physicalNetworkId);
+                    ip.setSourceNetworkId(publicNetworkId);
+                    _ipAddressDao.update(ipAddrId, ip);
+
+                    VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+                    vlan.setPhysicalNetworkId(physicalNetworkId);
+                    vlan.setNetworkId(publicNetworkId);
+                    vlan.setDataCenterId(dstNetwork.getDataCenterId());
+                    _vlanDao.update(ip.getVlanId(), vlan);
+                }
+            });
         }
 
         // associate portable IP with new network/VPC network
         associatePortableIPToGuestNetwork(ipAddrId, newNetworkId, false);
 
-        txn.start();
-
-        if (dstNetwork.getVpcId() != null) {
-            ip.setVpcId(dstNetwork.getVpcId());
-        } else {
-            ip.setVpcId(null);
-        }
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                if (dstNetwork.getVpcId() != null) {
+                    ip.setVpcId(dstNetwork.getVpcId());
+                } else {
+                    ip.setVpcId(null);
+                }
 
-        _ipAddressDao.update(ipAddrId, ip);
+                _ipAddressDao.update(ipAddrId, ip);
+            }
+        });
 
-        txn.commit();
 
         // trigger an action event for the transfer of portable IP across the networks, so that external entities
         // monitoring for this event can initiate the route advertisement for the availability of IP from the zoe
@@ -1474,106 +1490,113 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @Override
     @DB
-    public boolean associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId, Network guestNetwork) throws InsufficientCapacityException,
+    public boolean associateIpAddressListToAccount(long userId, final long accountId, final long zoneId, final Long vlanId, final Network guestNetworkFinal) throws InsufficientCapacityException,
         ConcurrentOperationException, ResourceUnavailableException, ResourceAllocationException {
-        Account owner = _accountMgr.getActiveAccountById(accountId);
-        boolean createNetwork = false;
+        final Account owner = _accountMgr.getActiveAccountById(accountId);
 
-        if (guestNetwork != null && guestNetwork.getTrafficType() != TrafficType.Guest) {
-            throw new InvalidParameterValueException("Network " + guestNetwork + " is not of a type " + TrafficType.Guest);
+        if (guestNetworkFinal != null && guestNetworkFinal.getTrafficType() != TrafficType.Guest) {
+            throw new InvalidParameterValueException("Network " + guestNetworkFinal + " is not of a type " + TrafficType.Guest);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        if (guestNetwork == null) {
-            List<? extends Network> networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner);
-            if (networks.size() == 0) {
-                createNetwork = true;
-            } else if (networks.size() == 1) {
-                guestNetwork = networks.get(0);
-            } else {
-                throw new InvalidParameterValueException("Error, more than 1 Guest Isolated Networks with SourceNAT "
-                                                         + "service enabled found for this account, cannot assosiate the IP range, please provide the network ID");
-            }
-        }
-
-        // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist
-        List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false);
-        if (requiredOfferings.size() < 1) {
-            throw new CloudRuntimeException("Unable to find network offering with availability=" + Availability.Required +
-                                            " to automatically create the network as part of createVlanIpRange");
-        }
-        if (createNetwork) {
-            if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) {
-                long physicalNetworkId = _networkModel.findPhysicalNetworkId(zoneId, requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
-                // Validate physical network
-                PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
-                if (physicalNetwork == null) {
-                    throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + requiredOfferings.get(0).getTags());
-                }
+        Ternary<Boolean,List<NetworkOfferingVO>, Network> pair = Transaction.executeWithException(new TransactionCallbackWithException<Ternary<Boolean,List<NetworkOfferingVO>, Network>>() {
+            @Override
+            public Ternary<Boolean,List<NetworkOfferingVO>, Network> doInTransaction(TransactionStatus status) throws Exception {
+                boolean createNetwork = false;
+                Network guestNetwork = guestNetworkFinal;
 
-                s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() +
-                               " as a part of createVlanIpRange process");
-                guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
-                    owner.getAccountName() + "-network",
-                    owner.getAccountName() + "-network",
-                    null,
-                    null,
-                    null,
-                    null,
-                    owner,
-                    null,
-                    physicalNetwork,
-                    zoneId,
-                    ACLType.Account,
-                    null,
-                    null,
-                    null,
-                    null,
-                    true,
-                    null);
                 if (guestNetwork == null) {
-                    s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
-                    throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " +
-                                                    "service enabled as a part of createVlanIpRange, for the account " + accountId + "in zone " + zoneId);
+                    List<? extends Network> networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner);
+                    if (networks.size() == 0) {
+                        createNetwork = true;
+                    } else if (networks.size() == 1) {
+                        guestNetwork = networks.get(0);
+                    } else {
+                        throw new InvalidParameterValueException("Error, more than 1 Guest Isolated Networks with SourceNAT "
+                                                                 + "service enabled found for this account, cannot assosiate the IP range, please provide the network ID");
+                    }
                 }
-            } else {
-                throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
-            }
-        }
-
-        // Check if there is a source nat ip address for this account; if not - we have to allocate one
-        boolean allocateSourceNat = false;
-        List<IPAddressVO> sourceNat = _ipAddressDao.listByAssociatedNetwork(guestNetwork.getId(), true);
-        if (sourceNat.isEmpty()) {
-            allocateSourceNat = true;
-        }
-
-        // update all ips with a network id, mark them as allocated and update resourceCount/usage
-        List<IPAddressVO> ips = _ipAddressDao.listByVlanId(vlanId);
-        boolean isSourceNatAllocated = false;
-        for (IPAddressVO addr : ips) {
-            if (addr.getState() != State.Allocated) {
-                if (!isSourceNatAllocated && allocateSourceNat) {
-                    addr.setSourceNat(true);
-                    isSourceNatAllocated = true;
-                } else {
-                    addr.setSourceNat(false);
+        
+                // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist
+                List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false);
+                if (requiredOfferings.size() < 1) {
+                    throw new CloudRuntimeException("Unable to find network offering with availability=" + Availability.Required +
+                                                    " to automatically create the network as part of createVlanIpRange");
                 }
-                addr.setAssociatedWithNetworkId(guestNetwork.getId());
-                addr.setVpcId(guestNetwork.getVpcId());
-                addr.setAllocatedTime(new Date());
-                addr.setAllocatedInDomainId(owner.getDomainId());
-                addr.setAllocatedToAccountId(owner.getId());
-                addr.setSystem(false);
-                addr.setState(IpAddress.State.Allocating);
-                markPublicIpAsAllocated(addr);
+                if (createNetwork) {
+                    if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) {
+                        long physicalNetworkId = _networkModel.findPhysicalNetworkId(zoneId, requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
+                        // Validate physical network
+                        PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+                        if (physicalNetwork == null) {
+                            throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + requiredOfferings.get(0).getTags());
+                        }
+        
+                        s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() +
+                                       " as a part of createVlanIpRange process");
+                        guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
+                            owner.getAccountName() + "-network",
+                            owner.getAccountName() + "-network",
+                            null,
+                            null,
+                            null,
+                            null,
+                            owner,
+                            null,
+                            physicalNetwork,
+                            zoneId,
+                            ACLType.Account,
+                            null,
+                            null,
+                            null,
+                            null,
+                            true,
+                            null);
+                        if (guestNetwork == null) {
+                            s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
+                            throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " +
+                                                            "service enabled as a part of createVlanIpRange, for the account " + accountId + "in zone " + zoneId);
+                        }
+                    } else {
+                        throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
+                    }
+                }
+        
+                // Check if there is a source nat ip address for this account; if not - we have to allocate one
+                boolean allocateSourceNat = false;
+                List<IPAddressVO> sourceNat = _ipAddressDao.listByAssociatedNetwork(guestNetwork.getId(), true);
+                if (sourceNat.isEmpty()) {
+                    allocateSourceNat = true;
+                }
+        
+                // update all ips with a network id, mark them as allocated and update resourceCount/usage
+                List<IPAddressVO> ips = _ipAddressDao.listByVlanId(vlanId);
+                boolean isSourceNatAllocated = false;
+                for (IPAddressVO addr : ips) {
+                    if (addr.getState() != State.Allocated) {
+                        if (!isSourceNatAllocated && allocateSourceNat) {
+                            addr.setSourceNat(true);
+                            isSourceNatAllocated = true;
+                        } else {
+                            addr.setSourceNat(false);
+                        }
+                        addr.setAssociatedWithNetworkId(guestNetwork.getId());
+                        addr.setVpcId(guestNetwork.getVpcId());
+                        addr.setAllocatedTime(new Date());
+                        addr.setAllocatedInDomainId(owner.getDomainId());
+                        addr.setAllocatedToAccountId(owner.getId());
+                        addr.setSystem(false);
+                        addr.setState(IpAddress.State.Allocating);
+                        markPublicIpAsAllocated(addr);
+                    }
+                }
+                return new Ternary<Boolean,List<NetworkOfferingVO>, Network>(createNetwork, requiredOfferings, guestNetwork);
             }
-        }
-
-        txn.commit();
+        }, InsufficientCapacityException.class);
 
+        boolean createNetwork = pair.first();
+        List<NetworkOfferingVO> requiredOfferings = pair.second();
+        Network guestNetwork = pair.third();
+        
         // if the network offering has persistent set to true, implement the network
         if (createNetwork && requiredOfferings.get(0).getIsPersistent()) {
             DataCenter zone = _dcDao.findById(zoneId);
@@ -1602,10 +1625,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @DB
     @Override
-    public IPAddressVO markIpAsUnavailable(long addrId) {
-        Transaction txn = Transaction.currentTxn();
-
-        IPAddressVO ip = _ipAddressDao.findById(addrId);
+    public IPAddressVO markIpAsUnavailable(final long addrId) {
+        final IPAddressVO ip = _ipAddressDao.findById(addrId);
 
         if (ip.getAllocatedToAccountId() == null && ip.getAllocatedTime() == null) {
             s_logger.trace("Ip address id=" + addrId + " is already released");
@@ -1613,35 +1634,36 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
         }
 
         if (ip.getState() != State.Releasing) {
-            txn.start();
-
-            if (updateIpResourceCount(ip)) {
-                _resourceLimitMgr.decrementResourceCount(_ipAddressDao.findById(addrId).getAllocatedToAccountId(), ResourceType.public_ip);
-            }
+            return Transaction.execute(new TransactionCallback<IPAddressVO>() {
+                @Override
+                public IPAddressVO doInTransaction(TransactionStatus status) {
+                    if (updateIpResourceCount(ip)) {
+                        _resourceLimitMgr.decrementResourceCount(_ipAddressDao.findById(addrId).getAllocatedToAccountId(), ResourceType.public_ip);
+                    }
 
-            // Save usage event
-            if (ip.getAllocatedToAccountId() != null && ip.getAllocatedToAccountId() != Account.ACCOUNT_ID_SYSTEM) {
-                VlanVO vlan = _vlanDao.findById(ip.getVlanId());
-
-                String guestType = vlan.getVlanType().toString();
-                if (!isIpDedicated(ip)) {
-                    String eventType = ip.isPortable() ? EventTypes.EVENT_PORTABLE_IP_RELEASE : EventTypes.EVENT_NET_IP_RELEASE;
-                    UsageEventUtils.publishUsageEvent(eventType,
-                        ip.getAllocatedToAccountId(),
-                        ip.getDataCenterId(),
-                        addrId,
-                        ip.getAddress().addr(),
-                        ip.isSourceNat(),
-                        guestType,
-                        ip.getSystem(),
-                        ip.getClass().getName(),
-                        ip.getUuid());
+                    // Save usage event
+                    if (ip.getAllocatedToAccountId() != null && ip.getAllocatedToAccountId() != Account.ACCOUNT_ID_SYSTEM) {
+                        VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+
+                        String guestType = vlan.getVlanType().toString();
+                        if (!isIpDedicated(ip)) {
+                            String eventType = ip.isPortable() ? EventTypes.EVENT_PORTABLE_IP_RELEASE : EventTypes.EVENT_NET_IP_RELEASE;
+                            UsageEventUtils.publishUsageEvent(eventType,
+                                ip.getAllocatedToAccountId(),
+                                ip.getDataCenterId(),
+                                addrId,
+                                ip.getAddress().addr(),
+                                ip.isSourceNat(),
+                                guestType,
+                                ip.getSystem(),
+                                ip.getClass().getName(),
+                                ip.getUuid());
+                        }
+                    }
+        
+                    return _ipAddressDao.markAsUnavailable(addrId);
                 }
-            }
-
-            ip = _ipAddressDao.markAsUnavailable(addrId);
-
-            txn.commit();
+            });
         }
 
         return ip;
@@ -1826,73 +1848,76 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
     @Override
     @DB
-    public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Network network, String requestedIpv4, String requestedIpv6)
+    public void allocateDirectIp(final NicProfile nic, final DataCenter dc, final VirtualMachineProfile vm, final Network network, final String requestedIpv4, final String requestedIpv6)
         throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
-        //This method allocates direct ip for the Shared network in Advance zones
-        boolean ipv4 = false;
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        if (network.getGateway() != null) {
-            if (nic.getIp4Address() == null) {
-                ipv4 = true;
-                PublicIp ip = null;
-
-                //Get ip address from the placeholder and don't allocate a new one
-                if (requestedIpv4 != null && vm.getType() == VirtualMachine.Type.DomainRouter) {
-                    Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
-                    if (placeholderNic != null) {
-                        IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
-                        ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
-                        s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network);
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+                //This method allocates direct ip for the Shared network in Advance zones
+                boolean ipv4 = false;
+
+                if (network.getGateway() != null) {
+                    if (nic.getIp4Address() == null) {
+                        ipv4 = true;
+                        PublicIp ip = null;
+
+                        //Get ip address from the placeholder and don't allocate a new one
+                        if (requestedIpv4 != null && vm.getType() == VirtualMachine.Type.DomainRouter) {
+                            Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+                            if (placeholderNic != null) {
+                                IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
+                                ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+                                s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network);
+                            }
+                        }
+
+                        if (ip == null) {
+                            ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false);
+                        }
+
+                        nic.setIp4Address(ip.getAddress().toString());
+                        nic.setGateway(ip.getGateway());
+                        nic.setNetmask(ip.getNetmask());
+                        nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+                        //nic.setBroadcastType(BroadcastDomainType.Vlan);
+                        //nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
+                        nic.setBroadcastType(network.getBroadcastDomainType());
+                        nic.setBroadcastUri(network.getBroadcastUri());
+                        nic.setFormat(AddressFormat.Ip4);
+                        nic.setReservationId(String.valueOf(ip.getVlanTag()));
+                        nic.setMacAddress(ip.getMacAddress());
                     }
+                    nic.setDns1(dc.getDns1());
+                    nic.setDns2(dc.getDns2());
                 }
 
-                if (ip == null) {
-                    ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false);
+                //FIXME - get ipv6 address from the placeholder if it's stored there
+                if (network.getIp6Gateway() != null) {
+                    if (nic.getIp6Address() == null) {
+                        UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
+                        Vlan vlan = _vlanDao.findById(ip.getVlanId());
+                        nic.setIp6Address(ip.getAddress().toString());
+                        nic.setIp6Gateway(vlan.getIp6Gateway());
+                        nic.setIp6Cidr(vlan.getIp6Cidr());
+                        if (ipv4) {
+                            nic.setFormat(AddressFormat.DualStack);
+                        } else {
+                            nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
+                            nic.setBroadcastType(BroadcastDomainType.Vlan);
+                            nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
+                            nic.setFormat(AddressFormat.Ip6);
+                            nic.setReservationId(String.valueOf(vlan.getVlanTag()));
+                            nic.setMacAddress(ip.getMacAddress());
+                        }
+                    }
+                    nic.setIp6Dns1(dc.getIp6Dns1());
+                    nic.setIp6Dns2(dc.getIp6Dns2());
                 }
 
-                nic.setIp4Address(ip.getAddress().toString());
-                nic.setGateway(ip.getGateway());
-                nic.setNetmask(ip.getNetmask());
-                nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
-                //nic.setBroadcastType(BroadcastDomainType.Vlan);
-                //nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
-                nic.setBroadcastType(network.getBroadcastDomainType());
-                nic.setBroadcastUri(network.getBroadcastUri());
-                nic.setFormat(AddressFormat.Ip4);
-                nic.setReservationId(String.valueOf(ip.getVlanTag()));
-                nic.setMacAddress(ip.getMacAddress());
-            }
-            nic.setDns1(dc.getDns1());
-            nic.setDns2(dc.getDns2());
-        }
-
-        //FIXME - get ipv6 address from the placeholder if it's stored there
-        if (network.getIp6Gateway() != null) {
-            if (nic.getIp6Address() == null) {
-                UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
-                Vlan vlan = _vlanDao.findById(ip.getVlanId());
-                nic.setIp6Address(ip.getAddress().toString());
-                nic.setIp6Gateway(vlan.getIp6Gateway());
-                nic.setIp6Cidr(vlan.getIp6Cidr());
-                if (ipv4) {
-                    nic.setFormat(AddressFormat.DualStack);
-                } else {
-                    nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
-                    nic.setBroadcastType(BroadcastDomainType.Vlan);
-                    nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
-                    nic.setFormat(AddressFormat.Ip6);
-                    nic.setReservationId(String.valueOf(vlan.getVlanTag()));
-                    nic.setMacAddress(ip.getMacAddress());
-                }
+                return null;
             }
-            nic.setIp6Dns1(dc.getIp6Dns1());
-            nic.setIp6Dns2(dc.getIp6Dns2());
-        }
+        }, InsufficientAddressCapacityException.class);
 
-        txn.commit();
     }
 
     @Override


[15/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
index 56d405e..35968ee 100644
--- a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
@@ -44,7 +44,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
@@ -62,6 +61,9 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.ConnectionConcierge;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.events.SubscriptionMgr;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExceptionUtil;
@@ -532,7 +534,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
         return new ManagedContextRunnable() {
             @Override
             protected void runInContext() {
-                Transaction txn = Transaction.open("ClusterHeartbeat");
+                TransactionLegacy txn = TransactionLegacy.open("ClusterHeartbeat");
                 try {
                     Profiler profiler = new Profiler();
                     Profiler profilerHeartbeatUpdate = new Profiler();
@@ -599,7 +601,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
 
                     invalidHeartbeatConnection();
                 } finally {
-                    txn.transitToAutoManagedConnection(Transaction.CLOUD_DB);
+                    txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
                     txn.close("ClusterHeartbeat");
                 }
             }
@@ -620,7 +622,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
 
     private Connection getHeartbeatConnection() throws SQLException {
         if(_heartbeatConnection == null) {
-            Connection conn = Transaction.getStandaloneConnectionWithException();
+            Connection conn = TransactionLegacy.getStandaloneConnectionWithException();
             _heartbeatConnection = new ConnectionConcierge("ClusterManagerHeartbeat", conn, false);
         }
 
@@ -629,9 +631,9 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
 
     private void invalidHeartbeatConnection() {
         if(_heartbeatConnection != null) {
-            Connection conn = Transaction.getStandaloneConnection();
+            Connection conn = TransactionLegacy.getStandaloneConnection();
             if (conn != null) {
-                _heartbeatConnection.reset(Transaction.getStandaloneConnection());
+                _heartbeatConnection.reset(TransactionLegacy.getStandaloneConnection());
             }
         }
     }
@@ -942,58 +944,54 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
             s_logger.info("Starting cluster manager, msid : " + _msId);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        try {
-            txn.start();
-
-            final Class<?> c = this.getClass();
-            String version = c.getPackage().getImplementationVersion();
+        ManagementServerHostVO mshost = Transaction.execute(new TransactionCallback<ManagementServerHostVO>() {
+            @Override
+            public ManagementServerHostVO doInTransaction(TransactionStatus status) {
 
-            ManagementServerHostVO mshost = _mshostDao.findByMsid(_msId);
-            if (mshost == null) {
-                mshost = new ManagementServerHostVO();
-                mshost.setMsid(_msId);
-                mshost.setRunid(getCurrentRunId());
-                mshost.setName(NetUtils.getHostName());
-                mshost.setVersion(version);
-                mshost.setServiceIP(_clusterNodeIP);
-                mshost.setServicePort(_currentServiceAdapter.getServicePort());
-                mshost.setLastUpdateTime(DateUtil.currentGMTTime());
-                mshost.setRemoved(null);
-                mshost.setAlertCount(0);
-                mshost.setState(ManagementServerHost.State.Up);
-                _mshostDao.persist(mshost);
-
-                if (s_logger.isInfoEnabled()) {
-                    s_logger.info("New instance of management server msid " + _msId + " is being started");
-                }
-            } else {
-                if (s_logger.isInfoEnabled()) {
-                    s_logger.info("Management server " + _msId + " is being started");
+                final Class<?> c = this.getClass();
+                String version = c.getPackage().getImplementationVersion();
+    
+                ManagementServerHostVO mshost = _mshostDao.findByMsid(_msId);
+                if (mshost == null) {
+                    mshost = new ManagementServerHostVO();
+                    mshost.setMsid(_msId);
+                    mshost.setRunid(getCurrentRunId());
+                    mshost.setName(NetUtils.getHostName());
+                    mshost.setVersion(version);
+                    mshost.setServiceIP(_clusterNodeIP);
+                    mshost.setServicePort(_currentServiceAdapter.getServicePort());
+                    mshost.setLastUpdateTime(DateUtil.currentGMTTime());
+                    mshost.setRemoved(null);
+                    mshost.setAlertCount(0);
+                    mshost.setState(ManagementServerHost.State.Up);
+                    _mshostDao.persist(mshost);
+    
+                    if (s_logger.isInfoEnabled()) {
+                        s_logger.info("New instance of management server msid " + _msId + " is being started");
+                    }
+                } else {
+                    if (s_logger.isInfoEnabled()) {
+                        s_logger.info("Management server " + _msId + " is being started");
+                    }
+    
+                    _mshostDao.update(mshost.getId(), getCurrentRunId(), NetUtils.getHostName(), version, _clusterNodeIP, _currentServiceAdapter.getServicePort(), DateUtil.currentGMTTime());
                 }
-
-                _mshostDao.update(mshost.getId(), getCurrentRunId(), NetUtils.getHostName(), version, _clusterNodeIP, _currentServiceAdapter.getServicePort(), DateUtil.currentGMTTime());
+                
+                return mshost;
             }
+        });
 
-            txn.commit();
-
-            _mshostId = mshost.getId();
-            if (s_logger.isInfoEnabled()) {
-                s_logger.info("Management server (host id : " + _mshostId + ") is being started at " + _clusterNodeIP + ":" + _currentServiceAdapter.getServicePort());
-            }
-            
-            _mshostPeerDao.clearPeerInfo(_mshostId);
-
-            // use seperate thread for heartbeat updates
-            _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HeartbeatInterval.value(), HeartbeatInterval.value(), TimeUnit.MILLISECONDS);
-            _notificationExecutor.submit(getNotificationTask());
+        _mshostId = mshost.getId();
+        if (s_logger.isInfoEnabled()) {
+            s_logger.info("Management server (host id : " + _mshostId + ") is being started at " + _clusterNodeIP + ":" + _currentServiceAdapter.getServicePort());
+        }
+        
+        _mshostPeerDao.clearPeerInfo(_mshostId);
 
-        } catch (Throwable e) {
-            s_logger.error("Unexpected exception : ", e);
-            txn.rollback();
+        // use seperate thread for heartbeat updates
+        _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HeartbeatInterval.value(), HeartbeatInterval.value(), TimeUnit.MILLISECONDS);
+        _notificationExecutor.submit(getNotificationTask());
 
-            throw new CloudRuntimeException("Unable to initialize cluster info into database");
-        }
 
         if (s_logger.isInfoEnabled()) {
             s_logger.info("Cluster manager was started successfully");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
index 879c4ce..246bfe6 100644
--- a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Local(value={ManagementServerHostDao.class})
@@ -52,7 +52,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 
 	@Override
     public void invalidateRunSession(long id, long runid) {
-	    Transaction txn = Transaction.currentTxn();
+	    TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement("update mshost set runid=0, state='Down' where id=? and runid=?");
@@ -81,7 +81,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 	@Override
     @DB
 	public void update(long id, long runid, String name, String version, String serviceIP, int servicePort, Date lastUpdate) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -106,7 +106,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 	@Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
     
         try {
         	txn.start();
@@ -127,7 +127,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 	@Override
     @DB
 	public void update(long id, long runid, Date lastUpdate) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -167,7 +167,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 	@Override
     @DB
 	public int increaseAlertCount(long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         int changedRows = 0;
         try {
@@ -209,7 +209,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 	
 	@Override
     public void update(long id, long runId, State state, Date lastUpdate) {
-	    Transaction txn = Transaction.currentTxn();
+	    TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement("update mshost set state=?, last_update=? where id=? and runid=?");
@@ -241,7 +241,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
 	public List<Long> listOrphanMsids() {
 		List<Long> orphanList = new ArrayList<Long>();
 		
-	    Transaction txn = Transaction.currentTxn();
+	    TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
index 8ef2e82..f51076c 100644
--- a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value={ManagementServerHostPeerDao.class})
 public class ManagementServerHostPeerDaoImpl extends GenericDaoBase<ManagementServerHostPeerVO, Long> implements ManagementServerHostPeerDao {
@@ -68,7 +68,7 @@ public class ManagementServerHostPeerDaoImpl extends GenericDaoBase<ManagementSe
     @Override
     @DB
     public void updatePeerInfo(long ownerMshost, long peerMshost, long peerRunid, ManagementServerHost.State peerState) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
         

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java b/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
index e402988..1f649d4 100644
--- a/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
+++ b/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -132,7 +132,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase<ConfigurationVO, String
     @Override
     @Deprecated
     public boolean update(String name, String value) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareStatement(UPDATE_CONFIGURATION_SQL);
             stmt.setString(1, value);
@@ -147,7 +147,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase<ConfigurationVO, String
 
     @Override
     public boolean update(String name, String category, String value) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             value = ("Hidden".equals(category) || "Secure".equals(category)) ? DBEncryptionUtil.encrypt(value) : value;
             PreparedStatement stmt = txn.prepareStatement(UPDATE_CONFIGURATION_SQL);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java b/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
index 9b13eb8..b7246a9 100755
--- a/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
+++ b/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
@@ -39,6 +39,7 @@ import org.jasypt.properties.EncryptableProperties;
 
 import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 import org.apache.commons.configuration.ConfigurationException;
@@ -227,7 +228,7 @@ public class EncryptionSecretKeyChanger {
 		initEncryptor(newEncryptor, newDBKey);
 		System.out.println("Initialised Encryptors");
 		
-		Transaction txn = Transaction.open("Migrate");
+		TransactionLegacy txn = TransactionLegacy.open("Migrate");
 		txn.start();
 		try {
 			Connection conn;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java b/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
index c3c24f9..acb9cc6 100644
--- a/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
+++ b/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
@@ -178,7 +178,7 @@ public class ConnectionConcierge {
                 return "Not Found";
             }
 
-            Connection conn = Transaction.getStandaloneConnection();
+            Connection conn = TransactionLegacy.getStandaloneConnection();
             if (conn == null) {
                 return "Unable to get anotehr db connection";
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/DbUtil.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/DbUtil.java b/framework/db/src/com/cloud/utils/db/DbUtil.java
index da0efbb..2570093 100755
--- a/framework/db/src/com/cloud/utils/db/DbUtil.java
+++ b/framework/db/src/com/cloud/utils/db/DbUtil.java
@@ -56,7 +56,7 @@ public class DbUtil {
     				assert(false);
     			}
     			
-    			Connection connection = Transaction.getStandaloneConnection();
+    			Connection connection = TransactionLegacy.getStandaloneConnection();
     			if(connection != null) {
     				try {
 						connection.setAutoCommit(true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
index 574974e..ba5200e 100755
--- a/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
+++ b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
@@ -380,7 +380,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
         List<Object> groupByValues = addGroupBy(str, sc);
         addFilter(str, filter);
 
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         if (lock != null) {
             assert (txn.dbTxnStarted() == true) : "As nice as I can here now....how do you lock when there's no DB transaction?  Review your db 101 course from college.";
             str.append(lock ? FOR_UPDATE_CLAUSE : SHARE_MODE_CLAUSE);
@@ -452,7 +452,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
         final String sql = str.toString();
 
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql);
@@ -770,7 +770,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
         }
         SearchCriteria<T> sc = createSearchCriteria();
         sc.addAnd(_idAttributes.get(_table)[0], SearchCriteria.Op.EQ, id);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         try {
@@ -791,7 +791,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
     public int update(UpdateBuilder ub, final SearchCriteria<?> sc, Integer rows) {
         StringBuilder sql = null;
         PreparedStatement pstmt = null;
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             final String searchClause = sc.getWhereClause();
 
@@ -971,7 +971,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
         if (lock != null) {
             sql.append(lock ? FOR_UPDATE_CLAUSE : SHARE_MODE_CLAUSE);
         }
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql.toString());
@@ -994,7 +994,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
     @Override
     public T acquireInLockTable(final ID id, int seconds) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         T t = null;
         boolean locked  = false;
         try {
@@ -1014,7 +1014,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
     @Override
     public boolean releaseFromLockTable(final ID id) {
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         return txn.release(_table + id);
     }
 
@@ -1025,13 +1025,13 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
     @Override
     public boolean lockInLockTable(final String id, int seconds) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         return txn.lock(_table + id, seconds);
     }
 
     @Override
     public boolean unlockFromLockTable(final String id) {
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         return txn.release(_table + id);
     }
 
@@ -1076,7 +1076,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
     }
 
     protected List<T> executeList(final String sql, final Object... params) {
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         final List<T> result = new ArrayList<T>();
         try {
@@ -1118,7 +1118,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
     @Override
     public boolean expunge(final ID id) {
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = null;
         try {
@@ -1158,7 +1158,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
         final String sql = str.toString();
 
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql);
@@ -1296,7 +1296,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
         }
 
         ID id = null;
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = null;
         try {
@@ -1359,7 +1359,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
     }
 
     protected void insertElementCollection(T entity, Attribute idAttribute, ID id, Map<Attribute, Object> ecAttributes) throws SQLException {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         for (Map.Entry<Attribute, Object> entry : ecAttributes.entrySet()) {
             Attribute attr = entry.getKey();
@@ -1591,7 +1591,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
     protected void loadCollection(T entity, Attribute attr)  {
         EcInfo ec = (EcInfo)attr.attache;
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         ResultSet rs = null;
         PreparedStatement pstmt = null;
         try {
@@ -1675,7 +1675,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
         }
         final StringBuilder sql = new StringBuilder("DELETE FROM ");
         sql.append(_table).append(" WHERE ").append(_removed.first()).append(" IS NOT NULL");
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -1708,7 +1708,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
             return expunge(id);
         }
 
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
 
@@ -1817,7 +1817,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
 
         // we have to disable group by in getting count, since count for groupBy clause will be different.
         //List<Object> groupByValues = addGroupBy(str, sc);
-        final Transaction txn = Transaction.currentTxn();
+        final TransactionLegacy txn = TransactionLegacy.currentTxn();
         final String sql = str.toString();
 
         PreparedStatement pstmt = null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/Merovingian2.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/Merovingian2.java b/framework/db/src/com/cloud/utils/db/Merovingian2.java
index 0e0e8f2..8544aab 100644
--- a/framework/db/src/com/cloud/utils/db/Merovingian2.java
+++ b/framework/db/src/com/cloud/utils/db/Merovingian2.java
@@ -65,7 +65,7 @@ public class Merovingian2 extends StandardMBean implements MerovingianMBean {
         _msId = msId;
         Connection conn = null;
         try {
-            conn = Transaction.getStandaloneConnectionWithException();
+            conn = TransactionLegacy.getStandaloneConnectionWithException();
             conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
             conn.setAutoCommit(true);
             _concierge = new ConnectionConcierge("LockMaster", conn, true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/SequenceFetcher.java b/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
index 8823552..bb45847 100644
--- a/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
+++ b/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
@@ -98,7 +98,7 @@ public class SequenceFetcher {
                 sql.append(_tg.valueColumnName()).append(" FROM ").append(_tg.table());
                 sql.append(" WHERE ").append(_tg.pkColumnName()).append(" = ? FOR UPDATE");
                 
-                Transaction txn = Transaction.open("Sequence");
+                TransactionLegacy txn = TransactionLegacy.open("Sequence");
                 
                 PreparedStatement selectStmt = txn.prepareStatement(sql.toString());
                 if (_key == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/Transaction.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/Transaction.java b/framework/db/src/com/cloud/utils/db/Transaction.java
index 8c2f199..0ca1cc7 100755
--- a/framework/db/src/com/cloud/utils/db/Transaction.java
+++ b/framework/db/src/com/cloud/utils/db/Transaction.java
@@ -16,1158 +16,50 @@
 // under the License.
 package com.cloud.utils.db;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Savepoint;
-import java.sql.Statement;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
 import java.util.concurrent.atomic.AtomicLong;
 
-import javax.sql.DataSource;
+import com.cloud.utils.exception.ExceptionUtil;
 
-import org.apache.commons.dbcp.ConnectionFactory;
-import org.apache.commons.dbcp.DriverManagerConnectionFactory;
-import org.apache.commons.dbcp.PoolableConnectionFactory;
-import org.apache.commons.dbcp.PoolingDataSource;
-import org.apache.commons.pool.KeyedObjectPoolFactory;
-import org.apache.commons.pool.impl.GenericObjectPool;
-import org.apache.commons.pool.impl.StackKeyedObjectPoolFactory;
-import org.apache.log4j.Logger;
-import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
-import org.jasypt.properties.EncryptableProperties;
-
-import com.cloud.utils.Pair;
-import com.cloud.utils.PropertiesUtil;
-import com.cloud.utils.crypt.EncryptionSecretKeyChecker;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.mgmt.JmxUtil;
-
-/**
- * Transaction abstracts away the Connection object in JDBC.  It allows the
- * following things that the Connection object does not.
- * 
- *   1. Transaction can be started at an entry point and whether the DB
- *      actions should be auto-commit or not determined at that point.
- *   2. DB Connection is allocated only when it is needed.
- *   3. Code does not need to know if a transaction has been started or not.
- *      It just starts/ends a transaction and we resolve it correctly with
- *      the previous actions.
- *
- * Note that this class is not synchronous but it doesn't need to be because
- * it is stored with TLS and is one per thread.  Use appropriately.
- */
 public class Transaction {
-    private static final Logger s_logger = Logger.getLogger(Transaction.class.getName() + "." + "Transaction");
-    private static final Logger s_stmtLogger = Logger.getLogger(Transaction.class.getName() + "." + "Statement");
-    private static final Logger s_lockLogger = Logger.getLogger(Transaction.class.getName() + "." + "Lock");
-    private static final Logger s_connLogger = Logger.getLogger(Transaction.class.getName() + "." + "Connection");
-
-    private static final ThreadLocal<Transaction> tls = new ThreadLocal<Transaction>();
-    private static final String START_TXN = "start_txn";
-    private static final String CURRENT_TXN = "current_txn";
-    private static final String CREATE_TXN = "create_txn";
-    private static final String CREATE_CONN = "create_conn";
-    private static final String STATEMENT = "statement";
-    private static final String ATTACHMENT = "attachment";
+    private final static AtomicLong counter = new AtomicLong(0);
+    private final static TransactionStatus STATUS = new TransactionStatus() {
+    };
 
-    public static final short CLOUD_DB = 0;
-    public static final short USAGE_DB = 1;
-    public static final short AWSAPI_DB = 2;
-    public static final short SIMULATOR_DB = 3;
-    public static final short CONNECTED_DB = -1;
-
-    private static AtomicLong s_id = new AtomicLong();
-    private static final TransactionMBeanImpl s_mbean = new TransactionMBeanImpl();
-    static {
+    public static <T> T execute(TransactionCallback<T> callback) {
+        String name = "tx-" + counter.incrementAndGet();
+        TransactionLegacy txn = TransactionLegacy.open(name);
         try {
-            JmxUtil.registerMBean("Transaction", "Transaction", s_mbean);
-        } catch (Exception e) {
-            s_logger.error("Unable to register mbean for transaction", e);
-        }
-        
-        /* FIXME: We need a better solution for this
-         * Initialize encryption if we need it for db.properties
-         */ 
-        EncryptionSecretKeyChecker enc = new EncryptionSecretKeyChecker();
-        enc.check();  
-    }
-
-    private final LinkedList<StackElement> _stack;
-    private long _id;
-
-    private final LinkedList<Pair<String, Long>> _lockTimes = new LinkedList<Pair<String, Long>>();
-
-    private String _name;
-    private Connection _conn;
-    private boolean _txn;
-    private short _dbId;
-    private long _txnTime;
-    private Statement _stmt;
-    private String _creator;
-
-    private Transaction _prev = null;
-
-    public static Transaction currentTxn() {
-        Transaction txn = tls.get();
-        assert txn != null : "No Transaction on stack.  Did you mark the method with @DB?";
-
-        assert checkAnnotation(3, txn) : "Did you even read the guide to use Transaction...IOW...other people's code? Try method can't be private.  What about @DB? hmmm... could that be it? " + txn;
-        return txn;
-    }
-
-    public static Transaction open(final short databaseId) {
-        String name = buildName();
-        if (name == null) {
-            name = CURRENT_TXN;
-        }
-        return open(name, databaseId, true);
-    }
-
-    //
-    // Usage of this transaction setup should be limited, it will always open a new transaction context regardless of whether or not there is other
-    // transaction context in the stack. It is used in special use cases that we want to control DB connection explicitly and in the mean time utilize
-    // the existing DAO features
-    //
-    public void transitToUserManagedConnection(Connection conn) {
-        assert(_conn == null /*&& _stack.size() <= 1*/) : "Can't change to a user managed connection unless the stack is empty and the db connection is null, you may have forgotten to invoke transitToAutoManagedConnection to close out the DB connection: " + toString();
-        _conn = conn;
-        _dbId = CONNECTED_DB;
-    }
-
-    public void transitToAutoManagedConnection(short dbId) {
-        // assert(_stack.size() <= 1) : "Can't change to auto managed connection unless your stack is empty";
-        _dbId = dbId;
-        _conn = null;
-    }
-
-    public static Transaction open(final String name) {
-        return open(name, CLOUD_DB, false);
-    }
-
-    public static Transaction open(final String name, final short databaseId, final boolean forceDbChange) {
-        Transaction txn = tls.get();
-        boolean isNew = false;
-        if (txn == null) {
-            if (s_logger.isTraceEnabled()) {
-                s_logger.trace("Creating the transaction: " + name);
-            }
-            txn = new Transaction(name, false, databaseId);
-            tls.set(txn);
-            isNew = true;
-        } else if (forceDbChange) {
-            final short currentDbId = txn.getDatabaseId();
-            if (currentDbId != databaseId) {
-                // we need to end the current transaction and switch databases
-                txn.close(txn.getName());
-
-                txn = new Transaction(name, false, databaseId);
-                tls.set(txn);
-                isNew = true;
-            }
-        }
-
-        txn.takeOver(name, false);
-        if (isNew) {
-            s_mbean.addTransaction(txn);
-        }
-        return txn;
-    }
-
-    protected StackElement peekInStack(Object obj) {
-        final Iterator<StackElement> it = _stack.iterator();
-        while (it.hasNext()) {
-            StackElement next = it.next();
-            if (next.type == obj) {
-                return next;
-            }
-        }
-        return null;
-    }
-
-    public void registerLock(String sql) {
-        if (_txn && s_lockLogger.isDebugEnabled()) {
-            Pair<String, Long> time = new Pair<String, Long>(sql, System.currentTimeMillis());
-            _lockTimes.add(time);
+            txn.start();
+            T result = callback.doInTransaction(STATUS);
+            txn.commit();
+            return result;
+        } finally {
+            txn.close();
         }
     }
 
-    public boolean dbTxnStarted() {
-        return _txn;
-    }
-
-    public static Connection getStandaloneConnectionWithException() throws SQLException {
-        Connection conn = s_ds.getConnection();
-        if (s_connLogger.isTraceEnabled()) {
-            s_connLogger.trace("Retrieving a standalone connection: dbconn" + System.identityHashCode(conn));
-        }
-        return conn;
-    }
-
-    public static Connection getStandaloneConnection() {
-        try {
-            return getStandaloneConnectionWithException();
-        } catch (SQLException e) {
-            s_logger.error("Unexpected exception: ", e);
-            return null;
-        }
-    }
-
-    public static Connection getStandaloneUsageConnection() {
-        try {
-            Connection conn = s_usageDS.getConnection();
-            if (s_connLogger.isTraceEnabled()) {
-                s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
-            }
-            return conn;
-        } catch (SQLException e) {
-            s_logger.warn("Unexpected exception: ", e);
-            return null;
-        }
-    }
-
-    public static Connection getStandaloneAwsapiConnection() {
+    public static <T,X extends Exception> T executeWithException(final TransactionCallbackWithException<T> callback, Class<X> exception) throws X {
         try {
-            Connection conn = s_awsapiDS.getConnection();
-            if (s_connLogger.isTraceEnabled()) {
-                s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
-            }
-            return conn;
-        } catch (SQLException e) {
-            s_logger.warn("Unexpected exception: ", e);
-            return null;
-        }
-    }
-    
-    public static Connection getStandaloneSimulatorConnection() {
-    	try {
-    		Connection conn = s_simulatorDS.getConnection();
-    		if (s_connLogger.isTraceEnabled()) {
-                s_connLogger.trace("Retrieving a standalone connection for simulator: dbconn" + System.identityHashCode(conn));
-            }
-            return conn;
-        } catch (SQLException e) {
-            s_logger.warn("Unexpected exception: ", e);
-            return null;
-        }
-    }
-
-    protected void attach(TransactionAttachment value) {
-        _stack.push(new StackElement(ATTACHMENT, value));
-    }
-
-    protected TransactionAttachment detach(String name) {
-        Iterator<StackElement> it = _stack.descendingIterator();
-        while (it.hasNext()) {
-            StackElement element = it.next();
-            if (element.type == ATTACHMENT) {
-                TransactionAttachment att = (TransactionAttachment)element.ref;
-                if (name.equals(att.getName())) {
-                    it.remove();
-                    return att;
-                }
-            }
-        }
-        assert false : "Are you sure you attached this: " + name;
-        return null;
-    }
-
-    public static void attachToTxn(TransactionAttachment value) {
-        Transaction txn = tls.get();
-        assert txn != null && txn.peekInStack(CURRENT_TXN) != null: "Come on....how can we attach something to the transaction if you haven't started it?";
-
-        txn.attach(value);
-    }
-
-    public static TransactionAttachment detachFromTxn(String name) {
-        Transaction txn = tls.get();
-        assert txn != null : "No Transaction in TLS";
-        return txn.detach(name);
-    }
-
-    protected static boolean checkAnnotation(int stack, Transaction txn) {
-        final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
-        StackElement se = txn.peekInStack(CURRENT_TXN);
-        if (se == null) {
-            return false;
-        }
-        
-        StringBuffer sb = new StringBuffer();
-        for (; stack < stacks.length; stack++) {
-            String methodName = stacks[stack].getMethodName();
-            sb.append(" ").append(methodName);
-            if (methodName.equals(se.ref)){
-                return true;
-            }
-        }
-        
-        // relax stack structure for several places that @DB required injection is not in place
-        s_logger.warn("Non-standard stack context that Transaction context is manaully placed into the calling chain. Stack chain: " + sb);
-        return true;
-    }
-
-    protected static String buildName() {
-        if (s_logger.isDebugEnabled()) {
-            final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
-            final StringBuilder str = new StringBuilder();
-            int i = 3, j = 3;
-            while (j < 15 && i < stacks.length) {
-                StackTraceElement element = stacks[i];
-                String filename = element.getFileName();
-                String method = element.getMethodName();
-                if ((filename != null && filename.equals("<generated>")) || (method != null && method.equals("invokeSuper"))) {
-                    i++;
-                    continue;
-                }
-
-                str.append("-").append(stacks[i].getClassName().substring(stacks[i].getClassName().lastIndexOf(".") + 1)).append(".").append(stacks[i].getMethodName()).append(":").append(stacks[i].getLineNumber());
-                j++;
-                i++;
-            }
-            return str.toString();
-        }
-
-        return "";
-    }
-
-    public Transaction(final String name, final boolean forLocking, final short databaseId) {
-        _name = name;
-        _conn = null;
-        _stack = new LinkedList<StackElement>();
-        _txn = false;
-        _dbId = databaseId;
-        _id = s_id.incrementAndGet();
-        _creator = Thread.currentThread().getName();
-    }
-
-    public String getCreator() {
-        return _creator;
-    }
-
-    public long getId() {
-        return _id;
-    }
-
-    public String getName() {
-        return _name;
-    }
-
-    public Short getDatabaseId() {
-        return _dbId;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder str = new StringBuilder((_name != null ? _name : ""));
-        str.append(" : ");
-        for (final StackElement se : _stack) {
-            if (se.type == CURRENT_TXN) {
-                str.append(se.ref).append(", ");
-            }
-        }
-
-        return str.toString();
-    }
-
-    protected void mark(final String name) {
-        _stack.push(new StackElement(CURRENT_TXN, name));
-    }
-
-    public boolean lock(final String name, final int timeoutSeconds) {
-        Merovingian2 lockMaster = Merovingian2.getLockMaster();
-        if (lockMaster == null) {
-            throw new CloudRuntimeException("There's no support for locking yet");
-        }
-        return lockMaster.acquire(name, timeoutSeconds);
-    }
-
-    public boolean release(final String name) {
-        Merovingian2 lockMaster = Merovingian2.getLockMaster();
-        if (lockMaster == null) {
-            throw new CloudRuntimeException("There's no support for locking yet");
-        }
-        return lockMaster.release(name);
-    }
-
-    public void start() {
-        if (s_logger.isTraceEnabled()) {
-            s_logger.trace("txn: start requested by: " + buildName());
-        }
-
-        _stack.push(new StackElement(START_TXN, null));
-
-        if (_txn) {
-            s_logger.trace("txn: has already been started.");
-            return;
-        }
-
-        _txn = true;
-
-        _txnTime = System.currentTimeMillis();
-        if (_conn != null) {
-            try {
-                s_logger.trace("txn: set auto commit to false");
-                _conn.setAutoCommit(false);
-            } catch (final SQLException e) {
-                s_logger.warn("Unable to set auto commit: ", e);
-                throw new CloudRuntimeException("Unable to set auto commit: ", e);
-            }
-        }
-    }
-
-    protected void closePreviousStatement() {
-        if (_stmt != null) {
-            try {
-                if (s_stmtLogger.isTraceEnabled()) {
-                    s_stmtLogger.trace("Closing: " + _stmt.toString());
-                }
-                try {
-                    ResultSet rs = _stmt.getResultSet();
-                    if (rs != null && _stmt.getResultSetHoldability() != ResultSet.HOLD_CURSORS_OVER_COMMIT) {
-                        rs.close();
-                    }
-                } catch(SQLException e) {
-                    s_stmtLogger.trace("Unable to close resultset");
-                }
-                _stmt.close();
-            } catch (final SQLException e) {
-                s_stmtLogger.trace("Unable to close statement: " + _stmt.toString());
-            } finally {
-                _stmt = null;
-            }
-        }
-    }
-
-    /**
-     * Prepares an auto close statement.  The statement is closed automatically if it is
-     * retrieved with this method.
-     * 
-     * @param sql sql String
-     * @return PreparedStatement
-     * @throws SQLException if problem with JDBC layer.
-     * 
-     * @see java.sql.Connection
-     */
-    public PreparedStatement prepareAutoCloseStatement(final String sql) throws SQLException {
-        PreparedStatement stmt = prepareStatement(sql);
-        closePreviousStatement();
-        _stmt = stmt;
-        return stmt;
-    }
-
-    public PreparedStatement prepareStatement(final String sql) throws SQLException {
-        final Connection conn = getConnection();
-        final PreparedStatement pstmt = conn.prepareStatement(sql);
-        if (s_stmtLogger.isTraceEnabled()) {
-            s_stmtLogger.trace("Preparing: " + sql);
-        }
-        return pstmt;
-    }
-
-    /**
-     * Prepares an auto close statement.  The statement is closed automatically if it is
-     * retrieved with this method.
-     * 
-     * @param sql sql String
-     * @param autoGeneratedKeys keys that are generated
-     * @return PreparedStatement
-     * @throws SQLException if problem with JDBC layer.
-     * 
-     * @see java.sql.Connection
-     */
-    public PreparedStatement prepareAutoCloseStatement(final String sql, final int autoGeneratedKeys) throws SQLException {
-        final Connection conn = getConnection();
-        final PreparedStatement pstmt = conn.prepareStatement(sql, autoGeneratedKeys);
-        if (s_stmtLogger.isTraceEnabled()) {
-            s_stmtLogger.trace("Preparing: " + sql);
-        }
-        closePreviousStatement();
-        _stmt = pstmt;
-        return pstmt;
-    }
-
-    /**
-     * Prepares an auto close statement.  The statement is closed automatically if it is
-     * retrieved with this method.
-     * 
-     * @param sql sql String
-     * @param columnNames names of the columns
-     * @return PreparedStatement
-     * @throws SQLException if problem with JDBC layer.
-     * 
-     * @see java.sql.Connection
-     */
-    public PreparedStatement prepareAutoCloseStatement(final String sql, final String[] columnNames) throws SQLException {
-        final Connection conn = getConnection();
-        final PreparedStatement pstmt = conn.prepareStatement(sql, columnNames);
-        if (s_stmtLogger.isTraceEnabled()) {
-            s_stmtLogger.trace("Preparing: " + sql);
-        }
-        closePreviousStatement();
-        _stmt = pstmt;
-        return pstmt;
-    }
-
-    /**
-     * Prepares an auto close statement.  The statement is closed automatically if it is
-     * retrieved with this method.
-     * 
-     * @param sql sql String
-     * @return PreparedStatement
-     * @throws SQLException if problem with JDBC layer.
-     * 
-     * @see java.sql.Connection
-     */
-    public PreparedStatement prepareAutoCloseStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        final Connection conn = getConnection();
-        final PreparedStatement pstmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
-        if (s_stmtLogger.isTraceEnabled()) {
-            s_stmtLogger.trace("Preparing: " + sql);
-        }
-        closePreviousStatement();
-        _stmt = pstmt;
-        return pstmt;
-    }
-
-    /**
-     * Returns the db connection.
-     * 
-     * Note: that you can call getConnection() but beaware that
-     * all prepare statements from the Connection are not garbage
-     * collected!
-     * 
-     * @return DB Connection but make sure you understand that
-     *         you are responsible for closing the PreparedStatement.
-     * @throws SQLException
-     */
-    public Connection getConnection() throws SQLException {
-        if (_conn == null) {
-            switch (_dbId) {
-            case CLOUD_DB:
-                if(s_ds != null) {
-                    _conn = s_ds.getConnection();
-                } else {
-                    s_logger.warn("A static-initialized variable becomes null, process is dying?");
-                    throw new CloudRuntimeException("Database is not initialized, process is dying?");
-                }
-                break;
-            case USAGE_DB:
-                if(s_usageDS != null) {
-                    _conn = s_usageDS.getConnection();
-                } else {
-                    s_logger.warn("A static-initialized variable becomes null, process is dying?");
-                    throw new CloudRuntimeException("Database is not initialized, process is dying?");
-                }
-                break;
-            case AWSAPI_DB:
-        	if(s_awsapiDS != null) {
-        	    _conn = s_awsapiDS.getConnection();
-        	} else {
-        	    s_logger.warn("A static-initialized variable becomes null, process is dying?");
-                throw new CloudRuntimeException("Database is not initialized, process is dying?");
-        	}
-                break;
-
-            case SIMULATOR_DB:
-                if(s_simulatorDS != null) {
-                    _conn = s_simulatorDS.getConnection();
-                } else {
-                    s_logger.warn("A static-initialized variable becomes null, process is dying?");
-                    throw new CloudRuntimeException("Database is not initialized, process is dying?");
-                }
-                break;
-            default:
-
-        	throw new CloudRuntimeException("No database selected for the transaction");
-            }
-            _conn.setAutoCommit(!_txn);
-
-            //
-            // MySQL default transaction isolation level is REPEATABLE READ,
-            // to reduce chances of DB deadlock, we will use READ COMMITED isolation level instead
-            // see http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html
-            //
-            _stack.push(new StackElement(CREATE_CONN, null));
-            if (s_connLogger.isTraceEnabled()) {
-                s_connLogger.trace("Creating a DB connection with " + (_txn ? " txn: " : " no txn: ") + " for " + _dbId + ": dbconn" + System.identityHashCode(_conn) + ". Stack: " + buildName());
-            }
-        } else {
-            s_logger.trace("conn: Using existing DB connection");
-        }
-
-        return _conn;
-    }
-
-    protected boolean takeOver(final String name, final boolean create) {
-        if (_stack.size() != 0) {
-            if (!create) {
-                // If it is not a create transaction, then let's just use the current one.
-                if (s_logger.isTraceEnabled()) {
-                    s_logger.trace("Using current transaction: " + toString());
-                }
-                mark(name);
-                return false;
-            }
-
-            final StackElement se = _stack.getFirst();
-            if (se.type == CREATE_TXN) {
-                // This create is called inside of another create.  Which is ok?
-                // We will let that create be responsible for cleaning up.
-                if (s_logger.isTraceEnabled()) {
-                    s_logger.trace("Create using current transaction: " + toString());
-                }
-                mark(name);
-                return false;
-            }
-
-            s_logger.warn("Encountered a transaction that has leaked.  Cleaning up. " + toString());
-            cleanup();
-        }
-
-        if (s_logger.isTraceEnabled()) {
-            s_logger.trace("Took over the transaction: " + name);
-        }
-        _stack.push(new StackElement(create ? CREATE_TXN : CURRENT_TXN, name));
-        _name = name;
-        return true;
-    }
-
-    public void cleanup() {
-        closePreviousStatement();
-
-        removeUpTo(null, null);
-        if (_txn) {
-            rollbackTransaction();
-        }
-        _txn = false;
-        _name = null;
-
-        closeConnection();
-
-        _stack.clear();
-        Merovingian2 lockMaster = Merovingian2.getLockMaster();
-        if (lockMaster != null) {
-            lockMaster.cleanupThread();
-        }
-    }
-
-    public void close() {
-        removeUpTo(CURRENT_TXN, null);
-
-        if (_stack.size() == 0) {
-            s_logger.trace("Transaction is done");
-            cleanup();
-        }
-    }
-
-    /**
-     * close() is used by endTxn to close the connection.  This method only
-     * closes the connection if the name is the same as what's stored.
-     * 
-     * @param name
-     * @return true if this close actually closes the connection.  false if not.
-     */
-    public boolean close(final String name) {
-        if (_name == null) {    // Already cleaned up.
-            if (s_logger.isTraceEnabled()) {
-                s_logger.trace("Already cleaned up." + buildName());
-            }
-            return true;
-        }
-
-        if (!_name.equals(name)) {
-            close();
-            return false;
-        }
-
-        if (s_logger.isDebugEnabled() && _stack.size() > 2) {
-            s_logger.debug("Transaction is not closed properly: " + toString() + ".  Called by " + buildName());
-        }
-
-        cleanup();
-
-        s_logger.trace("All done");
-        return true;
-    }
-
-    protected boolean hasTxnInStack() {
-        return peekInStack(START_TXN) != null;
-    }
-
-    protected void clearLockTimes() {
-        if (s_lockLogger.isDebugEnabled()) {
-            for (Pair<String, Long> time : _lockTimes) {
-                s_lockLogger.trace("SQL " + time.first() + " took " + (System.currentTimeMillis() - time.second()));
-            }
-            _lockTimes.clear();
-        }
-    }
-
-    public boolean commit() {
-        if (!_txn) {
-            s_logger.warn("txn: Commit called when it is not a transaction: " + buildName());
-            return false;
-        }
-
-        Iterator<StackElement> it = _stack.iterator();
-        while (it.hasNext()) {
-            StackElement st = it.next();
-            if (st.type == START_TXN) {
-                it.remove();
-                break;
-            }
-        }
-
-        if (hasTxnInStack()) {
-            if (s_logger.isTraceEnabled()) {
-                s_logger.trace("txn: Not committing because transaction started elsewhere: " + buildName() + " / " + toString());
-            }
-            return false;
-        }
-
-        _txn = false;
-        try {
-            if (_conn != null) {
-                _conn.commit();
-                s_logger.trace("txn: DB Changes committed. Time = " + (System.currentTimeMillis() - _txnTime));
-                clearLockTimes();
-                closeConnection();
-            }
-            return true;
-        } catch (final SQLException e) {
-            rollbackTransaction();
-            throw new CloudRuntimeException("Unable to commit or close the connection. ", e);
-        }
-    }
-
-    protected void closeConnection() {
-        closePreviousStatement();
-
-        if (_conn == null) {
-            return;
-        }
-
-        if (_txn) {
-            s_connLogger.trace("txn: Not closing DB connection because we're still in a transaction.");
-            return;
-        }
-
-        try {
-            // we should only close db connection when it is not user managed
-            if (this._dbId != CONNECTED_DB) {
-                if (s_connLogger.isTraceEnabled()) {
-                    s_connLogger.trace("Closing DB connection: dbconn" + System.identityHashCode(_conn));
-                }                                
-                _conn.close();
-                _conn = null;  
-            }
-
-        } catch (final SQLException e) {
-            s_logger.warn("Unable to close connection", e);
-        }
-    }
-
-    protected void removeUpTo(String type, Object ref) {
-        boolean rollback = false;
-        Iterator<StackElement> it = _stack.iterator();
-        while (it.hasNext()) {
-            StackElement item = it.next();
-
-            it.remove();
-
-            try {
-                if (item.type == type && (ref == null || item.ref == ref)) {
-                    break;
-                }
-
-                if (item.type == CURRENT_TXN) {
-                    if (s_logger.isTraceEnabled()) {
-                        s_logger.trace("Releasing the current txn: " + (item.ref != null ? item.ref : ""));
-                    }
-                } else if (item.type == CREATE_CONN) {
-                    closeConnection();
-                } else if (item.type == START_TXN) {
-                    if (item.ref == null) {
-                        rollback = true;
-                    } else {
-                        try {
-                            _conn.rollback((Savepoint)ref);
-                            rollback = false;
-                        } catch (final SQLException e) {
-                            s_logger.warn("Unable to rollback Txn.", e);
-                        }
-                    }
-                } else if (item.type == STATEMENT) {
+            return execute(new TransactionCallback<T>() {
+                @Override
+                public T doInTransaction(TransactionStatus status) {
                     try {
-                        if (s_stmtLogger.isTraceEnabled()) {
-                            s_stmtLogger.trace("Closing: " + ref.toString());
-                        }
-                        Statement stmt = (Statement)ref;
-                        try {
-                            ResultSet rs = stmt.getResultSet();
-                            if (rs != null) {
-                                rs.close();
-                            }
-                        } catch(SQLException e) {
-                            s_stmtLogger.trace("Unable to close resultset");
-                        }
-                        stmt.close();
-                    } catch (final SQLException e) {
-                        s_stmtLogger.trace("Unable to close statement: " + item);
-                    }
-                } else if (item.type == ATTACHMENT) {
-                    TransactionAttachment att = (TransactionAttachment)item.ref;
-                    if (s_logger.isTraceEnabled()) {
-                        s_logger.trace("Cleaning up " + att.getName());
+                        return callback.doInTransaction(status);
+                    } catch (Exception e) {
+                        ExceptionUtil.rethrowRuntime(e);
+                        throw new TransactionWrappedExeception(e);
                     }
-                    att.cleanup();
-                }
-            } catch(Exception e) {
-                s_logger.error("Unable to clean up " + item, e);
-            }
-        }
-
-        if (rollback) {
-            rollback();
-        }
-    }
-
-    protected void rollbackTransaction() {
-        closePreviousStatement();
-        if (!_txn) {
-            if (s_logger.isTraceEnabled()) {
-                s_logger.trace("Rollback called for " + _name + " when there's no transaction: " + buildName());
-            }
-            return;
-        }
-        assert (!hasTxnInStack()) : "Who's rolling back transaction when there's still txn in stack?";
-        _txn = false;
-        try {
-            if (_conn != null) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Rolling back the transaction: Time = " + (System.currentTimeMillis() - _txnTime) + " Name =  " + _name + "; called by " + buildName());
-                }
-                _conn.rollback();
-            }
-            clearLockTimes();
-            closeConnection();
-        } catch(final SQLException e) {
-            s_logger.warn("Unable to rollback", e);
-        }
-    }
-
-    protected void rollbackSavepoint(Savepoint sp) {
-        try {
-            if (_conn != null) {
-                _conn.rollback(sp);
-            }
-        } catch (SQLException e) {
-            s_logger.warn("Unable to rollback to savepoint " + sp);
-        }
-
-        if (!hasTxnInStack()) {
-            _txn = false;
-            closeConnection();
-        }
-    }
-
-    public void rollback() {
-        Iterator<StackElement> it = _stack.iterator();
-        while (it.hasNext()) {
-            StackElement st = it.next();
-            if (st.type == START_TXN) {
-                if (st.ref == null) {
-                    it.remove();
-                } else  {
-                    rollback((Savepoint)st.ref);
-                    return;
                 }
-            }
-        }
-
-        rollbackTransaction();
-    }
-
-    public Savepoint setSavepoint() throws SQLException {
-        _txn = true;
-        StackElement st = new StackElement(START_TXN, null);
-        _stack.push(st);
-        final Connection conn = getConnection();
-        final Savepoint sp = conn.setSavepoint();
-        st.ref = sp;
-
-        return sp;
-    }
-
-    public Savepoint setSavepoint(final String name) throws SQLException {
-        _txn = true;
-        StackElement st = new StackElement(START_TXN, null);
-        _stack.push(st);
-        final Connection conn = getConnection();
-        final Savepoint sp = conn.setSavepoint(name);
-        st.ref = sp;
-
-        return sp;
-    }
-
-    public void releaseSavepoint(final Savepoint sp) throws SQLException {
-        removeTxn(sp);
-        if (_conn != null) {
-            _conn.releaseSavepoint(sp);
-        }
-
-        if (!hasTxnInStack()) {
-            _txn = false;
-            closeConnection();
-        }
-    }
-
-    protected boolean hasSavepointInStack(Savepoint sp) {
-        Iterator<StackElement> it = _stack.iterator();
-        while (it.hasNext()) {
-            StackElement se = it.next();
-            if (se.type == START_TXN && se.ref == sp) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    protected void removeTxn(Savepoint sp) {
-        assert hasSavepointInStack(sp) : "Removing a save point that's not in the stack";
-
-        if (!hasSavepointInStack(sp)) {
-            return;
-        }
-
-        Iterator<StackElement> it = _stack.iterator();
-        while (it.hasNext()) {
-            StackElement se = it.next();
-            if (se.type == START_TXN) {
-                it.remove();
-                if (se.ref == sp) {
-                    return;
-                }
-            }
-        }
-    }
-
-    public void rollback(final Savepoint sp) {
-        removeTxn(sp);
-
-        rollbackSavepoint(sp);
-    }
-
-    public Connection getCurrentConnection() {
-        return _conn;
-    }
-
-    public List<StackElement> getStack() {
-        return _stack;
-    }
-
-    protected Transaction() {
-        _name = null;
-        _conn = null;
-        _stack = null;
-        _txn = false;
-        _dbId = -1;
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        if (!(_conn == null && (_stack == null || _stack.size() == 0))) {
-            assert (false) : "Oh Alex oh alex...something is wrong with how we're doing this";
-            s_logger.error("Something went wrong that a transaction is orphaned before db connection is closed");
-            cleanup();
+            });
+        } catch (TransactionWrappedExeception e) {
+            ExceptionUtil.rethrowRuntime(e.getWrapped());
+            ExceptionUtil.rethrow(e.getWrapped(), exception);
+            throw e;
         }
     }
-
-    protected class StackElement {
-        public String type;
-        public Object ref;
-
-        public StackElement (String type, Object ref) {
-            this.type = type;
-            this.ref = ref;
-        }
-
-        @Override
-        public String toString() {
-            return type + "-" + ref;
-        }
-    }
-
-    private static DataSource s_ds;
-    private static DataSource s_usageDS;
-    private static DataSource s_awsapiDS;
-    private static DataSource s_simulatorDS;
-
-    static {
-        // Initialize with assumed db.properties file
-        initDataSource("db.properties");
-    }
-
-    public static void initDataSource(String propsFileName) {
-        try {
-            File dbPropsFile = PropertiesUtil.findConfigFile(propsFileName);
-            final Properties dbProps;
-            if (EncryptionSecretKeyChecker.useEncryption()) {
-                StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor();
-                dbProps = new EncryptableProperties(encryptor);
-            } else {
-                dbProps = new Properties();
-            }
-            try {
-                dbProps.load(new FileInputStream(dbPropsFile));
-            } catch (IOException e) {
-                s_logger.fatal("Unable to load db properties file, pl. check the classpath and file path configuration", e);
-                return;
-            } catch (NullPointerException e) {
-                s_logger.fatal("Unable to locate db properties file within classpath or absolute path: " + propsFileName);
-                return;
-            }
-
-            // FIXME:  If params are missing...default them????
-            final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive"));
-            final int cloudMaxIdle = Integer.parseInt(dbProps.getProperty("db.cloud.maxIdle"));
-            final long cloudMaxWait = Long.parseLong(dbProps.getProperty("db.cloud.maxWait"));
-            final String cloudUsername = dbProps.getProperty("db.cloud.username");
-            final String cloudPassword = dbProps.getProperty("db.cloud.password");
-            final String cloudHost = dbProps.getProperty("db.cloud.host");
-            final int cloudPort = Integer.parseInt(dbProps.getProperty("db.cloud.port"));
-            final String cloudDbName = dbProps.getProperty("db.cloud.name");
-            final boolean cloudAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.cloud.autoReconnect"));
-            final String cloudValidationQuery = dbProps.getProperty("db.cloud.validationQuery");
-            final String cloudIsolationLevel = dbProps.getProperty("db.cloud.isolation.level");
-
-            int isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
-            if (cloudIsolationLevel == null) {
-                isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
-            } else if (cloudIsolationLevel.equalsIgnoreCase("readcommitted")) {
-                isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
-            } else if (cloudIsolationLevel.equalsIgnoreCase("repeatableread")) {
-                isolationLevel = Connection.TRANSACTION_REPEATABLE_READ;
-            } else if (cloudIsolationLevel.equalsIgnoreCase("serializable")) {
-                isolationLevel = Connection.TRANSACTION_SERIALIZABLE;
-            } else if (cloudIsolationLevel.equalsIgnoreCase("readuncommitted")) {
-                isolationLevel = Connection.TRANSACTION_READ_UNCOMMITTED;
-            } else {
-                s_logger.warn("Unknown isolation level " + cloudIsolationLevel + ".  Using read uncommitted");
-            }
-
-            final boolean cloudTestOnBorrow = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testOnBorrow"));
-            final boolean cloudTestWhileIdle = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testWhileIdle"));
-            final long cloudTimeBtwEvictionRunsMillis = Long.parseLong(dbProps.getProperty("db.cloud.timeBetweenEvictionRunsMillis"));
-            final long cloudMinEvcitableIdleTimeMillis = Long.parseLong(dbProps.getProperty("db.cloud.minEvictableIdleTimeMillis"));
-            final boolean cloudPoolPreparedStatements = Boolean.parseBoolean(dbProps.getProperty("db.cloud.poolPreparedStatements"));
-            final String url = dbProps.getProperty("db.cloud.url.params");
-
-            final boolean useSSL = Boolean.parseBoolean(dbProps.getProperty("db.cloud.useSSL"));
-            if (useSSL) {
-                System.setProperty("javax.net.ssl.keyStore", dbProps.getProperty("db.cloud.keyStore"));
-                System.setProperty("javax.net.ssl.keyStorePassword", dbProps.getProperty("db.cloud.keyStorePassword"));
-                System.setProperty("javax.net.ssl.trustStore", dbProps.getProperty("db.cloud.trustStore"));
-                System.setProperty("javax.net.ssl.trustStorePassword", dbProps.getProperty("db.cloud.trustStorePassword"));
-            }
-
-            final GenericObjectPool cloudConnectionPool = new GenericObjectPool(null, cloudMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
-                    cloudMaxWait, cloudMaxIdle, cloudTestOnBorrow, false, cloudTimeBtwEvictionRunsMillis, 1, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle);
-
-            final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + cloudDbName +
-                    "?autoReconnect=" + cloudAutoReconnect + (url != null ? "&" + url : "") + (useSSL ? "&useSSL=true" : ""), cloudUsername, cloudPassword);
-
-            final KeyedObjectPoolFactory poolableObjFactory = (cloudPoolPreparedStatements ? new StackKeyedObjectPoolFactory() : null);
-
-            final PoolableConnectionFactory cloudPoolableConnectionFactory = new PoolableConnectionFactory(cloudConnectionFactory, cloudConnectionPool, poolableObjFactory,
-                    cloudValidationQuery, false, false, isolationLevel);
-
-            // Default Data Source for CloudStack
-            s_ds = new PoolingDataSource(cloudPoolableConnectionFactory.getPool());
-
-            // Configure the usage db
-            final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive"));
-            final int usageMaxIdle = Integer.parseInt(dbProps.getProperty("db.usage.maxIdle"));
-            final long usageMaxWait = Long.parseLong(dbProps.getProperty("db.usage.maxWait"));
-            final String usageUsername = dbProps.getProperty("db.usage.username");
-            final String usagePassword = dbProps.getProperty("db.usage.password");
-            final String usageHost = dbProps.getProperty("db.usage.host");
-            final int usagePort = Integer.parseInt(dbProps.getProperty("db.usage.port"));
-            final String usageDbName = dbProps.getProperty("db.usage.name");
-            final boolean usageAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.usage.autoReconnect"));
-            final String usageUrl = dbProps.getProperty("db.usage.url.params");
-
-            final GenericObjectPool usageConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
-                    usageMaxWait, usageMaxIdle);
-
-            final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + usageHost + ":" + usagePort + "/" + usageDbName +
-                    "?autoReconnect=" + usageAutoReconnect + (usageUrl != null ? "&" + usageUrl : ""), usageUsername, usagePassword);
-
-            final PoolableConnectionFactory usagePoolableConnectionFactory = new PoolableConnectionFactory(usageConnectionFactory, usageConnectionPool,
-                    new StackKeyedObjectPoolFactory(), null, false, false);
-
-            // Data Source for usage server
-            s_usageDS = new PoolingDataSource(usagePoolableConnectionFactory.getPool());
-
-            // Configure awsapi db
-            final String awsapiDbName = dbProps.getProperty("db.awsapi.name");
-            final GenericObjectPool awsapiConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
-                    usageMaxWait, usageMaxIdle);
-            final ConnectionFactory awsapiConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + awsapiDbName +
-                    "?autoReconnect=" + usageAutoReconnect, cloudUsername, cloudPassword);
-            final PoolableConnectionFactory awsapiPoolableConnectionFactory = new PoolableConnectionFactory(awsapiConnectionFactory, awsapiConnectionPool,
-                    new StackKeyedObjectPoolFactory(), null, false, false);
-
-            // Data Source for awsapi
-            s_awsapiDS = new PoolingDataSource(awsapiPoolableConnectionFactory.getPool());
-
-            try {
-                // Configure the simulator db
-                final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive"));
-                final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle"));
-                final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait"));
-                final String simulatorUsername = dbProps.getProperty("db.simulator.username");
-                final String simulatorPassword = dbProps.getProperty("db.simulator.password");
-                final String simulatorHost = dbProps.getProperty("db.simulator.host");
-                final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port"));
-                final String simulatorDbName = dbProps.getProperty("db.simulator.name");
-                final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect"));
-
-                final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
-                        simulatorMaxWait, simulatorMaxIdle);
-
-                final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + simulatorHost + ":" + simulatorPort + "/" + simulatorDbName +
-                        "?autoReconnect=" + simulatorAutoReconnect, simulatorUsername, simulatorPassword);
-
-                final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool,
-                        new StackKeyedObjectPoolFactory(), null, false, false);
-                s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool());
-            } catch (Exception e) {
-                s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS");
-            }
-        } catch (final Exception e) {
-            s_ds = getDefaultDataSource("cloud");
-            s_usageDS = getDefaultDataSource("cloud_usage");
-            s_simulatorDS = getDefaultDataSource("cloud_simulator");
-            s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Falling back on assumed datasource on localhost:3306 using username:password=cloud:cloud. Please check your configuration", e);
-        }
-    }
-
-    private static DataSource getDefaultDataSource(final String database) {
-        final GenericObjectPool connectionPool = new GenericObjectPool(null, 5);
-        final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
-           "jdbc:mysql://localhost:3306/" + database, "cloud", "cloud");
-        final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
-           connectionFactory, connectionPool, null, null, false, true);
-        return new PoolingDataSource(
-           /* connectionPool */poolableConnectionFactory.getPool());
+    
+    public static Object startTransaction() {
+    	return null;
     }
     
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionCallback.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallback.java b/framework/db/src/com/cloud/utils/db/TransactionCallback.java
new file mode 100644
index 0000000..2f68a93
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallback.java
@@ -0,0 +1,7 @@
+package com.cloud.utils.db;
+
+public interface TransactionCallback<T> {
+
+	public T doInTransaction(TransactionStatus status);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
new file mode 100644
index 0000000..7341b4d
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
@@ -0,0 +1,13 @@
+package com.cloud.utils.db;
+
+public abstract class TransactionCallbackNoReturn implements TransactionCallback<Object> {
+
+	@Override
+	public Object doInTransaction(TransactionStatus status) {
+		doInTransaction(status);
+		return null;
+	}
+
+	public abstract void doInTransactionWithoutResult(TransactionStatus status);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
new file mode 100644
index 0000000..cbf3fbd
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
@@ -0,0 +1,7 @@
+package com.cloud.utils.db;
+
+public interface TransactionCallbackWithException<T> {
+
+	public T doInTransaction(TransactionStatus status) throws Exception;
+	
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java b/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
index 40fcbbf..d60ab7b 100644
--- a/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
@@ -46,19 +46,19 @@ public class TransactionContextBuilder implements ComponentMethodInterceptor {
 
 	@Override
     public Object interceptStart(Method method, Object target) {
-    	return Transaction.open(method.getName());
+    	return TransactionLegacy.open(method.getName());
     }
     
 	@Override
     public void interceptComplete(Method method, Object target, Object objReturnedInInterceptStart) {
-    	Transaction txn = (Transaction)objReturnedInInterceptStart;
+    	TransactionLegacy txn = (TransactionLegacy)objReturnedInInterceptStart;
     	if(txn != null)
     		txn.close();
     }
     
 	@Override
     public void interceptException(Method method, Object target, Object objReturnedInInterceptStart) {
-    	Transaction txn = (Transaction)objReturnedInInterceptStart;
+	    TransactionLegacy txn = (TransactionLegacy)objReturnedInInterceptStart;
     	if(txn != null)
     		txn.close();
     }


[16/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
index 2b79664..59e61e9 100755
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
@@ -48,7 +48,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -237,7 +237,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
     @DB
     public HypervisorType getHypervisorType(long volumeId) {
         /* lookup from cluster of pool */
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = null;
         try {
@@ -458,7 +458,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
 
     @Override
     public List<Long> listPoolIdsByVolumeCount(long dcId, Long podId, Long clusterId, long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         try {
@@ -484,7 +484,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
     @Override
     public List<Long> listZoneWidePoolIdsByVolumeCount(long dcId, long accountId) {
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         try {
@@ -519,7 +519,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VolumeVO entry = findById(id);
         if (entry != null) {
@@ -533,7 +533,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
     @Override
     public ScopeType getVolumeStoragePoolScope(long volumeId) {
         // finding the storage scope where the volume is present
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index 40af999..54158f5 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value=VolumeDetailsDao.class)
@@ -98,7 +98,7 @@ public class VolumeDetailsDaoImpl extends GenericDaoBase<VolumeDetailVO, Long> i
 
     @Override
     public void persist(long volumeId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<VolumeDetailVO> sc = VolumeSearch.create();
         sc.setParameters("volumeId", volumeId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java b/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
index c97085b..8260aa1 100755
--- a/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
+++ b/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
@@ -30,11 +30,11 @@ import java.util.Properties;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 import com.cloud.utils.PropertiesUtil;
-
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.SystemIntegrityChecker;
 import com.cloud.utils.db.ScriptRunner;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 // Creates the CloudStack Database by using the 4.0 schema and apply
 // upgrade steps to it.
@@ -172,7 +172,7 @@ public class DatabaseCreator {
         }
 
         try {
-            Transaction.initDataSource(dbPropsFile);
+            TransactionLegacy.initDataSource(dbPropsFile);
         } catch (NullPointerException e) {
         }
         initDB(dbPropsFile, rootPassword, databases, dryRun);
@@ -187,7 +187,7 @@ public class DatabaseCreator {
             }
 
             System.out.println("========> Processing SQL file at " + sqlScript.getAbsolutePath());
-            Connection conn = Transaction.getStandaloneConnection();
+            Connection conn = TransactionLegacy.getStandaloneConnection();
             try {
                 FileReader reader = null;
                 try {
@@ -207,7 +207,7 @@ public class DatabaseCreator {
             }
         }
 
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
         // Process db upgrade classes
         for (String upgradeClass: upgradeClasses) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java b/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
index 50eb47b..b6e45ec 100755
--- a/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
+++ b/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
@@ -29,12 +29,11 @@ import org.springframework.stereotype.Component;
 
 import com.cloud.maint.Version;
 import com.cloud.upgrade.dao.VersionDao;
-
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.component.ComponentLifecycle;
 import com.cloud.utils.component.SystemIntegrityChecker;
 import com.cloud.utils.db.GlobalLock;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -72,7 +71,7 @@ public class DatabaseIntegrityChecker extends AdapterBase implements SystemInteg
 	}
 	
 	private Boolean checkDuplicateHostWithTheSameLocalStorage() {
-		Transaction txn = Transaction.open("Integrity");
+	    TransactionLegacy txn = TransactionLegacy.open("Integrity");
 		txn.start();
 		try {
 			Connection conn;
@@ -167,7 +166,7 @@ public class DatabaseIntegrityChecker extends AdapterBase implements SystemInteg
 	}
 	
 	private boolean checkMissedPremiumUpgradeFor228() {
-		Transaction txn = Transaction.open("Integrity");
+	    TransactionLegacy txn = TransactionLegacy.open("Integrity");
 		txn.start();
 		try {
 		    String dbVersion = _dao.getCurrentVersion();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
index 85e36a5..2eec648 100755
--- a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
+++ b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
@@ -73,7 +73,7 @@ import com.cloud.upgrade.dao.VersionVO.Step;
 import com.cloud.utils.component.SystemIntegrityChecker;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.ScriptRunner;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Local(value = {SystemIntegrityChecker.class})
@@ -269,7 +269,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
             s_logger.debug("Running upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-"
                     + upgrade.getUpgradableVersionRange()[1]
                     + " to " + upgrade.getUpgradedVersion());
-            Transaction txn = Transaction.open("Upgrade");
+            TransactionLegacy txn = TransactionLegacy.open("Upgrade");
             txn.start();
             try {
                 Connection conn;
@@ -339,7 +339,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
                 VersionVO version = _dao.findByVersion(upgradedVersion, Step.Upgrade);
                 s_logger.debug("Upgrading to version " + upgradedVersion + "...");
 
-                Transaction txn = Transaction.open("Cleanup");
+                TransactionLegacy txn = TransactionLegacy.open("Cleanup");
                 try {
                     if (version != null) {
                         for (DbUpgrade upgrade : versionUpgrades) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
index 6631050..d5cd489 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
@@ -29,7 +29,7 @@ import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.crypt.EncryptionSecretKeyChecker;
 import org.apache.log4j.Logger;
 
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java b/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
index 8c92765..12c99b2 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -79,7 +79,7 @@ public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements V
         try {
             s_logger.debug("Checking to see if the database is at a version before it was the version table is created");
 
-            conn = Transaction.getStandaloneConnection();
+            conn = TransactionLegacy.getStandaloneConnection();
 
             PreparedStatement pstmt = conn.prepareStatement("SHOW TABLES LIKE 'version'");
             ResultSet rs = pstmt.executeQuery();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
index ce6d9e4..e1e843e 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -74,7 +74,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 	@Override
     public void deleteRecordsForAccount(Long accountId) {
 	    String sql = ((accountId == null) ? DELETE_ALL : DELETE_ALL_BY_ACCOUNTID);
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -99,7 +99,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
 	@Override
     public void saveAccounts(List<AccountVO> accounts) {
-	    Transaction txn = Transaction.currentTxn();
+	    TransactionLegacy txn = TransactionLegacy.currentTxn();
 	    try {
 	        txn.start();
 	        String sql = INSERT_ACCOUNT;
@@ -133,7 +133,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
     @Override
     public void updateAccounts(List<AccountVO> accounts) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = UPDATE_ACCOUNT;
@@ -163,7 +163,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
 	@Override
     public void saveUserStats(List<UserStatisticsVO> userStats) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = INSERT_USER_STATS;
@@ -204,7 +204,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
     @Override
     public void updateUserStats(List<UserStatisticsVO> userStats) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = UPDATE_USER_STATS;
@@ -231,7 +231,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
 	@Override
     public Long getLastAccountId() {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_LAST_ACCOUNT;
         try {
@@ -248,7 +248,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
     @Override
     public Long getLastUserStatsId() {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_LAST_USER_STATS;
         try {
@@ -265,7 +265,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
     @Override
     public List<Long> listPublicTemplatesByAccount(long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_PUBLIC_TEMPLATES_BY_ACCOUNTID;
         List<Long> templateList = new ArrayList<Long>();
@@ -284,7 +284,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
        @Override
        public Long getLastVmDiskStatsId() {
-               Transaction txn = Transaction.currentTxn();
+               TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_LAST_VM_DISK_STATS;
         try {
@@ -301,7 +301,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
        @Override
        public void updateVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats) {
-               Transaction txn = Transaction.currentTxn();
+               TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = UPDATE_VM_DISK_STATS;
@@ -335,7 +335,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
        @Override
        public void saveVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats) {
-               Transaction txn = Transaction.currentTxn();
+               TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = INSERT_VM_DISK_STATS;
@@ -381,7 +381,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
 
     @Override
     public void saveUsageRecords(List<UsageVO> usageRecords) {
-       Transaction txn = Transaction.currentTxn();
+       TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = INSERT_USGAE_RECORDS;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
index 9af4a26..0014553 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.usage.UsageIPAddressVO;
 import com.cloud.user.Account;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageIPAddressDao.class})
@@ -56,7 +56,7 @@ public class UsageIPAddressDaoImpl extends GenericDaoBase<UsageIPAddressVO, Long
 	public UsageIPAddressDaoImpl() {}
 
 	public void update(UsageIPAddressVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -92,7 +92,7 @@ public class UsageIPAddressDaoImpl extends GenericDaoBase<UsageIPAddressVO, Long
             sql = GET_ALL_USAGE_RECORDS;
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
index 783300f..5bedfb9 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.usage.UsageJobVO;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -42,7 +42,7 @@ public class UsageJobDaoImpl extends GenericDaoBase<UsageJobVO, Long> implements
 
     @Override
     public long getLastJobSuccessDateMillis() {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         String sql = GET_LAST_JOB_SUCCESS_DATE_MILLIS;
         try {
@@ -61,7 +61,7 @@ public class UsageJobDaoImpl extends GenericDaoBase<UsageJobVO, Long> implements
 
     @Override
     public void updateJobSuccess(Long jobId, long startMillis, long endMillis, long execTime, boolean success) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             txn.start();
 
@@ -115,7 +115,7 @@ public class UsageJobDaoImpl extends GenericDaoBase<UsageJobVO, Long> implements
 
     @Override
     public UsageJobVO isOwner(String hostname, int pid) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             if ((hostname == null) || (pid <= 0)) {
                 return null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
index fa63223..70b1764 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsageLoadBalancerPolicyVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageLoadBalancerPolicyDao.class})
@@ -56,7 +56,7 @@ public class UsageLoadBalancerPolicyDaoImpl extends GenericDaoBase<UsageLoadBala
 	public UsageLoadBalancerPolicyDaoImpl() {}
 
 	public void removeBy(long accountId, long lbId) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -75,7 +75,7 @@ public class UsageLoadBalancerPolicyDaoImpl extends GenericDaoBase<UsageLoadBala
 	}
 
 	public void update(UsageLoadBalancerPolicyVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -119,7 +119,7 @@ public class UsageLoadBalancerPolicyDaoImpl extends GenericDaoBase<UsageLoadBala
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
index af8083a..59ba1c4 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
 
 import com.cloud.usage.UsageNetworkVO;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -50,7 +50,7 @@ public class UsageNetworkDaoImpl extends GenericDaoBase<UsageNetworkVO, Long> im
 
 	@Override
 	public Map<String, UsageNetworkVO> getRecentNetworkStats() {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         String sql = SELECT_LATEST_STATS;
         PreparedStatement pstmt = null;
         try {
@@ -85,7 +85,7 @@ public class UsageNetworkDaoImpl extends GenericDaoBase<UsageNetworkVO, Long> im
 
     @Override
 	public void deleteOldStats(long maxEventTime) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         String sql = DELETE_OLD_STATS;
         PreparedStatement pstmt = null;
         try {
@@ -102,7 +102,7 @@ public class UsageNetworkDaoImpl extends GenericDaoBase<UsageNetworkVO, Long> im
 
     @Override
     public void saveUsageNetworks (List<UsageNetworkVO> usageNetworks) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = INSERT_USAGE_NETWORK;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
index 4ed7c27..6fb03e7 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsageNetworkOfferingVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageNetworkOfferingDao.class})
@@ -55,7 +55,7 @@ public class UsageNetworkOfferingDaoImpl extends GenericDaoBase<UsageNetworkOffe
 	public UsageNetworkOfferingDaoImpl() {}
 
 	public void update(UsageNetworkOfferingVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -100,7 +100,7 @@ public class UsageNetworkOfferingDaoImpl extends GenericDaoBase<UsageNetworkOffe
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
index 2afc50a..0f2ac0d 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsagePortForwardingRuleVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsagePortForwardingRuleDao.class})
@@ -56,7 +56,7 @@ public class UsagePortForwardingRuleDaoImpl extends GenericDaoBase<UsagePortForw
 	public UsagePortForwardingRuleDaoImpl() {}
 
 	public void removeBy(long accountId, long pfId) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -75,7 +75,7 @@ public class UsagePortForwardingRuleDaoImpl extends GenericDaoBase<UsagePortForw
 	}
 
 	public void update(UsagePortForwardingRuleVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -119,7 +119,7 @@ public class UsagePortForwardingRuleDaoImpl extends GenericDaoBase<UsagePortForw
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
index 7564bf0..78ee857 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsageSecurityGroupVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageSecurityGroupDao.class})
@@ -55,7 +55,7 @@ public class UsageSecurityGroupDaoImpl extends GenericDaoBase<UsageSecurityGroup
 	public UsageSecurityGroupDaoImpl() {}
 
 	public void update(UsageSecurityGroupVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -100,7 +100,7 @@ public class UsageSecurityGroupDaoImpl extends GenericDaoBase<UsageSecurityGroup
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
index 8f18adc..f9ee2e6 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageStorageDao.class})
@@ -93,7 +93,7 @@ public class UsageStorageDaoImpl extends GenericDaoBase<UsageStorageVO, Long> im
     }
 	
 	public void removeBy(long accountId, long volId, int storage_type) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -113,7 +113,7 @@ public class UsageStorageDaoImpl extends GenericDaoBase<UsageStorageVO, Long> im
 	}
 
 	public void update(UsageStorageVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -158,7 +158,7 @@ public class UsageStorageDaoImpl extends GenericDaoBase<UsageStorageVO, Long> im
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
index fc82754..ef31390 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsageVMInstanceVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageVMInstanceDao.class})
@@ -51,7 +51,7 @@ public class UsageVMInstanceDaoImpl extends GenericDaoBase<UsageVMInstanceVO, Lo
 	public UsageVMInstanceDaoImpl() {}
 
     public void update(UsageVMInstanceVO instance) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -71,7 +71,7 @@ public class UsageVMInstanceDaoImpl extends GenericDaoBase<UsageVMInstanceVO, Lo
     }
 
     public void delete(UsageVMInstanceVO instance) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -91,7 +91,7 @@ public class UsageVMInstanceDaoImpl extends GenericDaoBase<UsageVMInstanceVO, Lo
     }
 
     public List<UsageVMInstanceVO> getUsageRecords(long accountId, Date startDate, Date endDate) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
         List<UsageVMInstanceVO> usageInstances = new ArrayList<UsageVMInstanceVO>();
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
index 9f98bbf..b9f5f8c 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
@@ -20,7 +20,7 @@ package com.cloud.usage.dao;
 import com.cloud.usage.UsageVMSnapshotVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -51,7 +51,7 @@ public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Lo
             "ORDER BY created desc limit 1";
     
     public void update(UsageVMSnapshotVO usage) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
         try {
             txn.start();
@@ -76,7 +76,7 @@ public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Lo
         List<UsageVMSnapshotVO> usageRecords = new ArrayList<UsageVMSnapshotVO>();
 
         String sql = GET_USAGE_RECORDS_BY_ACCOUNT;
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {
@@ -130,7 +130,7 @@ public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Lo
         List<UsageVMSnapshotVO> usageRecords = new ArrayList<UsageVMSnapshotVO>();
 
         String sql = PREVIOUS_QUERY;
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
         try {
             int i = 1;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
index d6bf13b..d8d1455 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsageVPNUserVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageVPNUserDao.class})
@@ -55,7 +55,7 @@ public class UsageVPNUserDaoImpl extends GenericDaoBase<UsageVPNUserVO, Long> im
 	public UsageVPNUserDaoImpl() {}
 
 	public void update(UsageVPNUserVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -99,7 +99,7 @@ public class UsageVPNUserDaoImpl extends GenericDaoBase<UsageVPNUserVO, Long> im
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
index 8436c59..d2cb673 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
 
 import com.cloud.usage.UsageVmDiskVO;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -51,7 +51,7 @@ public class UsageVmDiskDaoImpl extends GenericDaoBase<UsageVmDiskVO, Long> impl
 
 	@Override
 	public Map<String, UsageVmDiskVO> getRecentVmDiskStats() {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         String sql = SELECT_LATEST_STATS;
         PreparedStatement pstmt = null;
         try {
@@ -89,7 +89,7 @@ public class UsageVmDiskDaoImpl extends GenericDaoBase<UsageVmDiskVO, Long> impl
 
     @Override
 	public void deleteOldStats(long maxEventTime) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         String sql = DELETE_OLD_STATS;
         PreparedStatement pstmt = null;
         try {
@@ -106,7 +106,7 @@ public class UsageVmDiskDaoImpl extends GenericDaoBase<UsageVmDiskVO, Long> impl
     
     @Override
     public void saveUsageVmDisks(List<UsageVmDiskVO> usageVmDisks) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             txn.start();
             String sql = INSERT_USAGE_VM_DISK;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
index 039d8f4..8bf95b6 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.usage.UsageVolumeVO;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UsageVolumeDao.class})
@@ -56,7 +56,7 @@ public class UsageVolumeDaoImpl extends GenericDaoBase<UsageVolumeVO, Long> impl
 	public UsageVolumeDaoImpl() {}
 
 	public void removeBy(long accountId, long volId) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -75,7 +75,7 @@ public class UsageVolumeDaoImpl extends GenericDaoBase<UsageVolumeVO, Long> impl
 	}
 
 	public void update(UsageVolumeVO usage) {
-	    Transaction txn = Transaction.open(Transaction.USAGE_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
 		PreparedStatement pstmt = null;
 		try {
 		    txn.start();
@@ -119,7 +119,7 @@ public class UsageVolumeDaoImpl extends GenericDaoBase<UsageVolumeVO, Long> impl
             sql += " LIMIT " + startIndex + ",500";
         }
 
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         PreparedStatement pstmt = null;
 
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java b/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
index 30bbe73..9bdaff6 100755
--- a/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value = {AccountDetailsDao.class})
 public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long> implements AccountDetailsDao, ScopedConfigStorage {
@@ -57,7 +57,7 @@ public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long>
 
     @Override
     public void persist(long accountId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<AccountDetailVO> sc = accountSearch.create();
         sc.setParameters("accountId", accountId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
index 41f1f73..91226e7 100755
--- a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
@@ -39,7 +39,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={AccountDao.class})
@@ -124,7 +124,7 @@ public class AccountDaoImpl extends GenericDaoBase<AccountVO, Long> implements A
     
     @Override
     public Pair<User, Account> findUserAccountByApiKey(String apiKey) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         Pair<User, Account> userAcctPair = null;
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java b/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
index 4a1a51c..ae21dfe 100644
--- a/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UserStatisticsDao.class})
@@ -100,7 +100,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase<UserStatisticsVO, Long
         List<UserStatisticsVO> userStats = new ArrayList<UserStatisticsVO>();
         if (minRemovedDate == null) return userStats;
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             String sql = ACTIVE_AND_RECENTLY_DELETED_SEARCH + " LIMIT " + startIndex + "," + limit;
             PreparedStatement pstmt = null;
@@ -120,7 +120,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase<UserStatisticsVO, Long
     public List<UserStatisticsVO> listUpdatedStats() {
         List<UserStatisticsVO> userStats = new ArrayList<UserStatisticsVO>();
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement pstmt = null;
             pstmt = txn.prepareAutoCloseStatement(UPDATED_STATS_SEARCH);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java b/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
index 02f3406..2a3d132 100644
--- a/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.DateUtil;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={VmDiskStatisticsDao.class})
@@ -97,7 +97,7 @@ public class VmDiskStatisticsDaoImpl extends GenericDaoBase<VmDiskStatisticsVO,
         List<VmDiskStatisticsVO> vmDiskStats = new ArrayList<VmDiskStatisticsVO>();
         if (minRemovedDate == null) return vmDiskStats;
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             String sql = ACTIVE_AND_RECENTLY_DELETED_SEARCH + " LIMIT " + startIndex + "," + limit;
             PreparedStatement pstmt = null;
@@ -117,7 +117,7 @@ public class VmDiskStatisticsDaoImpl extends GenericDaoBase<VmDiskStatisticsVO,
     public List<VmDiskStatisticsVO> listUpdatedStats() {
         List<VmDiskStatisticsVO> vmDiskStats = new ArrayList<VmDiskStatisticsVO>();
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement pstmt = null;
             pstmt = txn.prepareAutoCloseStatement(UPDATED_VM_NETWORK_STATS_SEARCH);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
index 9af371e..4238f6a 100644
--- a/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.utils.db.Attribute;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.vm.ConsoleProxyVO;
 import com.cloud.vm.VirtualMachine.State;
@@ -162,7 +162,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         ConsoleProxyVO proxy = createForUpdate();
         proxy.setPublicIpAddress(null);
@@ -227,7 +227,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     public List<Pair<Long, Integer>> getProxyLoadMatrix() {
     	ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
     	
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(PROXY_ASSIGNMENT_MATRIX);
@@ -245,7 +245,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean countAllPoolTypes) {
     	ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
     	
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
         	if(countAllPoolTypes) {
@@ -267,7 +267,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     
     @Override
     public int getProxyStaticLoad(long proxyVmId) {
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(GET_PROXY_LOAD);
@@ -285,7 +285,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     
     @Override
     public int getProxyActiveLoad(long proxyVmId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(GET_PROXY_ACTIVE_LOAD);
@@ -304,7 +304,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     private List<ConsoleProxyLoadInfo> getDatacenterLoadMatrix(String sql) {
     	ArrayList<ConsoleProxyLoadInfo> l = new ArrayList<ConsoleProxyLoadInfo>();
     	
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql);
@@ -325,7 +325,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
     @Override
     public List<Long> getRunningProxyListByMsid(long msid) {
     	List<Long> l = new ArrayList<Long>();
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
index 65b9d3b..7676e2d 100755
--- a/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
@@ -47,7 +47,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.VirtualMachine;
@@ -143,7 +143,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         DomainRouterVO router = createForUpdate();
         router.setPublicIpAddress(null);
@@ -307,7 +307,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
     @Override
     @DB
     public DomainRouterVO persist(DomainRouterVO router, List<Network> guestNetworks) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         // 1) create network
@@ -330,7 +330,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
         if (_routerNetworkDao.findByRouterAndNetwork(router.getId(), guestNetwork.getId()) == null) {
             NetworkOffering off = _offDao.findById(guestNetwork.getNetworkOfferingId());
             if (!(off.getName().equalsIgnoreCase(NetworkOffering.SystemPrivateGatewayNetworkOffering))) {
-                Transaction txn = Transaction.currentTxn();
+                TransactionLegacy txn = TransactionLegacy.currentTxn();
                 txn.start();
                 //1) add router to network
                 RouterNetworkVO routerNtwkMap = new RouterNetworkVO(router.getId(), guestNetwork.getId(), guestNetwork.getGuestType());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
index 67bc0b5..033acca 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
@@ -19,7 +19,7 @@ package com.cloud.vm.dao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.vm.NicDetailVO;
 import org.springframework.stereotype.Component;
 
@@ -75,7 +75,7 @@ public class NicDetailDaoImpl extends GenericDaoBase<NicDetailVO, Long> implemen
 
     @Override
     public void persist(long nicId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<NicDetailVO> sc = NicSearch.create();
         sc.setParameters("nicId", nicId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
index f802a90..2fcc3e7 100644
--- a/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.Attribute;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.vm.SecondaryStorageVm;
 import com.cloud.vm.SecondaryStorageVmVO;
@@ -105,7 +105,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
     
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SecondaryStorageVmVO proxy = createForUpdate();
         proxy.setPublicIpAddress(null);
@@ -167,7 +167,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
     @Override
     public List<Long> getRunningSecStorageVmListByMsid(SecondaryStorageVm.Role role, long msid) {
     	List<Long> l = new ArrayList<Long>();
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
         	String sql;
@@ -237,7 +237,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
     public List<Long> listRunningSecStorageOrderByLoad(SecondaryStorageVm.Role role, long zoneId) {
     	
     	List<Long> l = new ArrayList<Long>();
-        Transaction txn = Transaction.currentTxn();;
+        TransactionLegacy txn = TransactionLegacy.currentTxn();;
         PreparedStatement pstmt = null;
         try {
         	String sql;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
index 8afce09..9cef0ae 100755
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
@@ -46,7 +46,7 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.UserVmVO;
@@ -350,7 +350,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
 
     @Override
     public List<Long> listPodIdsHavingVmsforAccount(long zoneId, long accountId){
-	Transaction txn = Transaction.currentTxn();
+	TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
 
@@ -374,7 +374,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
 
     @Override
     public Hashtable<Long, UserVmData> listVmDetails(Hashtable<Long, UserVmData> userVmDataHash){
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
 
         try {
@@ -575,7 +575,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         _tagsDao.removeByIdAndType(id, TaggedResourceType.UserVm);
         boolean result = super.remove(id);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index ce8dbd8..77f1418 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -28,7 +28,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.vm.UserVmDetailVO;
 
 @Component
@@ -93,7 +93,7 @@ public class UserVmDetailsDaoImpl extends GenericDaoBase<UserVmDetailVO, Long> i
 
 	@Override
 	public void persist(long vmId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<UserVmDetailVO> sc = VmSearch.create();
         sc.setParameters("vmId", vmId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index cf8e0a8..301944b 100644
--- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -48,7 +48,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.NicVO;
@@ -484,7 +484,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
 
     @Override
     public Pair<List<Long>, Map<Long, Double>> listClusterIdsInZoneByVmCount(long zoneId, long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         Map<Long, Double> clusterVmCountMap = new HashMap<Long, Double>();
@@ -513,7 +513,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
 
     @Override
     public Pair<List<Long>, Map<Long, Double>> listClusterIdsInPodByVmCount(long podId, long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         Map<Long, Double> clusterVmCountMap = new HashMap<Long, Double>();
@@ -543,7 +543,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
 
     @Override
     public Pair<List<Long>, Map<Long, Double>> listPodIdsInZoneByVmCount(long dataCenterId, long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         Map<Long, Double> podVmCountMap = new HashMap<Long, Double>();
@@ -569,7 +569,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
 
     @Override
     public List<Long> listHostIdsByVmCount(long dcId, Long podId, Long clusterId, long accountId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         List<Long> result = new ArrayList<Long>();
         try {
@@ -654,7 +654,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
     @Override
     @DB
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         VMInstanceVO vm = findById(id);
         if (vm != null && vm.getType() == Type.User) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
index ad8f4f0..c2d48d4 100644
--- a/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Local(value = { AffinityGroupVMMapDao.class })
 public class AffinityGroupVMMapDaoImpl extends GenericDaoBase<AffinityGroupVMMapVO, Long> implements
@@ -160,7 +160,7 @@ public class AffinityGroupVMMapDaoImpl extends GenericDaoBase<AffinityGroupVMMap
 
     @Override
     public void updateMap(Long vmId, List<Long> affinityGroupIds) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         SearchCriteria<AffinityGroupVMMapVO> sc = createSearchCriteria();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
index 6f70b35..54a557b 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { VMComputeTagDao.class })
@@ -52,7 +52,7 @@ public class VMComputeTagDaoImpl extends GenericDaoBase<VMComputeTagVO, Long> im
 
     @Override
     public void persist(long vmId, List<String> computeTags) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<VMComputeTagVO> sc = VmIdSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
index 3082d21..fa2ce81 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
@@ -37,7 +37,7 @@ import com.cloud.network.dao.NetworkVO;
 import com.cloud.utils.Pair;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.vm.NicProfile;
 
 
@@ -78,7 +78,7 @@ public class VMEntityDaoImpl extends GenericDaoBase<VMEntityVO, Long> implements
     @Override
     @DB
     public VMEntityVO persist(VMEntityVO vm) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         VMEntityVO dbVO = super.persist(vm);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
index 0f2c4cc..f86e788 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.network.dao.NetworkDao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { VMNetworkMapDao.class })
@@ -52,7 +52,7 @@ public class VMNetworkMapDaoImpl extends GenericDaoBase<VMNetworkMapVO, Long> im
 
     @Override
     public void persist(long vmId, List<Long> networks) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<VMNetworkMapVO> sc = VmIdSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
index 73b4dd2..31ed5b8 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { VMReservationDao.class })
@@ -80,7 +80,7 @@ public class VMReservationDaoImpl extends GenericDaoBase<VMReservationVO, Long>
     @Override
     @DB
     public VMReservationVO persist(VMReservationVO reservation) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
 
         VMReservationVO dbVO = super.persist(reservation);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
index be194bb..cd06b20 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { VMRootDiskTagDao.class })
@@ -52,7 +52,7 @@ public class VMRootDiskTagDaoImpl extends GenericDaoBase<VMRootDiskTagVO, Long>
 
     @Override
     public void persist(long vmId, List<String> rootDiskTags) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         txn.start();
         SearchCriteria<VMRootDiskTagVO> sc = VmIdSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
index 9e2bb36..8ed84ef 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Local(value = { PrimaryDataStoreDao.class })
@@ -226,7 +226,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
     @Override
     @DB
     public StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         pool = super.persist(pool);
         if (details != null) {
@@ -254,7 +254,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
         }
         sql.delete(sql.length() - 4, sql.length());
         sql.append(DetailsSqlSuffix);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql.toString());
@@ -331,7 +331,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
             }
             sql.delete(sql.length() - 4, sql.length());
             sql.append(ZoneWideDetailsSqlSuffix);
-            Transaction txn = Transaction.currentTxn();
+            TransactionLegacy txn = TransactionLegacy.currentTxn();
             PreparedStatement pstmt = null;
             try {
                 pstmt = txn.prepareAutoCloseStatement(sql.toString());
@@ -357,7 +357,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
 
         StringBuilder sql = new StringBuilder(FindPoolTagDetails);
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         try {
             pstmt = txn.prepareAutoCloseStatement(sql.toString());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index e7c6627..196b08b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -47,6 +47,7 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -110,7 +111,7 @@ public class DefaultEndPointSelector implements EndPointSelector {
         PreparedStatement pstmt = null;
         ResultSet rs = null;
         HostVO host = null;
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
 
         try {
             pstmt = txn.prepareStatement(sql);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
index ad52042..3c766cf 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = ImageStoreDetailsDao.class)
@@ -46,7 +46,7 @@ public class ImageStoreDetailsDaoImpl extends GenericDaoBase<ImageStoreDetailVO,
 
     @Override
     public void update(long storeId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         SearchCriteria<ImageStoreDetailVO> sc = storeSearch.create();
         sc.setParameters("store", storeId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index d828085..48416a2 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.storage.DataStoreRole;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.UpdateBuilder;
 
@@ -164,7 +164,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
         SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
         sc.setParameters("store_id", id);
         sc.setParameters("store_role", role);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         remove(sc);
         txn.commit();
@@ -182,7 +182,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     @Override
     @DB
     public SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long volumeId) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         ResultSet rs = null;
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 5f47de8..4509e23 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -43,7 +43,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 
 @Component
@@ -202,7 +202,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     public void deletePrimaryRecordsForStore(long id) {
         SearchCriteria<TemplateDataStoreVO> sc = storeSearch.create();
         sc.setParameters("store_id", id);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         remove(sc);
         txn.commit();
@@ -212,7 +212,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     public void deletePrimaryRecordsForTemplate(long templateId) {
         SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
         sc.setParameters("template_id", templateId);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         expunge(sc);
         txn.commit();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 04f8b70..2bacd03 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.UpdateBuilder;
 
@@ -143,7 +143,7 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
     public void deletePrimaryRecordsForStore(long id) {
         SearchCriteria<VolumeDataStoreVO> sc = storeSearch.create();
         sc.setParameters("store_id", id);
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         remove(sc);
         txn.commit();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
index 4ea4cee..90ad17a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
@@ -43,7 +43,7 @@ import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePoolHostVO;
 import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.dao.StoragePoolHostDao;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -181,7 +181,7 @@ public class PrimaryDataStoreHelper {
     public boolean deletePrimaryDataStore(DataStore store) {
         List<StoragePoolHostVO> hostPoolRecords = this.storagePoolHostDao.listByPoolId(store.getId());
         StoragePoolVO poolVO = this.dataStoreDao.findById(store.getId());
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         for (StoragePoolHostVO host : hostPoolRecords) {
             storagePoolHostDao.deleteStoragePoolHostDetails(host.getHostId(), host.getPoolId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
index 9d17434..be741da 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 public class PrimaryDataStoreDetailsDaoImpl extends GenericDaoBase<PrimaryDataStoreDetailVO, Long> implements
@@ -45,7 +45,7 @@ public class PrimaryDataStoreDetailsDaoImpl extends GenericDaoBase<PrimaryDataSt
 
     @Override
     public void update(long poolId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         SearchCriteria<PrimaryDataStoreDetailVO> sc = PoolSearch.create();
         sc.setParameters("pool", poolId);
 


[11/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java b/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
index 00dd25c..cd3532e 100644
--- a/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
@@ -81,8 +81,9 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.exception.ExecutionException;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.dao.DomainRouterDao;
@@ -288,12 +289,19 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
                 newCurrentBytesReceived += bytesSentAndReceived[1];
             }
 
-            UserStatisticsVO userStats;
-            final Transaction txn = Transaction.currentTxn();
-            try {
-                txn.start();
-                userStats = _userStatsDao.lock(accountId, zone.getId(), networkId, publicIp, externalLoadBalancer.getId(), externalLoadBalancer.getType().toString());
+            commitStats(networkId, externalLoadBalancer, accountId, publicIp, zone, statsEntryIdentifier,
+                    newCurrentBytesSent, newCurrentBytesReceived);
+        }
+    }
 
+    private void commitStats(final long networkId, final HostVO externalLoadBalancer, final long accountId, final String publicIp,
+            final DataCenterVO zone, final String statsEntryIdentifier, final long newCurrentBytesSent, final long newCurrentBytesReceived) {
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                UserStatisticsVO userStats;
+                userStats = _userStatsDao.lock(accountId, zone.getId(), networkId, publicIp, externalLoadBalancer.getId(), externalLoadBalancer.getType().toString());
+        
                 if (userStats != null) {
                     long oldNetBytesSent = userStats.getNetBytesSent();
                     long oldNetBytesReceived = userStats.getNetBytesReceived();
@@ -301,19 +309,19 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
                     long oldCurrentBytesReceived = userStats.getCurrentBytesReceived();
                     String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId()
                             + ", account ID: " + userStats.getAccountId() + ".";
-
+        
                     userStats.setCurrentBytesSent(newCurrentBytesSent);
                     if (oldCurrentBytesSent > newCurrentBytesSent) {
                         s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + ".");
                         userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent);
                     }
-
+        
                     userStats.setCurrentBytesReceived(newCurrentBytesReceived);
                     if (oldCurrentBytesReceived > newCurrentBytesReceived) {
                         s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + ".");
                         userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived);
                     }
-
+        
                     if (_userStatsDao.update(userStats.getId(), userStats)) {
                         s_logger.debug("Successfully updated stats for " + statsEntryIdentifier);
                     } else {
@@ -322,13 +330,8 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
                 } else {
                     s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier);
                 }
-
-                txn.commit();
-            } catch (final Exception e) {
-                txn.rollback();
-                throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e);
             }
-        }
+        });
     }
 
     protected class ExternalDeviceNetworkUsageTask extends ManagedContextRunnable {
@@ -601,78 +604,78 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
          * Stats entries are created for source NAT IP addresses, static NAT rules, port forwarding rules, and load
          * balancing rules
          */
-        private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network,
-                HostVO externalFirewall, ExternalNetworkResourceUsageAnswer firewallAnswer,
-                HostVO externalLoadBalancer, ExternalNetworkResourceUsageAnswer lbAnswer) {
-            String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId;
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        private boolean manageStatsEntries(final boolean create, final long accountId, final long zoneId, final Network network,
+                final HostVO externalFirewall, final ExternalNetworkResourceUsageAnswer firewallAnswer,
+                final HostVO externalLoadBalancer, final ExternalNetworkResourceUsageAnswer lbAnswer) {
+            final String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId;
             try {
-                txn.start();
-                String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId();
-
-                boolean sharedSourceNat = false;
-                Map<Network.Capability, String> sourceNatCapabilities = _networkModel.getNetworkServiceCapabilities(network.getId(), Network.Service.SourceNat);
-                if (sourceNatCapabilities != null) {
-                    String supportedSourceNatTypes = sourceNatCapabilities.get(Network.Capability.SupportedSourceNatTypes).toLowerCase();
-                    if (supportedSourceNatTypes.contains("zone")) {
-                        sharedSourceNat = true;
-                    }
-                }
-
-                if (externalFirewall != null && firewallAnswer != null) {
-                    if (!sharedSourceNat) {
-                        // Manage the entry for this network's source NAT IP address
-                        List<IPAddressVO> sourceNatIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
-                        if (sourceNatIps.size() == 1) {
-                            String publicIp = sourceNatIps.get(0).getAddress().addr();
-                            if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
-                                throw new ExecutionException(networkErrorMsg + ", source NAT IP = " + publicIp);
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId();
+        
+                        boolean sharedSourceNat = false;
+                        Map<Network.Capability, String> sourceNatCapabilities = _networkModel.getNetworkServiceCapabilities(network.getId(), Network.Service.SourceNat);
+                        if (sourceNatCapabilities != null) {
+                            String supportedSourceNatTypes = sourceNatCapabilities.get(Network.Capability.SupportedSourceNatTypes).toLowerCase();
+                            if (supportedSourceNatTypes.contains("zone")) {
+                                sharedSourceNat = true;
                             }
                         }
-
-                        // Manage one entry for each static NAT rule in this network
-                        List<IPAddressVO> staticNatIps = _ipAddressDao.listStaticNatPublicIps(network.getId());
-                        for (IPAddressVO staticNatIp : staticNatIps) {
-                            String publicIp = staticNatIp.getAddress().addr();
-                            if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
-                                throw new ExecutionException(networkErrorMsg + ", static NAT rule public IP = " + publicIp);
+        
+                        if (externalFirewall != null && firewallAnswer != null) {
+                            if (!sharedSourceNat) {
+                                // Manage the entry for this network's source NAT IP address
+                                List<IPAddressVO> sourceNatIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
+                                if (sourceNatIps.size() == 1) {
+                                    String publicIp = sourceNatIps.get(0).getAddress().addr();
+                                    if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
+                                        throw new CloudRuntimeException(networkErrorMsg + ", source NAT IP = " + publicIp);
+                                    }
+                                }
+        
+                                // Manage one entry for each static NAT rule in this network
+                                List<IPAddressVO> staticNatIps = _ipAddressDao.listStaticNatPublicIps(network.getId());
+                                for (IPAddressVO staticNatIp : staticNatIps) {
+                                    String publicIp = staticNatIp.getAddress().addr();
+                                    if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
+                                        throw new CloudRuntimeException(networkErrorMsg + ", static NAT rule public IP = " + publicIp);
+                                    }
+                                }
+        
+                                // Manage one entry for each port forwarding rule in this network
+                                List<PortForwardingRuleVO> portForwardingRules = _portForwardingRulesDao.listByNetwork(network.getId());
+                                for (PortForwardingRuleVO portForwardingRule : portForwardingRules) {
+                                    String publicIp = _networkModel.getIp(portForwardingRule.getSourceIpAddressId()).getAddress().addr();
+                                    if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
+                                        throw new CloudRuntimeException(networkErrorMsg + ", port forwarding rule public IP = " + publicIp);
+                                    }
+                                }
+                            } else {
+                                // Manage the account-wide entry for the external firewall
+                                if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), null, externalFirewall.getId(), firewallAnswer, false)) {
+                                    throw new CloudRuntimeException(networkErrorMsg);
+                                }
                             }
                         }
-
-                        // Manage one entry for each port forwarding rule in this network
-                        List<PortForwardingRuleVO> portForwardingRules = _portForwardingRulesDao.listByNetwork(network.getId());
-                        for (PortForwardingRuleVO portForwardingRule : portForwardingRules) {
-                            String publicIp = _networkModel.getIp(portForwardingRule.getSourceIpAddressId()).getAddress().addr();
-                            if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
-                                throw new ExecutionException(networkErrorMsg + ", port forwarding rule public IP = " + publicIp);
+        
+                        // If an external load balancer is added, manage one entry for each load balancing rule in this network
+                        if (externalLoadBalancer != null && lbAnswer != null) {
+                            boolean inline = _networkModel.isNetworkInlineMode(network);
+                            List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
+                            for (LoadBalancerVO loadBalancer : loadBalancers) {
+                                String publicIp = _networkModel.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr();
+                                if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer, inline)) {
+                                    throw new CloudRuntimeException(networkErrorMsg + ", load balancing rule public IP = " + publicIp);
+                                }
                             }
                         }
-                    } else {
-                        // Manage the account-wide entry for the external firewall
-                        if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), null, externalFirewall.getId(), firewallAnswer, false)) {
-                            throw new ExecutionException(networkErrorMsg);
-                        }
-                    }
-                }
-
-                // If an external load balancer is added, manage one entry for each load balancing rule in this network
-                if (externalLoadBalancer != null && lbAnswer != null) {
-                    boolean inline = _networkModel.isNetworkInlineMode(network);
-                    List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
-                    for (LoadBalancerVO loadBalancer : loadBalancers) {
-                        String publicIp = _networkModel.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr();
-                        if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer, inline)) {
-                            throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp);
-                        }
                     }
-                }
-                return txn.commit();
+                });
+                return true;
             } catch (Exception e) {
                 s_logger.warn("Exception: ", e);
-                txn.rollback();
                 return false;
-            } finally {
-                txn.close();
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
index 629bef5..32744ef 100644
--- a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.response.ExternalFirewallResponse;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -108,6 +107,8 @@ import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.net.UrlUtil;
@@ -159,7 +160,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
 
     @Override
     @DB
-    public ExternalFirewallDeviceVO addExternalFirewall(long physicalNetworkId, String url, String username, String password, String deviceName, ServerResource resource) {
+    public ExternalFirewallDeviceVO addExternalFirewall(long physicalNetworkId, String url, String username, String password, final String deviceName, ServerResource resource) {
         String guid;
         PhysicalNetworkVO pNetwork = null;
         NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
@@ -176,7 +177,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
         }
         zoneId = pNetwork.getDataCenterId();
 
-        PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder());
+        final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder());
         if (ntwkSvcProvider == null ) {
             throw new CloudRuntimeException("Network Service Provider: " + ntwkDevice.getNetworkServiceProvder() +
                     " is not enabled in the physical network: " + physicalNetworkId + "to add this device" );
@@ -204,7 +205,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
         hostDetails.put("username", username);
         hostDetails.put("password", password);
         hostDetails.put("deviceName", deviceName);
-        Map<String, String> configParams = new HashMap<String, String>();
+        final Map<String, String> configParams = new HashMap<String, String>();
         UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams);
         hostDetails.putAll(configParams);
 
@@ -215,27 +216,29 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
             throw new CloudRuntimeException(e.getMessage());
         }
 
-        Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
+        final Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
         if (externalFirewall != null) {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-
-            boolean dedicatedUse = (configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED)) : false;
-            long capacity =  NumbersUtil.parseLong(configParams.get(ApiConstants.FIREWALL_DEVICE_CAPACITY), 0);
-            if (capacity == 0) {
-                capacity = _defaultFwCapacity;
-            }
+            final PhysicalNetworkVO pNetworkFinal = pNetwork; 
+            return Transaction.execute(new TransactionCallback<ExternalFirewallDeviceVO>() {
+                @Override
+                public ExternalFirewallDeviceVO doInTransaction(TransactionStatus status) {
+                    boolean dedicatedUse = (configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED)) : false;
+                    long capacity =  NumbersUtil.parseLong(configParams.get(ApiConstants.FIREWALL_DEVICE_CAPACITY), 0);
+                    if (capacity == 0) {
+                        capacity = _defaultFwCapacity;
+                    }
 
-            ExternalFirewallDeviceVO fwDevice = new ExternalFirewallDeviceVO(externalFirewall.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(),
-                    deviceName, capacity, dedicatedUse);
+                    ExternalFirewallDeviceVO fwDevice = new ExternalFirewallDeviceVO(externalFirewall.getId(), pNetworkFinal.getId(), ntwkSvcProvider.getProviderName(),
+                            deviceName, capacity, dedicatedUse);
 
-            _externalFirewallDeviceDao.persist(fwDevice);
+                    _externalFirewallDeviceDao.persist(fwDevice);
 
-            DetailVO hostDetail = new DetailVO(externalFirewall.getId(), ApiConstants.FIREWALL_DEVICE_ID, String.valueOf(fwDevice.getId()));
-            _hostDetailDao.persist(hostDetail);
+                    DetailVO hostDetail = new DetailVO(externalFirewall.getId(), ApiConstants.FIREWALL_DEVICE_ID, String.valueOf(fwDevice.getId()));
+                    _hostDetailDao.persist(hostDetail);
 
-            txn.commit();
-            return fwDevice;
+                    return fwDevice;
+                }
+            });
         } else {
             return null;
         }
@@ -343,7 +346,6 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
 
     @DB
     protected boolean freeFirewallForNetwork(Network network) {
-        Transaction txn = Transaction.currentTxn();
         GlobalLock deviceMapLock = GlobalLock.getInternLock("NetworkFirewallDeviceMap");
         try {
             if (deviceMapLock.lock(120)) {
@@ -353,7 +355,6 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
                         _networkExternalFirewallDao.remove(fwDeviceForNetwork.getId());
                     }
                 } catch (Exception exception) {
-                    txn.rollback();
                     s_logger.error("Failed to release firewall device for the network" + network.getId() + " due to " + exception.getMessage());
                     return false;
                 } finally {
@@ -363,7 +364,6 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
         } finally {
             deviceMapLock.releaseRef();
         }
-        txn.commit();
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
index dd48930..59df3e8 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -27,7 +27,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -118,6 +117,9 @@ import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.net.UrlUtil;
@@ -196,11 +198,11 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     @Override
     @DB
     public ExternalLoadBalancerDeviceVO addExternalLoadBalancer(long physicalNetworkId, String url,
-            String username, String password, String deviceName, ServerResource resource, boolean gslbProvider,
-            String gslbSitePublicIp, String gslbSitePrivateIp) {
+            String username, String password, final String deviceName, ServerResource resource, final boolean gslbProvider,
+            final String gslbSitePublicIp, final String gslbSitePrivateIp) {
 
         PhysicalNetworkVO pNetwork = null;
-        NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
+        final NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
         long zoneId;
 
         if ((ntwkDevice == null) || (url == null) || (username == null) || (resource == null) || (password == null)) {
@@ -258,39 +260,41 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
         UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams);
         hostDetails.putAll(configParams);
 
-        Transaction txn = Transaction.currentTxn();
         try {
             resource.configure(hostName, hostDetails);
 
-            Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
+            final Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
             if (host != null) {
 
-                boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams
+                final boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams
                         .get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false;
                 long capacity = NumbersUtil.parseLong(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_CAPACITY), 0);
                 if (capacity == 0) {
                     capacity = _defaultLbCapacity;
                 }
 
-                ExternalLoadBalancerDeviceVO lbDeviceVO;
-                txn.start();
-                lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkDevice.getNetworkServiceProvder(),
-                        deviceName, capacity, dedicatedUse, gslbProvider);
-                if (gslbProvider) {
-                    lbDeviceVO.setGslbSitePublicIP(gslbSitePublicIp);
-                    lbDeviceVO.setGslbSitePrivateIP(gslbSitePrivateIp);
-                }
-                _externalLoadBalancerDeviceDao.persist(lbDeviceVO);
-                DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId()));
-                _hostDetailDao.persist(hostDetail);
+                final long capacityFinal = capacity;
+                final PhysicalNetworkVO pNetworkFinal = pNetwork;
+                return Transaction.execute(new TransactionCallback<ExternalLoadBalancerDeviceVO>() {
+                    @Override
+                    public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) {
+                        ExternalLoadBalancerDeviceVO lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetworkFinal.getId(), ntwkDevice.getNetworkServiceProvder(),
+                                deviceName, capacityFinal, dedicatedUse, gslbProvider);
+                        if (gslbProvider) {
+                            lbDeviceVO.setGslbSitePublicIP(gslbSitePublicIp);
+                            lbDeviceVO.setGslbSitePrivateIP(gslbSitePrivateIp);
+                        }
+                        _externalLoadBalancerDeviceDao.persist(lbDeviceVO);
+                        DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId()));
+                        _hostDetailDao.persist(hostDetail);
 
-                txn.commit();
-                return lbDeviceVO;
+                        return lbDeviceVO;
+                    }
+                });
             } else {
                 throw new CloudRuntimeException("Failed to add load balancer device due to internal error.");
             }
         } catch (ConfigurationException e) {
-            txn.rollback();
             throw new CloudRuntimeException(e.getMessage());
         }
     }
@@ -402,7 +406,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     }
 
     @DB
-    protected ExternalLoadBalancerDeviceVO allocateLoadBalancerForNetwork(Network guestConfig) throws InsufficientCapacityException {
+    protected ExternalLoadBalancerDeviceVO allocateLoadBalancerForNetwork(final Network guestConfig) throws InsufficientCapacityException {
         boolean retry = true;
         boolean tryLbProvisioning = false;
         ExternalLoadBalancerDeviceVO lbDevice = null;
@@ -412,34 +416,33 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
 
         while (retry) {
             GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock");
-            Transaction txn = Transaction.currentTxn();
             try {
                 if (deviceMapLock.lock(120)) {
                     try {
-                        boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated
-// load balancer?
-                        long lbDeviceId;
+                        final boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated load balancer?
 
-                        txn.start();
                         try {
-                            // FIXME: should the device allocation be done during network implement phase or do a
-                            // lazy allocation when first rule for the network is configured??
-
-                            // find a load balancer device for this network as per the network offering
-                            lbDevice = findSuitableLoadBalancerForNetwork(guestConfig, dedicatedLB);
-                            lbDeviceId = lbDevice.getId();
-
-                            // persist the load balancer device id that will be used for this network. Once a network
-                            // is implemented on a LB device then later on all rules will be programmed on to same
-// device
-                            NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), lbDeviceId);
-                            _networkExternalLBDao.persist(networkLB);
-
-                            // mark device to be either dedicated or shared use
-                            lbDevice.setAllocationState(dedicatedLB ? LBDeviceAllocationState.Dedicated : LBDeviceAllocationState.Shared);
-                            _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice);
-
-                            txn.commit();
+                            lbDevice = Transaction.executeWithException(new TransactionCallbackWithException<ExternalLoadBalancerDeviceVO>() {
+                                @Override
+                                public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) throws Exception {
+                                    // FIXME: should the device allocation be done during network implement phase or do a
+                                    // lazy allocation when first rule for the network is configured??
+        
+                                    // find a load balancer device for this network as per the network offering
+                                    ExternalLoadBalancerDeviceVO lbDevice = findSuitableLoadBalancerForNetwork(guestConfig, dedicatedLB);
+                                    long lbDeviceId = lbDevice.getId();
+        
+                                    // persist the load balancer device id that will be used for this network. Once a network
+                                    // is implemented on a LB device then later on all rules will be programmed on to same device
+                                    NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), lbDeviceId);
+                                    _networkExternalLBDao.persist(networkLB);
+        
+                                    // mark device to be either dedicated or shared use
+                                    lbDevice.setAllocationState(dedicatedLB ? LBDeviceAllocationState.Dedicated : LBDeviceAllocationState.Shared);
+                                    _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice);
+                                    return lbDevice;
+                                }
+                            }, InsufficientCapacityException.class);
 
                             // allocated load balancer for the network, so skip retry
                             tryLbProvisioning = false;
@@ -448,28 +451,22 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                             // if already attempted to provision load balancer then throw out of capacity exception,
                             if (tryLbProvisioning) {
                                 retry = false;
-                                // TODO: throwing warning instead of error for now as its possible another provider can
-// service this network
+                                // TODO: throwing warning instead of error for now as its possible another provider can service this network
                                 s_logger.warn("There are no load balancer device with the capacity for implementing this network");
                                 throw exception;
                             } else {
-                                tryLbProvisioning = true; // if possible provision a LB appliance in to the physical
-// network
+                                tryLbProvisioning = true; // if possible provision a LB appliance in to the physical network
                             }
                         }
                     } finally {
                         deviceMapLock.unlock();
-                        if (lbDevice == null) {
-                            txn.rollback();
-                        }
                     }
                 }
             } finally {
                 deviceMapLock.releaseRef();
             }
 
-            // there are no LB devices or there is no free capacity on the devices in the physical network so provision
-// a new LB appliance
+            // there are no LB devices or there is no free capacity on the devices in the physical network so provision a new LB appliance
             if (tryLbProvisioning) {
                 // check if LB appliance can be dynamically provisioned
                 List<ExternalLoadBalancerDeviceVO> providerLbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider,
@@ -477,8 +474,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                 if ((providerLbDevices != null) && (!providerLbDevices.isEmpty())) {
                     for (ExternalLoadBalancerDeviceVO lbProviderDevice : providerLbDevices) {
                         if (lbProviderDevice.getState() == LBDeviceState.Enabled) {
-                            // acquire a private IP from the data center which will be used as management IP of
-// provisioned LB appliance,
+                            // acquire a private IP from the data center which will be used as management IP of provisioned LB appliance,
                             DataCenterIpAddressVO dcPrivateIp = _dcDao.allocatePrivateIpAddress(guestConfig.getDataCenterId(), lbProviderDevice.getUuid());
                             if (dcPrivateIp == null) {
                                 throw new InsufficientNetworkCapacityException("failed to acquire a priavate IP in the zone " + guestConfig.getDataCenterId() +
@@ -509,13 +505,11 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                             String publicIf = createLbAnswer.getPublicInterface();
                             String privateIf = createLbAnswer.getPrivateInterface();
 
-                            // we have provisioned load balancer so add the appliance as cloudstack provisioned external
-// load balancer
+                            // we have provisioned load balancer so add the appliance as cloudstack provisioned external load balancer
                             String dedicatedLb = offering.getDedicatedLB() ? "true" : "false";
                             String capacity = Long.toString(lbProviderDevice.getCapacity());
 
-                            // acquire a public IP to associate with lb appliance (used as subnet IP to make the
-// appliance part of private network)
+                            // acquire a public IP to associate with lb appliance (used as subnet IP to make the appliance part of private network)
                             PublicIp publicIp = _ipAddrMgr.assignPublicIpAddress(guestConfig.getDataCenterId(),
                                 null,
                                 _accountMgr.getSystemAccount(),
@@ -542,8 +536,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                             }
 
                             if (lbAppliance != null) {
-                                // mark the load balancer as cloudstack managed and set parent host id on which lb
-// appliance is provisioned
+                                // mark the load balancer as cloudstack managed and set parent host id on which lb appliance is provisioned
                                 ExternalLoadBalancerDeviceVO managedLb = _externalLoadBalancerDeviceDao.findById(lbAppliance.getId());
                                 managedLb.setIsManagedDevice(true);
                                 managedLb.setParentHostId(lbProviderDevice.getHostId());
@@ -557,8 +550,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                                     if (answer == null || !answer.getResult()) {
                                         s_logger.warn("Failed to destroy load balancer appliance created");
                                     } else {
-                                        // release the public & private IP back to dc pool, as the load balancer
-// appliance is now destroyed
+                                        // release the public & private IP back to dc pool, as the load balancer appliance is now destroyed
                                         _dcDao.releasePrivateIpAddress(lbIP, guestConfig.getDataCenterId(), null);
                                         _ipAddrMgr.disassociatePublicIpAddress(publicIp.getId(), _accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount());
                                     }
@@ -656,34 +648,40 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     }
 
     @DB
-    protected boolean freeLoadBalancerForNetwork(Network guestConfig) {
-        Transaction txn = Transaction.currentTxn();
+    protected boolean freeLoadBalancerForNetwork(final Network guestConfig) {
         GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock");
 
         try {
             if (deviceMapLock.lock(120)) {
-                txn.start();
-                // since network is shutdown remove the network mapping to the load balancer device
-                NetworkExternalLoadBalancerVO networkLBDevice = _networkExternalLBDao.findByNetworkId(guestConfig.getId());
-                long lbDeviceId = networkLBDevice.getExternalLBDeviceId();
-                _networkExternalLBDao.remove(networkLBDevice.getId());
-
-                List<NetworkExternalLoadBalancerVO> ntwksMapped = _networkExternalLBDao.listByLoadBalancerDeviceId(networkLBDevice.getExternalLBDeviceId());
-                ExternalLoadBalancerDeviceVO lbDevice = _externalLoadBalancerDeviceDao.findById(lbDeviceId);
-                boolean lbInUse = !(ntwksMapped == null || ntwksMapped.isEmpty());
-                boolean lbCloudManaged = lbDevice.getIsManagedDevice();
-
-                if (!lbInUse && !lbCloudManaged) {
-                    // this is the last network mapped to the load balancer device so set device allocation state to be
-// free
-                    lbDevice.setAllocationState(LBDeviceAllocationState.Free);
-                    _externalLoadBalancerDeviceDao.update(lbDevice.getId(), lbDevice);
-                }
+                ExternalLoadBalancerDeviceVO lbDevice = Transaction.execute(new TransactionCallback<ExternalLoadBalancerDeviceVO>() {
+                    @Override
+                    public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) {
+                        // since network is shutdown remove the network mapping to the load balancer device
+                        NetworkExternalLoadBalancerVO networkLBDevice = _networkExternalLBDao.findByNetworkId(guestConfig.getId());
+                        long lbDeviceId = networkLBDevice.getExternalLBDeviceId();
+                        _networkExternalLBDao.remove(networkLBDevice.getId());
+
+                        List<NetworkExternalLoadBalancerVO> ntwksMapped = _networkExternalLBDao.listByLoadBalancerDeviceId(networkLBDevice.getExternalLBDeviceId());
+                        ExternalLoadBalancerDeviceVO lbDevice = _externalLoadBalancerDeviceDao.findById(lbDeviceId);
+                        boolean lbInUse = !(ntwksMapped == null || ntwksMapped.isEmpty());
+                        boolean lbCloudManaged = lbDevice.getIsManagedDevice();
+
+                        if (!lbInUse && !lbCloudManaged) {
+                            // this is the last network mapped to the load balancer device so set device allocation state to be free
+                            lbDevice.setAllocationState(LBDeviceAllocationState.Free);
+                            _externalLoadBalancerDeviceDao.update(lbDevice.getId(), lbDevice);
+                        }
 
-                // commit the changes before sending agent command to destroy cloudstack managed LB
-                txn.commit();
+                        // commit the changes before sending agent command to destroy cloudstack managed LB
+                        if (!lbInUse && lbCloudManaged) {
+                            return lbDevice;
+                        } else {
+                            return null;
+                        }
+                    }
+                });
 
-                if (!lbInUse && lbCloudManaged) {
+                if (lbDevice != null) {
                     // send DestroyLoadBalancerApplianceCommand to the host where load balancer appliance is provisioned
                     Host lbHost = _hostDao.findById(lbDevice.getHostId());
                     String lbIP = lbHost.getPrivateIpAddress();
@@ -723,7 +721,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                 return false;
             }
         } catch (Exception exception) {
-            txn.rollback();
             s_logger.error("Failed to release load balancer device for the network" + guestConfig.getId() + " due to " + exception.getMessage());
         } finally {
             deviceMapLock.releaseRef();


[19/20] git commit: updated refs/heads/txn-refactor to 7364d55

Posted by da...@apache.org.
New Transaction API

Introduction of a new Transaction API that is more consistent with the style
of Spring's transaction managment.  The existing Transaction class was renamed
to TransactionLegacy.  All of the non-DAO code in the management server has been
updated to use the new Transaction API.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f62e28c1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f62e28c1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f62e28c1

Branch: refs/heads/txn-refactor
Commit: f62e28c1ec125263613d32856b11ef50b815e573
Parents: 81f1a0b
Author: Darren Shepherd <da...@gmail.com>
Authored: Wed Oct 16 09:21:00 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Wed Oct 16 09:21:00 2013 -0700

----------------------------------------------------------------------
 .../exception/ConcurrentOperationException.java |    3 +-
 .../bridge/persist/dao/BucketPolicyDaoImpl.java |    6 +-
 .../persist/dao/CloudStackAccountDaoImpl.java   |    3 +-
 .../dao/CloudStackConfigurationDaoImpl.java     |    3 +-
 .../dao/CloudStackSvcOfferingDaoImpl.java       |    5 +-
 .../persist/dao/CloudStackUserDaoImpl.java      |    3 +-
 .../cloud/bridge/persist/dao/MHostDaoImpl.java  |    5 +-
 .../bridge/persist/dao/MHostMountDaoImpl.java   |    3 +-
 .../persist/dao/MultiPartPartsDaoImpl.java      |    9 +-
 .../persist/dao/MultiPartUploadsDaoImpl.java    |   15 +-
 .../bridge/persist/dao/MultipartLoadDao.java    |    9 +-
 .../persist/dao/MultipartMetaDaoImpl.java       |    3 +-
 .../bridge/persist/dao/OfferingDaoImpl.java     |   11 +-
 .../cloud/bridge/persist/dao/SAclDaoImpl.java   |    7 +-
 .../bridge/persist/dao/SBucketDaoImpl.java      |    5 +-
 .../cloud/bridge/persist/dao/SHostDaoImpl.java  |    5 +-
 .../cloud/bridge/persist/dao/SMetaDaoImpl.java  |    5 +-
 .../bridge/persist/dao/SObjectDaoImpl.java      |    7 +-
 .../bridge/persist/dao/SObjectItemDaoImpl.java  |    5 +-
 .../persist/dao/UserCredentialsDaoImpl.java     |    5 +-
 .../cloud/bridge/service/EC2RestServlet.java    |   13 +-
 .../com/cloud/bridge/service/S3RestServlet.java |    5 +-
 .../service/controller/s3/S3BucketAction.java   |    3 +-
 .../service/controller/s3/ServiceProvider.java  |    7 +-
 .../cloud/bridge/service/core/s3/S3Engine.java  |   23 +-
 .../cloud/agent/manager/AgentManagerImpl.java   |    5 +-
 .../manager/ClusteredAgentManagerImpl.java      |    5 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  121 +-
 .../entity/api/db/dao/DcDetailsDaoImpl.java     |    4 +-
 .../entity/api/db/dao/EngineClusterDaoImpl.java |    6 +-
 .../api/db/dao/EngineDataCenterDaoImpl.java     |    6 +-
 .../entity/api/db/dao/EngineHostDaoImpl.java    |   14 +-
 .../entity/api/db/dao/EngineHostPodDaoImpl.java |    6 +-
 .../entity/api/db/dao/HostDetailsDaoImpl.java   |    4 +-
 .../entity/api/db/dao/HostTagsDaoImpl.java      |    4 +-
 .../orchestration/NetworkOrchestrator.java      |  918 +++++++-------
 .../orchestration/VolumeOrchestrator.java       |   88 +-
 .../src/com/cloud/alert/dao/AlertDaoImpl.java   |    4 +-
 .../com/cloud/capacity/dao/CapacityDaoImpl.java |   26 +-
 .../configuration/dao/ResourceCountDaoImpl.java |    4 +-
 .../src/com/cloud/dc/ClusterDetailsDaoImpl.java |    6 +-
 .../src/com/cloud/dc/dao/ClusterDaoImpl.java    |    6 +-
 .../com/cloud/dc/dao/ClusterVSMMapDaoImpl.java  |    4 +-
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java |    6 +-
 .../dc/dao/DataCenterIpAddressDaoImpl.java      |    8 +-
 .../DataCenterLinkLocalIpAddressDaoImpl.java    |    6 +-
 .../src/com/cloud/dc/dao/DataCenterVnetDao.java |    3 +-
 .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java |    8 +-
 .../src/com/cloud/dc/dao/DcDetailsDaoImpl.java  |    4 +-
 .../src/com/cloud/dc/dao/HostPodDaoImpl.java    |    6 +-
 .../src/com/cloud/dc/dao/PodVlanDaoImpl.java    |    8 +-
 .../dc/dao/StorageNetworkIpAddressDaoImpl.java  |    6 +-
 .../src/com/cloud/dc/dao/VlanDaoImpl.java       |    4 +-
 .../src/com/cloud/domain/dao/DomainDaoImpl.java |    6 +-
 .../src/com/cloud/event/dao/EventDaoImpl.java   |    4 +-
 .../com/cloud/event/dao/UsageEventDaoImpl.java  |   10 +-
 .../src/com/cloud/host/dao/HostDaoImpl.java     |   14 +-
 .../com/cloud/host/dao/HostDetailsDaoImpl.java  |    4 +-
 .../src/com/cloud/host/dao/HostTagsDaoImpl.java |    4 +-
 .../src/com/cloud/keystore/KeystoreDaoImpl.java |    4 +-
 .../network/dao/FirewallRulesCidrsDaoImpl.java  |    4 +-
 .../cloud/network/dao/FirewallRulesDaoImpl.java |    6 +-
 .../com/cloud/network/dao/IPAddressDaoImpl.java |    6 +-
 .../com/cloud/network/dao/NetworkDaoImpl.java   |   10 +-
 .../cloud/network/dao/PortProfileDaoImpl.java   |    4 +-
 .../security/dao/SecurityGroupDaoImpl.java      |    6 +-
 .../security/dao/SecurityGroupWorkDaoImpl.java  |    8 +-
 .../security/dao/VmRulesetLogDaoImpl.java       |    8 +-
 .../cloud/network/vpc/dao/PrivateIpDaoImpl.java |    4 +-
 .../network/vpc/dao/StaticRouteDaoImpl.java     |    4 +-
 .../com/cloud/network/vpc/dao/VpcDaoImpl.java   |    8 +-
 .../network/vpc/dao/VpcOfferingDaoImpl.java     |    4 +-
 .../offerings/dao/NetworkOfferingDaoImpl.java   |    6 +-
 .../com/cloud/projects/dao/ProjectDaoImpl.java  |    4 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |    4 +-
 .../storage/dao/LaunchPermissionDaoImpl.java    |    6 +-
 .../com/cloud/storage/dao/SnapshotDaoImpl.java  |   14 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |    4 +-
 .../storage/dao/StoragePoolHostDaoImpl.java     |   10 +-
 .../storage/dao/StoragePoolWorkDaoImpl.java     |    4 +-
 .../cloud/storage/dao/VMTemplateDaoImpl.java    |   14 +-
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |    4 +-
 .../storage/dao/VMTemplateHostDaoImpl.java      |    8 +-
 .../storage/dao/VMTemplatePoolDaoImpl.java      |    8 +-
 .../storage/dao/VMTemplateZoneDaoImpl.java      |    4 +-
 .../com/cloud/storage/dao/VolumeDaoImpl.java    |   12 +-
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |    4 +-
 .../src/com/cloud/upgrade/DatabaseCreator.java  |    8 +-
 .../cloud/upgrade/DatabaseIntegrityChecker.java |    7 +-
 .../cloud/upgrade/DatabaseUpgradeChecker.java   |    6 +-
 .../com/cloud/upgrade/dao/Upgrade307to410.java  |    2 +-
 .../com/cloud/upgrade/dao/VersionDaoImpl.java   |    4 +-
 .../src/com/cloud/usage/dao/UsageDaoImpl.java   |   26 +-
 .../cloud/usage/dao/UsageIPAddressDaoImpl.java  |    6 +-
 .../com/cloud/usage/dao/UsageJobDaoImpl.java    |    8 +-
 .../dao/UsageLoadBalancerPolicyDaoImpl.java     |    8 +-
 .../cloud/usage/dao/UsageNetworkDaoImpl.java    |    8 +-
 .../usage/dao/UsageNetworkOfferingDaoImpl.java  |    6 +-
 .../dao/UsagePortForwardingRuleDaoImpl.java     |    8 +-
 .../usage/dao/UsageSecurityGroupDaoImpl.java    |    6 +-
 .../cloud/usage/dao/UsageStorageDaoImpl.java    |    8 +-
 .../cloud/usage/dao/UsageVMInstanceDaoImpl.java |    8 +-
 .../cloud/usage/dao/UsageVMSnapshotDaoImpl.java |    8 +-
 .../cloud/usage/dao/UsageVPNUserDaoImpl.java    |    6 +-
 .../com/cloud/usage/dao/UsageVmDiskDaoImpl.java |    8 +-
 .../com/cloud/usage/dao/UsageVolumeDaoImpl.java |    8 +-
 .../com/cloud/user/AccountDetailsDaoImpl.java   |    4 +-
 .../src/com/cloud/user/dao/AccountDaoImpl.java  |    4 +-
 .../cloud/user/dao/UserStatisticsDaoImpl.java   |    6 +-
 .../cloud/user/dao/VmDiskStatisticsDaoImpl.java |    6 +-
 .../com/cloud/vm/dao/ConsoleProxyDaoImpl.java   |   16 +-
 .../com/cloud/vm/dao/DomainRouterDaoImpl.java   |    8 +-
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |    4 +-
 .../cloud/vm/dao/SecondaryStorageVmDaoImpl.java |    8 +-
 .../src/com/cloud/vm/dao/UserVmDaoImpl.java     |    8 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |    4 +-
 .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java |   12 +-
 .../affinity/dao/AffinityGroupVMMapDaoImpl.java |    4 +-
 .../entity/api/db/dao/VMComputeTagDaoImpl.java  |    4 +-
 .../entity/api/db/dao/VMEntityDaoImpl.java      |    4 +-
 .../entity/api/db/dao/VMNetworkMapDaoImpl.java  |    4 +-
 .../entity/api/db/dao/VMReservationDaoImpl.java |    4 +-
 .../entity/api/db/dao/VMRootDiskTagDaoImpl.java |    4 +-
 .../datastore/db/PrimaryDataStoreDaoImpl.java   |   10 +-
 .../endpoint/DefaultEndPointSelector.java       |    3 +-
 .../image/db/ImageStoreDetailsDaoImpl.java      |    4 +-
 .../image/db/SnapshotDataStoreDaoImpl.java      |    6 +-
 .../image/db/TemplateDataStoreDaoImpl.java      |    6 +-
 .../image/db/VolumeDataStoreDaoImpl.java        |    4 +-
 .../datastore/PrimaryDataStoreHelper.java       |    4 +-
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |    4 +-
 .../com/cloud/cluster/ClusterManagerImpl.java   |  102 +-
 .../dao/ManagementServerHostDaoImpl.java        |   16 +-
 .../dao/ManagementServerHostPeerDaoImpl.java    |    4 +-
 .../config/dao/ConfigurationDaoImpl.java        |    6 +-
 .../utils/crypt/EncryptionSecretKeyChanger.java |    3 +-
 .../com/cloud/utils/db/ConnectionConcierge.java |    2 +-
 framework/db/src/com/cloud/utils/db/DbUtil.java |    2 +-
 .../src/com/cloud/utils/db/GenericDaoBase.java  |   36 +-
 .../db/src/com/cloud/utils/db/Merovingian2.java |    2 +-
 .../src/com/cloud/utils/db/SequenceFetcher.java |    2 +-
 .../db/src/com/cloud/utils/db/Transaction.java  | 1166 +----------------
 .../com/cloud/utils/db/TransactionCallback.java |    7 +
 .../utils/db/TransactionCallbackNoReturn.java   |   13 +
 .../db/TransactionCallbackWithException.java    |    7 +
 .../utils/db/TransactionContextBuilder.java     |    6 +-
 .../com/cloud/utils/db/TransactionLegacy.java   | 1174 ++++++++++++++++++
 .../cloud/utils/db/TransactionMBeanImpl.java    |   18 +-
 .../com/cloud/utils/db/TransactionStatus.java   |    7 +
 .../utils/db/TransactionWrappedExeception.java  |   36 +
 .../db/test/com/cloud/utils/db/DbTestDao.java   |    4 +-
 .../db/test/com/cloud/utils/db/DbTestUtils.java |    4 +-
 .../com/cloud/utils/db/TransactionTest.java     |   26 +-
 .../framework/jobs/dao/AsyncJobDaoImpl.java     |    4 +-
 .../jobs/dao/AsyncJobJoinMapDaoImpl.java        |   10 +-
 .../framework/jobs/dao/SyncQueueDaoImpl.java    |    4 +-
 .../jobs/dao/SyncQueueItemDaoImpl.java          |    4 +-
 .../jobs/impl/AsyncJobManagerImpl.java          |  286 ++---
 .../jobs/impl/SyncQueueManagerImpl.java         |  271 ++--
 .../affinity/ExplicitDedicationProcessor.java   |   32 +-
 .../dedicated/DedicatedResourceManagerImpl.java |  273 ++--
 .../BareMetalPingServiceImpl.java               |    3 -
 .../networkservice/BaremetaNetworkGuru.java     |   21 +-
 .../networkservice/BaremetalDhcpElement.java    |    4 -
 .../BaremetalDhcpManagerImpl.java               |    4 -
 .../BaremetalKickStartServiceImpl.java          |    7 +-
 .../networkservice/BaremetalPxeElement.java     |    4 -
 .../com/cloud/ucs/manager/UcsManagerImpl.java   |    3 -
 .../lb/ElasticLoadBalancerManagerImpl.java      |   32 +-
 .../cloudstack/storage/test/AopTestAdvice.java  |    4 +-
 server/src/com/cloud/api/ApiServer.java         |   65 +-
 .../com/cloud/capacity/CapacityManagerImpl.java |  321 ++---
 .../configuration/ConfigurationManagerImpl.java |  880 ++++++-------
 .../consoleproxy/ConsoleProxyManagerImpl.java   |   34 +-
 .../cloud/dc/dao/DedicatedResourceDaoImpl.java  |    3 +-
 .../deploy/DeploymentPlanningManagerImpl.java   |  157 +--
 .../ha/HighAvailabilityManagerExtImpl.java      |    7 +-
 .../cloud/ha/dao/HighAvailabilityDaoImpl.java   |    3 +-
 .../metadata/ResourceMetaDataManagerImpl.java   |   86 +-
 .../network/ExternalDeviceUsageManagerImpl.java |  155 +--
 .../ExternalFirewallDeviceManagerImpl.java      |   46 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java  |  171 ++-
 .../com/cloud/network/IpAddressManagerImpl.java |  967 ++++++++-------
 .../com/cloud/network/NetworkServiceImpl.java   |  605 ++++-----
 .../cloud/network/NetworkUsageManagerImpl.java  |   50 +-
 .../cloud/network/PortProfileManagerImpl.java   |   39 +-
 .../network/StorageNetworkManagerImpl.java      |  169 +--
 .../cloud/network/as/AutoScaleManagerImpl.java  |  191 +--
 .../network/firewall/FirewallManagerImpl.java   |   93 +-
 .../cloud/network/guru/DirectNetworkGuru.java   |  122 +-
 .../network/guru/DirectPodBasedNetworkGuru.java |  116 +-
 .../cloud/network/guru/GuestNetworkGuru.java    |   17 +-
 .../cloud/network/guru/PublicNetworkGuru.java   |   20 +-
 .../lb/LoadBalancingRulesManagerImpl.java       |  395 +++---
 .../VirtualNetworkApplianceManagerImpl.java     |  347 +++---
 .../cloud/network/rules/RulesManagerImpl.java   |  228 ++--
 .../security/SecurityGroupManagerImpl.java      |  526 ++++----
 .../network/vpc/NetworkACLManagerImpl.java      |   40 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |  635 +++++-----
 .../network/vpn/RemoteAccessVpnManagerImpl.java |  224 ++--
 .../com/cloud/projects/ProjectManagerImpl.java  |  367 +++---
 .../com/cloud/resource/ResourceManagerImpl.java |  297 +++--
 .../resourcelimit/ResourceLimitManagerImpl.java |  336 ++---
 .../cloud/server/ConfigurationServerImpl.java   |  554 +++++----
 .../com/cloud/server/ManagementServerImpl.java  |  101 +-
 server/src/com/cloud/server/StatsCollector.java |  247 ++--
 .../com/cloud/servlet/CloudStartupServlet.java  |    3 +-
 .../com/cloud/servlet/ConsoleProxyServlet.java  |    3 +-
 .../com/cloud/storage/StorageManagerImpl.java   |   62 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |  144 ++-
 .../cloud/tags/TaggedResourceManagerImpl.java   |  110 +-
 .../com/cloud/template/TemplateManagerImpl.java |  100 +-
 server/src/com/cloud/test/DatabaseConfig.java   |   68 +-
 server/src/com/cloud/test/IPRangeConfig.java    |   15 +-
 server/src/com/cloud/test/PodZoneConfig.java    |    7 +-
 .../src/com/cloud/usage/UsageServiceImpl.java   |   10 +-
 .../src/com/cloud/user/AccountManagerImpl.java  |  190 +--
 .../src/com/cloud/user/DomainManagerImpl.java   |   70 +-
 .../cloud/uuididentity/dao/IdentityDaoImpl.java |   13 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  681 +++++-----
 .../vm/snapshot/VMSnapshotManagerImpl.java      |   46 +-
 .../affinity/AffinityGroupServiceImpl.java      |  107 +-
 .../lb/ApplicationLoadBalancerManagerImpl.java  |   51 +-
 .../GlobalLoadBalancingRulesServiceImpl.java    |  219 ++--
 .../configuration/ConfigurationManagerTest.java |   20 +-
 .../cloud/network/CreatePrivateNetworkTest.java |    6 +-
 .../network/DedicateGuestVlanRangesTest.java    |   18 +-
 .../network/UpdatePhysicalNetworkTest.java      |    5 +-
 ...GlobalLoadBalancingRulesServiceImplTest.java |   28 +-
 usage/src/com/cloud/usage/UsageManagerImpl.java |   16 +-
 .../src/com/cloud/usage/UsageSanityChecker.java |    4 +-
 .../cloud/utils/exception/ExceptionUtil.java    |   12 +
 232 files changed, 8415 insertions(+), 7792 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/api/src/com/cloud/exception/ConcurrentOperationException.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/exception/ConcurrentOperationException.java b/api/src/com/cloud/exception/ConcurrentOperationException.java
index cfe6ba3..018dba5 100644
--- a/api/src/com/cloud/exception/ConcurrentOperationException.java
+++ b/api/src/com/cloud/exception/ConcurrentOperationException.java
@@ -17,8 +17,9 @@
 package com.cloud.exception;
 
 import com.cloud.utils.SerialVersionUID;
+import com.cloud.utils.exception.CloudRuntimeException;
 
-public class ConcurrentOperationException extends CloudException {
+public class ConcurrentOperationException extends CloudRuntimeException {
 
     private static final long serialVersionUID = SerialVersionUID.ConcurrentOperationException;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
index dd354a3..00486cb 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
@@ -26,7 +26,7 @@ import com.cloud.bridge.model.BucketPolicyVO;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={BucketPolicyDao.class})
@@ -42,7 +42,7 @@ public class BucketPolicyDaoImpl extends GenericDaoBase<BucketPolicyVO, Long> im
     public BucketPolicyVO getByName( String bucketName ) {
         SearchBuilder <BucketPolicyVO> searchByBucket = createSearchBuilder();
         searchByBucket.and("BucketName", searchByBucket.entity().getBucketName(), SearchCriteria.Op.EQ);
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             SearchCriteria<BucketPolicyVO> sc = searchByBucket.create();
@@ -59,7 +59,7 @@ public class BucketPolicyDaoImpl extends GenericDaoBase<BucketPolicyVO, Long> im
     public void deletePolicy( String bucketName ) {
         SearchBuilder <BucketPolicyVO> deleteByBucket = createSearchBuilder();
         deleteByBucket.and("BucketName", deleteByBucket.entity().getBucketName(), SearchCriteria.Op.EQ);
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             SearchCriteria<BucketPolicyVO> sc = deleteByBucket.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
index 8fbc7c8..75a693e 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={CloudStackAccountDao.class})
@@ -34,7 +35,7 @@ public class CloudStackAccountDaoImpl extends GenericDaoBase<CloudStackAccountVO
     public String getDefaultZoneId(String accountId) {
         
         SearchBuilder<CloudStackAccountVO> SearchByUUID = createSearchBuilder();
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             txn.start();
             SearchByUUID.and("uuid", SearchByUUID.entity().getUuid(),

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
index bc77ea1..644dcdc 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
@@ -27,6 +27,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={CloudStackConfigurationDao.class})
@@ -42,7 +43,7 @@ public class CloudStackConfigurationDaoImpl extends GenericDaoBase<CloudStackCon
     @DB
     public String getConfigValue(String name) {
         NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ);
-        Transaction txn = Transaction.open("cloud", Transaction.CLOUD_DB, true);
+        TransactionLegacy txn = TransactionLegacy.open("cloud", TransactionLegacy.CLOUD_DB, true);
         try {
             txn.start();
             SearchCriteria<CloudStackConfigurationVO> sc = NameSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
index 8021eb6..cb8d129 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={CloudStackSvcOfferingDao.class})
@@ -42,7 +43,7 @@ public class CloudStackSvcOfferingDaoImpl extends GenericDaoBase<CloudStackServi
         SearchBuilder <CloudStackServiceOfferingVO> searchByName = createSearchBuilder();
         searchByName.and("name", searchByName.entity().getName(), SearchCriteria.Op.EQ);
         searchByName.done();
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             txn.start();
             SearchCriteria<CloudStackServiceOfferingVO> sc = searchByName.create();
@@ -61,7 +62,7 @@ public class CloudStackSvcOfferingDaoImpl extends GenericDaoBase<CloudStackServi
         SearchBuilder <CloudStackServiceOfferingVO> searchByID = createSearchBuilder();
         searchByID.and("uuid", searchByID.entity().getUuid(), SearchCriteria.Op.EQ);
         searchByID.done();
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             txn.start();
             SearchCriteria<CloudStackServiceOfferingVO> sc = searchByID.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
index f7e1da6..7fe1dab 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
@@ -26,6 +26,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.crypt.DBEncryptionUtil;
 
 @Component
@@ -43,7 +44,7 @@ public class CloudStackUserDaoImpl extends GenericDaoBase<CloudStackUserVO, Stri
         SearchBuilder <CloudStackUserVO> searchByAccessKey = createSearchBuilder();
         searchByAccessKey.and("apiKey", searchByAccessKey.entity().getApiKey(), SearchCriteria.Op.EQ);
         searchByAccessKey.done();
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             txn.start();
             SearchCriteria<CloudStackUserVO> sc = searchByAccessKey.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
index 2223254..b52fcaf 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={MHostDao.class})
@@ -38,7 +39,7 @@ public class MHostDaoImpl extends GenericDaoBase<MHostVO, Long> implements MHost
 	@Override
 	public MHostVO getByHostKey(String hostKey) {
 	    NameSearch.and("MHostKey", NameSearch.entity().getHostKey(), SearchCriteria.Op.EQ);
-	    Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+	    TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
 	    try {
 		txn.start();
 		SearchCriteria<MHostVO> sc = NameSearch.create();
@@ -52,7 +53,7 @@ public class MHostDaoImpl extends GenericDaoBase<MHostVO, Long> implements MHost
 
     @Override
     public void updateHeartBeat(MHostVO mhost) {
-        Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
         try {
             txn.start();
             update(mhost.getId(), mhost);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
index 8b99f48..8a7153a 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={MHostMountDao.class})
@@ -37,7 +38,7 @@ public class MHostMountDaoImpl extends GenericDaoBase<MHostMountVO, Long> implem
 	public MHostMountVO getHostMount(long mHostId, long sHostId) { 
 	    SearchByMHostID.and("MHostID", SearchByMHostID.entity().getmHostID(), SearchCriteria.Op.EQ);
 	    SearchByMHostID.and("SHostID", SearchByMHostID.entity().getsHostID(), SearchCriteria.Op.EQ);
-	    Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    try {
 		txn.start();
 		SearchCriteria<MHostMountVO> sc = SearchByMHostID.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
index 6f31495..f1472e6 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
@@ -28,6 +28,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={MultiPartPartsDao.class})
@@ -42,7 +43,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
         ByUploadID.and("partNumber", ByUploadID.entity().getPartNumber(), SearchCriteria.Op.LT);
         Filter filter = new Filter(MultiPartPartsVO.class, "partNumber", Boolean.TRUE, null, null);
         
-        Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
         try {
             txn.start();
             SearchCriteria<MultiPartPartsVO> sc = ByUploadID.create();
@@ -61,7 +62,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
         SearchBuilder<MultiPartPartsVO> byUploadID = createSearchBuilder();
         byUploadID.and("UploadID", byUploadID.entity().getUploadid(), SearchCriteria.Op.EQ);
         byUploadID.and("partNumber", byUploadID.entity().getPartNumber(), SearchCriteria.Op.GT);
-        Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
         try {
             txn.start();
             SearchCriteria<MultiPartPartsVO> sc = byUploadID.create();
@@ -82,7 +83,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
         SearchBuilder<MultiPartPartsVO> byUploadID = createSearchBuilder();
         byUploadID.and("UploadID", byUploadID.entity().getUploadid(), SearchCriteria.Op.EQ);
         byUploadID.and("partNumber", byUploadID.entity().getPartNumber(), SearchCriteria.Op.EQ);
-        Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
         try {
             txn.start();
             SearchCriteria<MultiPartPartsVO> sc = byUploadID.create();
@@ -102,7 +103,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
         SearchBuilder<MultiPartPartsVO> byUploadID = createSearchBuilder();
         byUploadID.and("UploadID", byUploadID.entity().getUploadid(), SearchCriteria.Op.EQ);
         byUploadID.and("partNumber", byUploadID.entity().getPartNumber(), SearchCriteria.Op.EQ);
-        Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
         try {
             txn.start();
             SearchCriteria<MultiPartPartsVO> sc = byUploadID.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
index 0f76e80..41133a0 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={MultiPartUploadsDao.class})
@@ -42,9 +43,9 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
     public OrderedPair<String,String> multipartExits( int uploadId ) {
         MultiPartUploadsVO uploadvo = null;
         
-        Transaction txn = null; 
+        TransactionLegacy txn = null; 
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             uploadvo = findById(new Long(uploadId));
             if (null != uploadvo)
                 return new OrderedPair<String,String>(uploadvo.getAccessKey(), uploadvo.getNameKey());
@@ -58,9 +59,9 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
     @Override
     public void deleteUpload(int uploadId) {
         
-        Transaction txn = null; 
+        TransactionLegacy txn = null; 
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             remove(new Long(uploadId));
             txn.commit();
         }finally {
@@ -70,10 +71,10 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
     
     @Override
     public String getAtrributeValue(String attribute, int uploadid) {
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         MultiPartUploadsVO uploadvo = null;
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             uploadvo = findById(new Long(uploadid));
             if (null != uploadvo) {
                 if ( attribute.equalsIgnoreCase("AccessKey") )
@@ -105,7 +106,7 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
        Filter filter = new Filter(MultiPartUploadsVO.class, "nameKey", Boolean.TRUE, null, null);
        filter.addOrderBy(MultiPartUploadsVO.class, "createTime", Boolean.TRUE);
        
-       Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+       TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
        try {
            txn.start();
            SearchCriteria<MultiPartUploadsVO> sc = byBucket.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java b/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
index c1a69dc..4e6ff3d 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
@@ -34,6 +34,7 @@ import com.cloud.bridge.service.core.s3.S3MultipartPart;
 import com.cloud.bridge.service.core.s3.S3MultipartUpload;
 import com.cloud.bridge.util.OrderedPair;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 public class MultipartLoadDao {
     public static final Logger logger = Logger.getLogger(MultipartLoadDao.class);
@@ -94,9 +95,9 @@ public class MultipartLoadDao {
      */
     public int initiateUpload( String accessKey, String bucketName, String key, String cannedAccess, S3MetaDataEntry[] meta ) {
         int uploadId = -1;
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             Date tod = new Date();
             MultiPartUploadsVO uploadVO = new MultiPartUploadsVO(accessKey,
                     bucketName, key, cannedAccess, tod);
@@ -315,9 +316,9 @@ public class MultipartLoadDao {
     private void saveMultipartMeta( int uploadId, S3MetaDataEntry[] meta ) {
         if (null == meta) return;
 
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             for( int i=0; i < meta.length; i++ ) 
             {
                 S3MetaDataEntry entry = meta[i];

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
index 7ab9359..fec0a2c 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
@@ -27,6 +27,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={MultipartMetaDao.class})
@@ -37,7 +38,7 @@ public class MultipartMetaDaoImpl extends GenericDaoBase<MultipartMetaVO, Long>
         SearchBuilder <MultipartMetaVO> searchByUID = createSearchBuilder();
         searchByUID.and("UploadID", searchByUID.entity().getUploadID(), SearchCriteria.Op.EQ);
         searchByUID.done();
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             SearchCriteria<MultipartMetaVO> sc = searchByUID.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
index ea7d264..963f108 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={OfferingDao.class})
@@ -39,7 +40,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
 	
 	@Override
 	public int getOfferingCount() {
-       Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             return listAll().size();
@@ -56,7 +57,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
        SearchBuilder <OfferingBundleVO> searchByAmazon = createSearchBuilder();
        searchByAmazon.and("AmazonEC2Offering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
        searchByAmazon.done();
-       Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+       TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
        try {
            txn.start();
            SearchCriteria<OfferingBundleVO> sc = searchByAmazon.create();
@@ -74,7 +75,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
 	       SearchBuilder <OfferingBundleVO> searchByAmazon = createSearchBuilder();
 	       searchByAmazon.and("CloudStackOffering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
 	       searchByAmazon.done();
-	       Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	       TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	       try {
 	           txn.start();
 	           SearchCriteria<OfferingBundleVO> sc = searchByAmazon.create();
@@ -93,7 +94,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
         searchByAmazon.and("CloudStackOffering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
         searchByAmazon.and("AmazonEC2Offering", searchByAmazon.entity().getCloudstackOffering() , SearchCriteria.Op.EQ);
         searchByAmazon.done();
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         OfferingBundleVO offering = null;
         try {
             txn.start();
@@ -122,7 +123,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
 	    SearchBuilder <OfferingBundleVO> searchByAmazon = createSearchBuilder();
         searchByAmazon.and("AmazonEC2Offering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
         searchByAmazon.done();
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             SearchCriteria<OfferingBundleVO> sc = searchByAmazon.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
index d88660e..d4b4c90 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
@@ -32,6 +32,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SAclDao.class})
@@ -46,7 +47,7 @@ public class SAclDaoImpl extends GenericDaoBase<SAclVO, Long> implements SAclDao
 	    SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
 	    SearchByTarget.done();
 	    Filter filter = new Filter(SAclVO.class, "grantOrder", Boolean.TRUE, null, null);
-	    Transaction txn = Transaction.open( Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open( TransactionLegacy.AWSAPI_DB);
 	    try {
 		txn.start();
 		SearchCriteria<SAclVO> sc = SearchByTarget.create();
@@ -66,7 +67,7 @@ public class SAclDaoImpl extends GenericDaoBase<SAclVO, Long> implements SAclDao
 	    SearchByAcl.and("TargetID", SearchByAcl.entity().getTargetId(), SearchCriteria.Op.EQ);
 	    SearchByAcl.and("GranteeCanonicalID", SearchByAcl.entity().getGranteeCanonicalId(), SearchCriteria.Op.EQ);
 	    Filter filter = new Filter(SAclVO.class, "grantOrder", Boolean.TRUE, null, null);
-	    Transaction txn = Transaction.open( Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open( TransactionLegacy.AWSAPI_DB);
 	    try {
     		txn.start();
     		SearchCriteria<SAclVO> sc = SearchByAcl.create();
@@ -85,7 +86,7 @@ public class SAclDaoImpl extends GenericDaoBase<SAclVO, Long> implements SAclDao
 	    SearchByTarget.and("Target", SearchByTarget.entity().getTarget(), SearchCriteria.Op.EQ);
 	    SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
 
-	    Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    try {
 		txn.start();
 		SearchCriteria<SAclVO> sc = SearchByTarget.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
index 817c682..552281d 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SBucketDao.class})
@@ -42,7 +43,7 @@ public class SBucketDaoImpl extends GenericDaoBase<SBucketVO, Long> implements S
 	    SearchBuilder<SBucketVO> SearchByName = createSearchBuilder();
 	    SearchByName.and("Name", SearchByName.entity().getName(), SearchCriteria.Op.EQ);
 	    //Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
-	    Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+	    TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
 	    try {
 		txn.start();
 		SearchCriteria<SBucketVO> sc = SearchByName.create();
@@ -59,7 +60,7 @@ public class SBucketDaoImpl extends GenericDaoBase<SBucketVO, Long> implements S
 	    SearchBuilder<SBucketVO> ByCanonicalID = createSearchBuilder();
 	    ByCanonicalID.and("OwnerCanonicalID", ByCanonicalID.entity().getOwnerCanonicalId(), SearchCriteria.Op.EQ);
 	    Filter filter = new Filter(SBucketVO.class, "createTime", Boolean.TRUE, null, null);
-	    Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+	    TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
 	    try {
             txn.start();
             SearchCriteria<SBucketVO> sc = ByCanonicalID.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
index 9b6b535..5d2e9b9 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SHostDao.class})
@@ -36,7 +37,7 @@ public class SHostDaoImpl extends GenericDaoBase<SHostVO, Long> implements SHost
 	    SearchBuilder <SHostVO> HostSearch = createSearchBuilder();
 	    HostSearch.and("Host", HostSearch.entity().getHost(), SearchCriteria.Op.EQ);
 	    HostSearch.done();
-	    Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    try {
     		txn.start();
     		SearchCriteria<SHostVO> sc = HostSearch.create();
@@ -55,7 +56,7 @@ public class SHostDaoImpl extends GenericDaoBase<SHostVO, Long> implements SHost
 	    LocalStorageHostSearch.and("MHostID", LocalStorageHostSearch.entity().getMhostid(), SearchCriteria.Op.EQ);
 	    LocalStorageHostSearch.and("ExportRoot", LocalStorageHostSearch.entity().getExportRoot(), SearchCriteria.Op.EQ);
 	    LocalStorageHostSearch.done();
-	    Transaction txn = Transaction.currentTxn();
+	    TransactionLegacy txn = TransactionLegacy.currentTxn();
 	    try {
             txn.start();
             SearchCriteria<SHostVO> sc = LocalStorageHostSearch.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
index 8fdc949..95355b9 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
@@ -28,6 +28,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SMetaDao.class})
@@ -41,7 +42,7 @@ public class SMetaDaoImpl extends GenericDaoBase<SMetaVO, Long> implements SMeta
 	    SearchByTarget.and("Target", SearchByTarget.entity().getTarget(), SearchCriteria.Op.EQ);
 	    SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
 	    SearchByTarget.done();
-	    Transaction txn = Transaction.open( Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open( TransactionLegacy.AWSAPI_DB);
 	    try {
             txn.start();
             SearchCriteria<SMetaVO> sc = SearchByTarget.create();
@@ -71,7 +72,7 @@ public class SMetaDaoImpl extends GenericDaoBase<SMetaVO, Long> implements SMeta
 	    SearchBuilder <SMetaVO> SearchByTarget = createSearchBuilder();
 	    SearchByTarget.and("Target", SearchByTarget.entity().getTarget(), SearchCriteria.Op.EQ);
 	    SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
-	    Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    try {
 		txn.start();
 		SearchCriteria<SMetaVO> sc = SearchByTarget.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
index 6d23757..e6370fe 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SObjectDao.class})
@@ -47,7 +48,7 @@ public class SObjectDaoImpl extends GenericDaoBase<SObjectVO, Long> implements S
         SearchBuilder<SObjectVO> SearchByName = createSearchBuilder();
         SearchByName.and("SBucketID", SearchByName.entity().getBucketID() , SearchCriteria.Op.EQ);
         SearchByName.and("NameKey", SearchByName.entity().getNameKey() , SearchCriteria.Op.EQ);
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             SearchCriteria<SObjectVO> sc = SearchByName.create();
@@ -76,7 +77,7 @@ public class SObjectDaoImpl extends GenericDaoBase<SObjectVO, Long> implements S
 
         SearchByBucket.and("SBucketID", SearchByBucket.entity().getBucketID(), SearchCriteria.Op.EQ);
         SearchByBucket.and("DeletionMark", SearchByBucket.entity().getDeletionMark(), SearchCriteria.Op.NULL);		
-        Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
         try {
             txn.start();
             SearchCriteria<SObjectVO> sc = SearchByBucket.create();
@@ -100,7 +101,7 @@ public class SObjectDaoImpl extends GenericDaoBase<SObjectVO, Long> implements S
         List<SObjectVO> objects = new ArrayList<SObjectVO>();
         getAllBuckets.and("SBucketID", getAllBuckets.entity().getBucketID(), SearchCriteria.Op.EQ);
 
-        Transaction txn = Transaction.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.currentTxn();  // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
         try {
             txn.start();
             SearchCriteria<SObjectVO> sc = getAllBuckets.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
index 57140c4..294b32d 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
@@ -27,6 +27,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={SObjectItemDao.class})
@@ -39,7 +40,7 @@ public class SObjectItemDaoImpl extends GenericDaoBase<SObjectItemVO, Long> impl
 	@Override
 	public SObjectItemVO getByObjectIdNullVersion(long id) {
 	    
-	    Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    SearchBuilder <SObjectItemVO> SearchByID = createSearchBuilder();
 	    SearchByID.and("ID", SearchByID.entity().getId(), SearchCriteria.Op.EQ);
 	    
@@ -56,7 +57,7 @@ public class SObjectItemDaoImpl extends GenericDaoBase<SObjectItemVO, Long> impl
 	@Override
     public List<SObjectItemVO> getItems(long sobjectID) {
 
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         SearchBuilder<SObjectItemVO> SearchBySobjectID = createSearchBuilder();
         SearchBySobjectID.and("SObjectID", SearchBySobjectID.entity().getId(), SearchCriteria.Op.EQ);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
index c45886f..b60a717 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={UserCredentialsDao.class})
@@ -41,7 +42,7 @@ public class UserCredentialsDaoImpl extends GenericDaoBase<UserCredentialsVO, Lo
 	@Override
 	public UserCredentialsVO getByAccessKey( String cloudAccessKey ) {
 	        SearchBuilder<UserCredentialsVO> SearchByAccessKey = createSearchBuilder();
-	        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    try {
             txn.start();
             SearchByAccessKey.and("AccessKey", SearchByAccessKey.entity()
@@ -60,7 +61,7 @@ public class UserCredentialsDaoImpl extends GenericDaoBase<UserCredentialsVO, Lo
 	public UserCredentialsVO getByCertUniqueId( String certId ) {
 	    SearchBuilder<UserCredentialsVO> SearchByCertID = createSearchBuilder();
 	    SearchByCertID.and("CertUniqueId", SearchByCertID.entity().getCertUniqueId(), SearchCriteria.Op.EQ);
-	    Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+	    TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 	    try {
             txn.start();
             SearchCriteria<UserCredentialsVO> sc = SearchByCertID.create();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java b/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
index 50ac26f..1ef04a4 100644
--- a/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
+++ b/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
@@ -161,6 +161,7 @@ import com.cloud.bridge.util.ConfigurationHelper;
 import com.cloud.bridge.util.EC2RestAuth;
 import com.cloud.stack.models.CloudStackAccount;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component("EC2RestServlet")
 public class EC2RestServlet extends HttpServlet {
@@ -377,7 +378,7 @@ public class EC2RestServlet extends HttpServlet {
     private void setUserKeys( HttpServletRequest request, HttpServletResponse response ) {
         String[] accessKey = null;
         String[] secretKey = null;
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
             // -> all these parameters are required
             accessKey = request.getParameterValues( "accesskey" );
@@ -398,7 +399,7 @@ public class EC2RestServlet extends HttpServlet {
             return;
         }
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn.start();
             // -> use the keys to see if the account actually exists
             ServiceProvider.getInstance().getEC2Engine().validateAccount( accessKey[0], secretKey[0] );
@@ -434,7 +435,7 @@ public class EC2RestServlet extends HttpServlet {
      */
     private void setCertificate( HttpServletRequest request, HttpServletResponse response ) 
             throws Exception { 
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
             // [A] Pull the cert and cloud AccessKey from the request
             String[] certificate = request.getParameterValues( "cert" );
@@ -470,7 +471,7 @@ public class EC2RestServlet extends HttpServlet {
             // [C] Associate the cert's uniqueId with the Cloud API keys
             String uniqueId = AuthenticationUtils.X509CertUniqueId( userCert );
             logger.debug( "SetCertificate, uniqueId: " + uniqueId );
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn.start();
             UserCredentialsVO user = ucDao.getByAccessKey(accessKey[0]);
             user.setCertUniqueId(uniqueId);
@@ -505,7 +506,7 @@ public class EC2RestServlet extends HttpServlet {
      */
     private void deleteCertificate( HttpServletRequest request, HttpServletResponse response ) 
             throws Exception {
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
             String [] accessKey = request.getParameterValues( "AWSAccessKeyId" );
             if ( null == accessKey || 0 == accessKey.length ) { 
@@ -527,7 +528,7 @@ public class EC2RestServlet extends HttpServlet {
                 /*	     	     UserCredentialsDao credentialDao = new UserCredentialsDao();
 	     	     credentialDao.setCertificateId( accessKey[0], null );
 
-                 */	     	     txn = Transaction.open(Transaction.AWSAPI_DB);
+                 */	     	     txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
                  UserCredentialsVO user = ucDao.getByAccessKey(accessKey[0]);
                  user.setCertUniqueId(null);
                  ucDao.update(user.getId(), user);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/S3RestServlet.java b/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
index 7e69fd6..192e1a2 100644
--- a/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
+++ b/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
@@ -67,6 +67,7 @@ import com.cloud.bridge.util.RestAuth;
 import com.cloud.bridge.util.S3SoapAuth;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 public class S3RestServlet extends HttpServlet {
     private static final long serialVersionUID = -6168996266762804877L;
     public static final String ENABLE_S3_API="enable.s3.api";
@@ -139,7 +140,7 @@ public class S3RestServlet extends HttpServlet {
      */
     private void processRequest( HttpServletRequest request, HttpServletResponse response, String method ) 
     {
-        Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+        TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
         try {
             logRequest(request);
 
@@ -274,7 +275,7 @@ public class S3RestServlet extends HttpServlet {
             // -> use the keys to see if the account actually exists
             //ServiceProvider.getInstance().getEC2Engine().validateAccount( accessKey[0], secretKey[0] );
             //UserCredentialsDaoImpl credentialDao = new UserCredentialsDao();
-            Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+            TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn.start();
             UserCredentialsVO user = new UserCredentialsVO(accessKey[0], secretKey[0]);
             user = ucDao.persist(user);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java b/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
index c98de34..4d7c41a 100644
--- a/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
+++ b/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
@@ -94,6 +94,7 @@ import com.cloud.bridge.util.XSerializer;
 import com.cloud.bridge.util.XSerializerXmlAdapter;
 import com.cloud.bridge.util.XmlHelper;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 
 public class S3BucketAction implements ServletAction {
@@ -371,7 +372,7 @@ public class S3BucketAction implements ServletAction {
             response.setStatus(403);
             return;
         }			
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         // [B] Place the policy into the database over writting an existing policy
         try {
             // -> first make sure that the policy is valid by parsing it

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java b/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
index 2623efe..0854741 100644
--- a/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
+++ b/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
@@ -62,6 +62,7 @@ import com.cloud.bridge.util.OrderedPair;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 public class ServiceProvider extends ManagerBase {
@@ -90,7 +91,7 @@ public class ServiceProvider extends ManagerBase {
 
     protected ServiceProvider() throws IOException {
         // register service implementation object
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         txn.close();
     }
 
@@ -183,7 +184,7 @@ public class ServiceProvider extends ManagerBase {
 
     public UserInfo getUserInfo(String accessKey) {
         UserInfo info = new UserInfo();
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         try {
             txn.start();
             UserCredentialsVO cloudKeys = ucDao.getByAccessKey( accessKey ); 
@@ -253,7 +254,7 @@ public class ServiceProvider extends ManagerBase {
 
         multipartDir = properties.getProperty("storage.multipartDir");
 
-        Transaction txn1 = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn1 = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         timer.schedule(getHeartbeatTask(), HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL);
         txn1.close();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java b/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
index 7beb012..05e87d7 100644
--- a/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
+++ b/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
@@ -86,6 +86,7 @@ import com.cloud.bridge.util.StringHelper;
 import com.cloud.bridge.util.Triple;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 /**
  * The CRUD control actions to be invoked from S3BucketAction or S3ObjectAction.
@@ -195,7 +196,7 @@ public class S3Engine {
         String cannedAccessPolicy = request.getCannedAccess();
         String bucketName = request.getBucketName();
         response.setBucketName( bucketName );
-        Transaction txn= null;
+        TransactionLegacy txn= null;
         verifyBucketName( bucketName, false );
 
         S3PolicyContext context = new S3PolicyContext( PolicyActions.CreateBucket,  bucketName );
@@ -205,7 +206,7 @@ public class S3Engine {
         OrderedPair<SHostVO, String> shost_storagelocation_pair = null;
         boolean success = false;
         try {
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
 
             if (bucketDao.getByName(request.getBucketName()) != null)
                 throw new ObjectAlreadyExistsException("Bucket already exists");
@@ -257,10 +258,10 @@ public class S3Engine {
         String bucketName = request.getBucketName();
         SBucketVO sbucket   = bucketDao.getByName(bucketName);
 
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         if ( sbucket != null ) 
         {	
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn.start();
             S3PolicyContext context = new S3PolicyContext( PolicyActions.DeleteBucket, bucketName );
             switch( verifyPolicy( context ))
@@ -699,7 +700,7 @@ public class S3Engine {
         if (null != version)
             httpResp.addHeader("x-amz-version-id", version);
         httpResp.flushBuffer();
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         // [C] Re-assemble the object from its uploaded file parts
         try {
             // explicit transaction control to avoid holding transaction during
@@ -752,11 +753,11 @@ public class S3Engine {
         S3BucketAdapter bucketAdapter = getStorageHostBucketAdapter(host_storagelocation_pair.getFirst());
         String itemFileName = object_objectitem_pair.getSecond().getStoredPath();
         InputStream is = null;
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
             // explicit transaction control to avoid holding transaction during file-copy process
 
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn.start();
             is = request.getDataInputStream();
             String md5Checksum = bucketAdapter.saveObject(is, host_storagelocation_pair.getSecond(), bucket.getName(), itemFileName);
@@ -813,11 +814,11 @@ public class S3Engine {
         S3BucketAdapter bucketAdapter =  getStorageHostBucketAdapter(host_storagelocation_pair.getFirst());
         String itemFileName = object_objectitem_pair.getSecond().getStoredPath();
         InputStream is = null;
-        Transaction txn = null;
+        TransactionLegacy txn = null;
         try {
             // explicit transaction control to avoid holding transaction during file-copy process
 
-            txn = Transaction.open(Transaction.AWSAPI_DB);
+            txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn.start();
 
             is = request.getInputStream();
@@ -1505,7 +1506,7 @@ public class S3Engine {
         context.setEvalParam( ConditionKeys.Acl, cannedAccessPolicy);
 
         verifyAccess( context, "SBucket", bucket.getId(), SAcl.PERMISSION_WRITE );  // TODO - check this validates plain POSTs
-        Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
         txn.start();
 
         // [B] If versioning is off them we over write a null object item
@@ -1554,7 +1555,7 @@ public class S3Engine {
         } 
         else 
         {    
-            Transaction txn1 = Transaction.open(Transaction.AWSAPI_DB);
+            TransactionLegacy txn1 = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
             txn1.start();
             // -> there is no object nor an object item
             object = new SObjectVO();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
index 6804dc1..3e684cc 100755
--- a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -97,6 +97,7 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -355,7 +356,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
 
     @DB
     protected boolean noDbTxn() {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         return !txn.dbTxnStarted();
     }
 
@@ -1252,7 +1253,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
 
         @Override
         protected void doTask(final Task task) throws Exception {
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+            TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
             try {
                 final Type type = task.getType();
                 if (type == Task.Type.DATA) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
index 07fa73c..204a28e 100755
--- a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
@@ -43,6 +43,8 @@ import javax.naming.ConfigurationException;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 
+import net.sf.ehcache.transaction.local.TransactionListener;
+
 import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -85,6 +87,7 @@ import com.cloud.serializer.GsonHelper;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -591,7 +594,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
 
         @Override
         protected void doTask(final Task task) throws Exception {
-            Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+            TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
             try {
                 if (task.getType() != Task.Type.DATA) {
                     super.doTask(task);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 8bf419f..51310da 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -36,7 +36,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -165,6 +164,10 @@ import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExecutionException;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -311,12 +314,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
     @Override
     @DB
-    public void allocate(String vmInstanceName, VirtualMachineTemplate template, ServiceOffering serviceOffering, Pair<? extends DiskOffering, Long> rootDiskOffering,
-        LinkedHashMap<? extends DiskOffering, Long> dataDiskOfferings, LinkedHashMap<? extends Network, ? extends NicProfile> auxiliaryNetworks, DeploymentPlan plan,
+    public void allocate(String vmInstanceName, final VirtualMachineTemplate template, ServiceOffering serviceOffering, final Pair<? extends DiskOffering, Long> rootDiskOffering,
+        LinkedHashMap<? extends DiskOffering, Long> dataDiskOfferings, final LinkedHashMap<? extends Network, ? extends NicProfile> auxiliaryNetworks, DeploymentPlan plan,
         HypervisorType hyperType) throws InsufficientCapacityException {
 
         VMInstanceVO vm = _vmDao.findVMByInstanceName(vmInstanceName);
-        Account owner = _entityMgr.findById(Account.class, vm.getAccountId());
+        final Account owner = _entityMgr.findById(Account.class, vm.getAccountId());
 
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Allocating entries for VM: " + vm);
@@ -327,46 +330,48 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             vm.setPodId(plan.getPodId());
         }
         assert (plan.getClusterId() == null && plan.getPoolId() == null) : "We currently don't support cluster and pool preset yet";
-        vm = _vmDao.persist(vm);
-
-        VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, serviceOffering, null, null);
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Allocating nics for " + vm);
-        }
-
-        try {
-            _networkMgr.allocate(vmProfile, auxiliaryNetworks);
-        } catch (ConcurrentOperationException e) {
-            throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e);
-        }
+        final VMInstanceVO vmFinal = _vmDao.persist(vm);
+        final LinkedHashMap<? extends DiskOffering, Long> dataDiskOfferingsFinal = dataDiskOfferings == null ? 
+                new LinkedHashMap<DiskOffering, Long>() : dataDiskOfferings;
 
-        if (dataDiskOfferings == null) {
-            dataDiskOfferings = new LinkedHashMap<DiskOffering, Long>(0);
-        }
 
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Allocating disks for " + vm);
-        }
+        final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmFinal, template, serviceOffering, null, null);
 
-        if (template.getFormat() == ImageFormat.ISO) {
-            volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, template, owner);
-        } else if (template.getFormat() == ImageFormat.BAREMETAL) {
-            // Do nothing
-        } else {
-            volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner);
-        }
-
-        for (Map.Entry<? extends DiskOffering, Long> offering : dataDiskOfferings.entrySet()) {
-            volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.getKey(), offering.getValue(), vm, template, owner);
-        }
+        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            @Override
+            public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Allocating nics for " + vmFinal);
+                }
+        
+                try {
+                    _networkMgr.allocate(vmProfile, auxiliaryNetworks);
+                } catch (ConcurrentOperationException e) {
+                    throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e);
+                }
+        
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Allocating disks for " + vmFinal);
+                }
+        
+                if (template.getFormat() == ImageFormat.ISO) {
+                    volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vmFinal, template, owner);
+                } else if (template.getFormat() == ImageFormat.BAREMETAL) {
+                    // Do nothing
+                } else {
+                    volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOffering.first(), template, vmFinal, owner);
+                }
+        
+                for (Map.Entry<? extends DiskOffering, Long> offering : dataDiskOfferingsFinal.entrySet()) {
+                    volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vmFinal.getId(), offering.getKey(), offering.getValue(), vmFinal, template, owner);
+                }
+                
+                return null;
+            }
+        }, InsufficientCapacityException.class);
 
-        txn.commit();
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Allocation completed for VM: " + vm);
+            s_logger.debug("Allocation completed for VM: " + vmFinal);
         }
     }
 
@@ -551,37 +556,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     @DB
-    protected Ternary<VMInstanceVO, ReservationContext, ItWorkVO> changeToStartState(VirtualMachineGuru vmGuru, VMInstanceVO vm, User caller, Account account)
+    protected Ternary<VMInstanceVO, ReservationContext, ItWorkVO> changeToStartState(VirtualMachineGuru vmGuru, final VMInstanceVO vm, final User caller, final Account account)
         throws ConcurrentOperationException {
         long vmId = vm.getId();
 
         ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId());
         int retry = VmOpLockStateRetry.value();
         while (retry-- != 0) {
-            Transaction txn = Transaction.currentTxn();
-            Ternary<VMInstanceVO, ReservationContext, ItWorkVO> result = null;
-            txn.start();
             try {
-                Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
-                work = _workDao.persist(work);
-                ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
+                final ItWorkVO workFinal = work;
+                Ternary<VMInstanceVO, ReservationContext, ItWorkVO> result = 
+                        Transaction.executeWithException(new TransactionCallbackWithException<Ternary<VMInstanceVO, ReservationContext, ItWorkVO>>() {
+                    @Override
+                    public Ternary<VMInstanceVO, ReservationContext, ItWorkVO> doInTransaction(TransactionStatus status) throws NoTransitionException {
+                        Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
+                        ItWorkVO work = _workDao.persist(workFinal);
+                        ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
+
+                        if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) {
+                            if (s_logger.isDebugEnabled()) {
+                                s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
+                            }
+                            return new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(vm, context, work);
+                        }
 
-                if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
+                        return new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(null, null, work);
                     }
-                    result = new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(vm, context, work);
-                    txn.commit();
+                }, NoTransitionException.class);
+                
+                work = result.third();
+                if (result.first() != null)
                     return result;
-                }
             } catch (NoTransitionException e) {
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("Unable to transition into Starting state due to " + e.getMessage());
                 }
-            } finally {
-                if (result == null) {
-                    txn.rollback();
-                }
             }
 
             VMInstanceVO instance = _vmDao.findById(vmId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
index 2ace8a0..4338548 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component(value="EngineDcDetailsDao")
 @Local(value=DcDetailsDao.class)
@@ -83,7 +83,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implement
 
     @Override
     public void persist(long dcId, Map<String, String> details) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         SearchCriteria<DcDetailVO> sc = DcSearch.create();
         sc.setParameters("dcId", dcId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
index e7eea6c..4251baf 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
@@ -45,7 +45,7 @@ import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -162,7 +162,7 @@ public class EngineClusterDaoImpl extends GenericDaoBase<EngineClusterVO, Long>
 
     @Override
     public Map<Long, List<Long>> getPodClusterIdMap(List<Long> clusterIds){
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
         Map<Long, List<Long>> result = new HashMap<Long, List<Long>>();
 
@@ -243,7 +243,7 @@ public class EngineClusterDaoImpl extends GenericDaoBase<EngineClusterVO, Long>
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         EngineClusterVO cluster = createForUpdate();
         cluster.setName(null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
index 5d8ef8d..de71053 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SequenceFetcher;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.net.NetUtils;
 
@@ -216,7 +216,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase<EngineDataCenterVO,
 
     @Override @DB
     public boolean update(Long zoneId, EngineDataCenterVO zone) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         boolean persisted = super.update(zoneId, zone);
         if (!persisted) {
@@ -281,7 +281,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase<EngineDataCenterVO,
 
     @Override
     public boolean remove(Long id) {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         txn.start();
         EngineDataCenterVO zone = createForUpdate();
         zone.setName(null);


[03/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 079f90c..8bdb8ee 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -139,6 +139,8 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
@@ -403,34 +405,34 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
     }
 
     @DB
-    protected VolumeVO persistVolume(Account owner, Long zoneId, String volumeName, String url, String format) {
-
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
-        volume.setPoolId(null);
-        volume.setDataCenterId(zoneId);
-        volume.setPodId(null);
-        volume.setAccountId(owner.getAccountId());
-        volume.setDomainId(owner.getDomainId());
-        long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
-        volume.setDiskOfferingId(diskOfferingId);
-        // volume.setSize(size);
-        volume.setInstanceId(null);
-        volume.setUpdated(new Date());
-        volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
-        volume.setFormat(ImageFormat.valueOf(format));
-        volume = _volsDao.persist(volume);
-        CallContext.current().setEventDetails("Volume Id: " + volume.getId());
-
-        // Increment resource count during allocation; if actual creation fails,
-        // decrement it
-        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
-        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
-
-        txn.commit();
-        return volume;
+    protected VolumeVO persistVolume(final Account owner, final Long zoneId, final String volumeName, final String url, final String format) {
+        return Transaction.execute(new TransactionCallback<VolumeVO>() {
+            @Override
+            public VolumeVO doInTransaction(TransactionStatus status) {
+                VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
+                volume.setPoolId(null);
+                volume.setDataCenterId(zoneId);
+                volume.setPodId(null);
+                volume.setAccountId(owner.getAccountId());
+                volume.setDomainId(owner.getDomainId());
+                long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
+                volume.setDiskOfferingId(diskOfferingId);
+                // volume.setSize(size);
+                volume.setInstanceId(null);
+                volume.setUpdated(new Date());
+                volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
+                volume.setFormat(ImageFormat.valueOf(format));
+                volume = _volsDao.persist(volume);
+                CallContext.current().setEventDetails("Volume Id: " + volume.getId());
+        
+                // Increment resource count during allocation; if actual creation fails,
+                // decrement it
+                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
+                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
+                
+                return volume;
+            }
+        });
     }
 
     /*
@@ -599,49 +601,57 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
             userSpecifiedName = getRandomVolumeName();
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
-        volume.setPoolId(null);
-        volume.setDataCenterId(zoneId);
-        volume.setPodId(null);
-        volume.setAccountId(ownerId);
-        volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
-        volume.setDiskOfferingId(diskOfferingId);
-        volume.setSize(size);
-        volume.setMinIops(minIops);
-        volume.setMaxIops(maxIops);
-        volume.setInstanceId(null);
-        volume.setUpdated(new Date());
-        volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
-        volume.setDisplayVolume(displayVolumeEnabled);
-        if (parentVolume != null) {
-            volume.setTemplateId(parentVolume.getTemplateId());
-            volume.setFormat(parentVolume.getFormat());
-        } else {
-            volume.setTemplateId(null);
-        }
-
-        volume = _volsDao.persist(volume);
-        if (cmd.getSnapshotId() == null) {
-            // for volume created from snapshot, create usage event after volume creation
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
-                    null, size, Volume.class.getName(), volume.getUuid());
-        }
-
-        CallContext.current().setEventDetails("Volume Id: " + volume.getId());
-
-        // Increment resource count during allocation; if actual creation fails,
-        // decrement it
-        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
-        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
-
-        txn.commit();
+        VolumeVO volume = commitVolume(cmd, caller, ownerId, displayVolumeEnabled, zoneId, diskOfferingId, size,
+                minIops, maxIops, parentVolume, userSpecifiedName);
 
         return volume;
     }
 
+    private VolumeVO commitVolume(final CreateVolumeCmd cmd, final Account caller, final long ownerId, final Boolean displayVolumeEnabled,
+            final Long zoneId, final Long diskOfferingId, final Long size, final Long minIops, final Long maxIops, final VolumeVO parentVolume,
+            final String userSpecifiedName) {
+        return Transaction.execute(new TransactionCallback<VolumeVO>() {
+            @Override
+            public VolumeVO doInTransaction(TransactionStatus status) {
+                VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
+                volume.setPoolId(null);
+                volume.setDataCenterId(zoneId);
+                volume.setPodId(null);
+                volume.setAccountId(ownerId);
+                volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
+                volume.setDiskOfferingId(diskOfferingId);
+                volume.setSize(size);
+                volume.setMinIops(minIops);
+                volume.setMaxIops(maxIops);
+                volume.setInstanceId(null);
+                volume.setUpdated(new Date());
+                volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
+                volume.setDisplayVolume(displayVolumeEnabled);
+                if (parentVolume != null) {
+                    volume.setTemplateId(parentVolume.getTemplateId());
+                    volume.setFormat(parentVolume.getFormat());
+                } else {
+                    volume.setTemplateId(null);
+                }
+        
+                volume = _volsDao.persist(volume);
+                if (cmd.getSnapshotId() == null) {
+                    // for volume created from snapshot, create usage event after volume creation
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
+                            null, size, Volume.class.getName(), volume.getUuid());
+                }
+        
+                CallContext.current().setEventDetails("Volume Id: " + volume.getId());
+        
+                // Increment resource count during allocation; if actual creation fails,
+                // decrement it
+                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
+                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
+                return volume;
+            }
+        });
+    }
+
     public boolean validateVolumeSizeRange(long size) {
         if (size < 0 || (size > 0 && size < (1024 * 1024 * 1024))) {
             throw new InvalidParameterValueException("Please specify a size of at least 1 Gb.");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
index 79aba63..9269dce 100644
--- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
+++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
@@ -66,6 +66,8 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.uuididentity.dao.IdentityDao;
 import com.cloud.vm.dao.NicDao;
@@ -254,55 +256,55 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_TAGS_CREATE, eventDescription = "creating resource tags")
-    public List<ResourceTag> createTags(List<String> resourceIds, TaggedResourceType resourceType, 
-            Map<String, String> tags, String customer) {
-        Account caller = CallContext.current().getCallingAccount();
-        
-        List<ResourceTag> resourceTags = new ArrayList<ResourceTag>(tags.size());
+    public List<ResourceTag> createTags(final List<String> resourceIds, final TaggedResourceType resourceType, 
+            final Map<String, String> tags, final String customer) {
+        final Account caller = CallContext.current().getCallingAccount();
         
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        final List<ResourceTag> resourceTags = new ArrayList<ResourceTag>(tags.size());
         
-        for (String key : tags.keySet()) {
-            for (String resourceId : resourceIds) {
-                Long id = getResourceId(resourceId, resourceType);
-                String resourceUuid = getUuid(resourceId, resourceType);
-                
-                //check if object exists
-                if (_daoMap.get(resourceType).findById(id) == null) {
-                    throw new InvalidParameterValueException("Unable to find resource by id " + resourceId + 
-                            " and type " + resourceType);
-                }
-                
-                Pair<Long, Long> accountDomainPair = getAccountDomain(id, resourceType);
-                Long domainId = accountDomainPair.second();
-                Long accountId = accountDomainPair.first();
-                if (accountId != null) {
-                    _accountMgr.checkAccess(caller, null, false, _accountMgr.getAccount(accountId));
-                } else if (domainId != null && caller.getType() != Account.ACCOUNT_TYPE_NORMAL) {
-                    //check permissions;
-                    _accountMgr.checkAccess(caller, _domainMgr.getDomain(domainId));
-                } else {
-                    throw new PermissionDeniedException("Account " + caller + " doesn't have permissions to create tags" +
-                    		" for resource " + key);
-                }
-                
-                String value = tags.get(key);
-                
-                if (value == null || value.isEmpty()) {
-                    throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (String key : tags.keySet()) {
+                    for (String resourceId : resourceIds) {
+                        Long id = getResourceId(resourceId, resourceType);
+                        String resourceUuid = getUuid(resourceId, resourceType);
+                        
+                        //check if object exists
+                        if (_daoMap.get(resourceType).findById(id) == null) {
+                            throw new InvalidParameterValueException("Unable to find resource by id " + resourceId + 
+                                    " and type " + resourceType);
+                        }
+                        
+                        Pair<Long, Long> accountDomainPair = getAccountDomain(id, resourceType);
+                        Long domainId = accountDomainPair.second();
+                        Long accountId = accountDomainPair.first();
+                        if (accountId != null) {
+                            _accountMgr.checkAccess(caller, null, false, _accountMgr.getAccount(accountId));
+                        } else if (domainId != null && caller.getType() != Account.ACCOUNT_TYPE_NORMAL) {
+                            //check permissions;
+                            _accountMgr.checkAccess(caller, _domainMgr.getDomain(domainId));
+                        } else {
+                            throw new PermissionDeniedException("Account " + caller + " doesn't have permissions to create tags" +
+                            		" for resource " + key);
+                        }
+                        
+                        String value = tags.get(key);
+                        
+                        if (value == null || value.isEmpty()) {
+                            throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+                        }
+                       
+                        ResourceTagVO resourceTag = new ResourceTagVO(key, value, accountDomainPair.first(),
+                                accountDomainPair.second(), 
+                                id, resourceType, customer, resourceUuid);
+                        resourceTag = _resourceTagDao.persist(resourceTag);
+                        resourceTags.add(resourceTag);
+                    }
                 }
-               
-                ResourceTagVO resourceTag = new ResourceTagVO(key, value, accountDomainPair.first(),
-                        accountDomainPair.second(), 
-                        id, resourceType, customer, resourceUuid);
-                resourceTag = _resourceTagDao.persist(resourceTag);
-                resourceTags.add(resourceTag);
             }
-        }
-        
-        txn.commit();
-        
+        });
+
         return resourceTags;
     }
 
@@ -354,7 +356,7 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
         sc.setParameters("resourceType", resourceType);
         
         List<? extends ResourceTag> resourceTags = _resourceTagDao.search(sc, null);;
-        List<ResourceTag> tagsToRemove = new ArrayList<ResourceTag>();
+        final List<ResourceTag> tagsToRemove = new ArrayList<ResourceTag>();
         
         // Finalize which tags should be removed
         for (ResourceTag resourceTag : resourceTags) {
@@ -390,13 +392,15 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
         }
         
         //Remove the tags
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        for (ResourceTag tagToRemove : tagsToRemove) {
-            _resourceTagDao.remove(tagToRemove.getId());
-            s_logger.debug("Removed the tag " + tagToRemove);
-        }
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (ResourceTag tagToRemove : tagsToRemove) {
+                    _resourceTagDao.remove(tagToRemove.getId());
+                    s_logger.debug("Removed the tag " + tagToRemove);
+                }
+            }
+        });
 
         return true;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index c1ce892..fb1bb27 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -31,7 +31,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.BaseListTemplateOrIsoPermissionsCmd;
 import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
@@ -177,6 +176,9 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmVO;
@@ -1163,11 +1165,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
     @DB
     @Override
     public boolean updateTemplateOrIsoPermissions(BaseUpdateTemplateOrIsoPermissionsCmd cmd) {
-        Transaction txn = Transaction.currentTxn();
-
         // Input validation
-        Long id = cmd.getId();
-        Account caller = CallContext.current().getCallingAccount();
+        final Long id = cmd.getId();
+        final Account caller = CallContext.current().getCallingAccount();
         List<String> accountNames = cmd.getAccountNames();
         List<Long> projectIds = cmd.getProjectIds();
         Boolean isFeatured = cmd.isFeatured();
@@ -1284,28 +1284,31 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
 
         //Derive the domain id from the template owner as updateTemplatePermissions is not cross domain operation
         Account owner = _accountMgr.getAccount(ownerId);
-        Domain domain = _domainDao.findById(owner.getDomainId());
+        final Domain domain = _domainDao.findById(owner.getDomainId());
         if ("add".equalsIgnoreCase(operation)) {
-            txn.start();
-            for (String accountName : accountNames) {
-                Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
-                if (permittedAccount != null) {
-                    if (permittedAccount.getId() == caller.getId()) {
-                        continue; // don't grant permission to the template
-                        // owner, they implicitly have permission
-                    }
-                    LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
-                    if (existingPermission == null) {
-                        LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
-                        _launchPermissionDao.persist(launchPermission);
+            final List<String> accountNamesFinal = accountNames; 
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    for (String accountName : accountNamesFinal) {
+                        Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
+                        if (permittedAccount != null) {
+                            if (permittedAccount.getId() == caller.getId()) {
+                                continue; // don't grant permission to the template
+                                // owner, they implicitly have permission
+                            }
+                            LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
+                            if (existingPermission == null) {
+                                LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
+                                _launchPermissionDao.persist(launchPermission);
+                            }
+                        } else {
+                            throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
+                                    + ", account not found.  " + "No permissions updated, please verify the account names and retry.");
+                        }
                     }
-                } else {
-                    txn.rollback();
-                    throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
-                            + ", account not found.  " + "No permissions updated, please verify the account names and retry.");
                 }
-            }
-            txn.commit();
+            });
         } else if ("remove".equalsIgnoreCase(operation)) {
             List<Long> accountIds = new ArrayList<Long>();
             for (String accountName : accountNames) {
@@ -1335,11 +1338,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
         if (userId == null) {
             userId = User.UID_SYSTEM;
         }
-        long templateId = command.getEntityId();
+        final long templateId = command.getEntityId();
         Long volumeId = command.getVolumeId();
         Long snapshotId = command.getSnapshotId();
         VMTemplateVO privateTemplate = null;
-        Long accountId = null;
+        final Long accountId = null;
         SnapshotVO snapshot = null;
         VolumeVO volume = null;
 
@@ -1428,26 +1431,31 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
                         zoneId, accountId, volumeId);
             }*/
             if (privateTemplate == null) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                // template_store_ref entries should have been removed using our
-                // DataObject.processEvent command in case of failure, but clean
-                // it up here to avoid
-                // some leftovers which will cause removing template from
-                // vm_template table fail.
-                _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
-                // Remove the template_zone_ref record
-                _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
-                // Remove the template record
-                _tmpltDao.expunge(templateId);
-
-                // decrement resource count
-                if (accountId != null) {
-                    _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
-                    _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volume != null ? volume.getSize()
-                            : snapshot.getSize()));
-                }
-                txn.commit();
+                final VolumeVO volumeFinal = volume;
+                final SnapshotVO snapshotFinal = snapshot;
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        // template_store_ref entries should have been removed using our
+                        // DataObject.processEvent command in case of failure, but clean
+                        // it up here to avoid
+                        // some leftovers which will cause removing template from
+                        // vm_template table fail.
+                        _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
+                        // Remove the template_zone_ref record
+                        _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
+                        // Remove the template record
+                        _tmpltDao.expunge(templateId);
+        
+                        // decrement resource count
+                        if (accountId != null) {
+                            _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
+                            _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volumeFinal != null ? volumeFinal.getSize()
+                                    : snapshotFinal.getSize()));
+                        }
+                    }
+                });
+
             }
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/test/DatabaseConfig.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java
index 38a1abf..6f76a3a 100755
--- a/server/src/com/cloud/test/DatabaseConfig.java
+++ b/server/src/com/cloud/test/DatabaseConfig.java
@@ -57,6 +57,10 @@ import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.net.NfsUtils;
 
 public class DatabaseConfig {
@@ -407,34 +411,34 @@ public class DatabaseConfig {
 
     @DB
     protected void doConfig() {
-        Transaction txn = Transaction.currentTxn();
         try {
-
-            File configFile = new File(_configFileName);
+            final File configFile = new File(_configFileName);
 
             SAXParserFactory spfactory = SAXParserFactory.newInstance();
-            SAXParser saxParser = spfactory.newSAXParser();
-            DbConfigXMLHandler handler = new DbConfigXMLHandler();
+            final SAXParser saxParser = spfactory.newSAXParser();
+            final DbConfigXMLHandler handler = new DbConfigXMLHandler();
             handler.setParent(this);
 
-            txn.start();
-
-            // Save user configured values for all fields
-            saxParser.parse(configFile, handler);
-
-            // Save default values for configuration fields
-            saveVMTemplate();
-            saveRootDomain();
-            saveDefaultConfiguations();
+            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                @Override
+                public Object doInTransaction(TransactionStatus status) throws Exception {
+                    // Save user configured values for all fields
+                    saxParser.parse(configFile, handler);
+        
+                    // Save default values for configuration fields
+                    saveVMTemplate();
+                    saveRootDomain();
+                    saveDefaultConfiguations();
+
+                    return null;
+                }
+            }, Exception.class);
 
-            txn.commit();
             // Check pod CIDRs against each other, and against the guest ip network/netmask
             pzc.checkAllPodCidrSubnets();
-
         } catch (Exception ex) {
             System.out.print("ERROR IS"+ex);
             s_logger.error("error", ex);
-            txn.rollback();
         }
     }
 
@@ -486,7 +490,7 @@ public class DatabaseConfig {
         String insertSql1 = "INSERT INTO `host` (`id`, `name`, `status` , `type` , `private_ip_address`, `private_netmask` ,`private_mac_address` , `storage_ip_address` ,`storage_netmask`, `storage_mac_address`, `data_center_id`, `version`, `dom0_memory`, `last_ping`, `resource`, `guid`, `hypervisor_type`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
         String insertSqlHostDetails = "INSERT INTO `host_details` (`id`, `host_id`, `name`, `value`) VALUES(?,?,?,?)";
         String insertSql2 = "INSERT INTO `op_host` (`id`, `sequence`) VALUES(?, ?)";
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
             stmt.setLong(1, 0);
@@ -563,7 +567,7 @@ public class DatabaseConfig {
         String hypervisor = _currentObjectParams.get("hypervisorType");
         String insertSql1 = "INSERT INTO `cluster` (`id`, `name`, `data_center_id` , `pod_id`, `hypervisor_type` , `cluster_type`, `allocation_state`) VALUES (?,?,?,?,?,?,?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
             stmt.setLong(1, id);
@@ -599,7 +603,7 @@ public class DatabaseConfig {
         String insertSql1 = "INSERT INTO `storage_pool` (`id`, `name`, `uuid` , `pool_type` , `port`, `data_center_id` ,`available_bytes` , `capacity_bytes` ,`host_address`, `path`, `created`, `pod_id`,`status` , `cluster_id`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
         // String insertSql2 = "INSERT INTO `netfs_storage_pool` VALUES (?,?,?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
             stmt.setLong(1, id);
@@ -704,7 +708,7 @@ public class DatabaseConfig {
                 "`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," +
                 "`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
             stmt.setLong(1, id);
@@ -742,7 +746,7 @@ public class DatabaseConfig {
         String insertSql1 = "INSERT INTO `virtual_router_providers` (`id`, `nsp_id`, `uuid` , `type` , `enabled`) " +
                 "VALUES (?,?,?,?,?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
             stmt.setLong(1, id);
@@ -1030,7 +1034,7 @@ public class DatabaseConfig {
         String insertNWRateSql = "UPDATE `cloud`.`service_offering` SET `nw_rate` = ?";
         String insertMCRateSql = "UPDATE `cloud`.`service_offering` SET `mc_rate` = ?";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt;
 
@@ -1109,7 +1113,7 @@ public class DatabaseConfig {
     protected void saveUser() {
         // insert system account
         String insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')";
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -1120,7 +1124,7 @@ public class DatabaseConfig {
         // insert system user
         insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, created)" +
                 " VALUES (1, 'system', RAND(), 1, 'system', 'cloud', now())";
-        txn = Transaction.currentTxn();
+        txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -1159,7 +1163,7 @@ public class DatabaseConfig {
 
         // create an account for the admin user first
         insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (" + id + ", '" + username + "', '1', '1')";
-        txn = Transaction.currentTxn();
+        txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -1171,7 +1175,7 @@ public class DatabaseConfig {
         insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, email, created) " +
                 "VALUES (" + id + ",'" + username + "','" + sb.toString() + "', 2, '" + firstname + "','" + lastname + "','" + email + "',now())";
 
-        txn = Transaction.currentTxn();
+        txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -1227,7 +1231,7 @@ public class DatabaseConfig {
 
         String selectSql = "SELECT name FROM cloud.configuration WHERE name = '" + name + "'";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
             ResultSet result = stmt.executeQuery();
@@ -1270,7 +1274,7 @@ public class DatabaseConfig {
     @DB
     protected void saveRootDomain() {
         String insertSql = "insert into `cloud`.`domain` (id, name, parent, owner, path, level) values (1, 'ROOT', NULL, 2, '/', 0)";
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
             stmt.executeUpdate();
@@ -1377,7 +1381,7 @@ public class DatabaseConfig {
     }
 
     public static String getDatabaseValueString(String selectSql, String name, String errorMsg) {
-        Transaction txn = Transaction.open("getDatabaseValueString");
+        TransactionLegacy txn = TransactionLegacy.open("getDatabaseValueString");
         PreparedStatement stmt = null;
 
         try {
@@ -1399,7 +1403,7 @@ public class DatabaseConfig {
     }
 
     public static long getDatabaseValueLong(String selectSql, String name, String errorMsg) {
-        Transaction txn = Transaction.open("getDatabaseValueLong");
+        TransactionLegacy txn = TransactionLegacy.open("getDatabaseValueLong");
         PreparedStatement stmt = null;
 
         try {
@@ -1420,7 +1424,7 @@ public class DatabaseConfig {
     }
 
     public static void saveSQL(String sql, String errorMsg) {
-        Transaction txn = Transaction.open("saveSQL");
+        TransactionLegacy txn = TransactionLegacy.open("saveSQL");
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(sql);
             stmt.executeUpdate();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/test/IPRangeConfig.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/test/IPRangeConfig.java b/server/src/com/cloud/test/IPRangeConfig.java
index 4b884f8..23ca1bb 100755
--- a/server/src/com/cloud/test/IPRangeConfig.java
+++ b/server/src/com/cloud/test/IPRangeConfig.java
@@ -29,6 +29,7 @@ import java.util.Vector;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.net.NetUtils;
 
 
@@ -303,7 +304,7 @@ public class IPRangeConfig {
             endIPLong = NetUtils.ip2Long(endIP);
         }
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         Vector<String> problemIPs = null;
         if (type.equals("public")) {
             problemIPs = deletePublicIPRange(txn, startIPLong, endIPLong, vlanDbId);
@@ -314,7 +315,7 @@ public class IPRangeConfig {
         return problemIPs;
     }
 
-    private Vector<String> deletePublicIPRange(Transaction txn, long startIP, long endIP, long vlanDbId) {
+    private Vector<String> deletePublicIPRange(TransactionLegacy txn, long startIP, long endIP, long vlanDbId) {
         String deleteSql = "DELETE FROM `cloud`.`user_ip_address` WHERE public_ip_address = ? AND vlan_id = ?";
         String isPublicIPAllocatedSelectSql = "SELECT * FROM `cloud`.`user_ip_address` WHERE public_ip_address = ? AND vlan_id = ?";
 
@@ -349,7 +350,7 @@ public class IPRangeConfig {
         return problemIPs;
     }
 
-    private Vector<String> deletePrivateIPRange(Transaction txn, long startIP, long endIP, long podId, long zoneId) {
+    private Vector<String> deletePrivateIPRange(TransactionLegacy txn, long startIP, long endIP, long podId, long zoneId) {
         String deleteSql = "DELETE FROM `cloud`.`op_dc_ip_address_alloc` WHERE ip_address = ? AND pod_id = ? AND data_center_id = ?";
         String isPrivateIPAllocatedSelectSql = "SELECT * FROM `cloud`.`op_dc_ip_address_alloc` WHERE ip_address = ? AND data_center_id = ? AND pod_id = ?";
 
@@ -429,7 +430,7 @@ public class IPRangeConfig {
             endIPLong = NetUtils.ip2Long(endIP);
         }
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         List<String> problemIPs = null;
 
         if (type.equals("public")) {
@@ -447,7 +448,7 @@ public class IPRangeConfig {
         return problemIPs;
     }
 
-    public Vector<String> savePublicIPRange(Transaction txn, long startIP, long endIP, long zoneId, long vlanDbId, Long sourceNetworkId, long physicalNetworkId) {
+    public Vector<String> savePublicIPRange(TransactionLegacy txn, long startIP, long endIP, long zoneId, long vlanDbId, Long sourceNetworkId, long physicalNetworkId) {
         String insertSql = "INSERT INTO `cloud`.`user_ip_address` (public_ip_address, data_center_id, vlan_db_id, mac_address, source_network_id, physical_network_id, uuid) VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?), ?, ?, ?)";
         String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?";
         Vector<String> problemIPs = new Vector<String>();
@@ -485,7 +486,7 @@ public class IPRangeConfig {
         return problemIPs;
     }
 
-    public List<String> savePrivateIPRange(Transaction txn, long startIP, long endIP, long podId, long zoneId) {
+    public List<String> savePrivateIPRange(TransactionLegacy txn, long startIP, long endIP, long podId, long zoneId) {
         String insertSql = "INSERT INTO `cloud`.`op_dc_ip_address_alloc` (ip_address, data_center_id, pod_id, mac_address) VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?))";
         String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?";
         Vector<String> problemIPs = new Vector<String>();
@@ -519,7 +520,7 @@ public class IPRangeConfig {
         return problemIPs;
     }
 
-    private Vector<String> saveLinkLocalPrivateIPRange(Transaction txn, long startIP, long endIP, long podId, long zoneId) {
+    private Vector<String> saveLinkLocalPrivateIPRange(TransactionLegacy txn, long startIP, long endIP, long podId, long zoneId) {
         String insertSql = "INSERT INTO `cloud`.`op_dc_link_local_ip_address_alloc` (ip_address, data_center_id, pod_id) VALUES (?, ?, ?)";
         Vector<String> problemIPs = new Vector<String>();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/test/PodZoneConfig.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/test/PodZoneConfig.java b/server/src/com/cloud/test/PodZoneConfig.java
index 59f8b6c..628c746 100644
--- a/server/src/com/cloud/test/PodZoneConfig.java
+++ b/server/src/com/cloud/test/PodZoneConfig.java
@@ -28,6 +28,7 @@ import com.cloud.network.Networks.TrafficType;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.net.NetUtils;
 
 public class PodZoneConfig {
@@ -148,7 +149,7 @@ public class PodZoneConfig {
         HashMap<Long, Vector<Object>> currentPodCidrSubnets = new HashMap<Long, Vector<Object>>();
 
         String selectSql = "SELECT id, cidr_address, cidr_size FROM host_pod_ref WHERE data_center_id=" + dcId;
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
             ResultSet rs = stmt.executeQuery();
@@ -363,7 +364,7 @@ public class PodZoneConfig {
 
         String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
 
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(insertVnet);
             for (int i = begin; i <= end; i++) {
@@ -483,7 +484,7 @@ public class PodZoneConfig {
         Vector<Long> allZoneIDs = new Vector<Long>();
 
         String selectSql = "SELECT id FROM data_center";
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         try {
             PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
             ResultSet rs = stmt.executeQuery();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/usage/UsageServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/usage/UsageServiceImpl.java b/server/src/com/cloud/usage/UsageServiceImpl.java
index 2ffb01d..e54a5b2 100755
--- a/server/src/com/cloud/usage/UsageServiceImpl.java
+++ b/server/src/com/cloud/usage/UsageServiceImpl.java
@@ -34,7 +34,6 @@ import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.usage.UsageService;
 import org.apache.cloudstack.usage.UsageTypes;
-
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -54,6 +53,7 @@ import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value = { UsageService.class })
@@ -86,7 +86,7 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
 
     @Override
     public boolean generateUsageRecords(GenerateUsageRecordsCmd cmd) {
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             UsageJobVO immediateJob = _usageJobDao.getNextImmediateJob();
             if (immediateJob == null) {
@@ -104,7 +104,7 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
             txn.close();
 
             // switch back to VMOPS_DB
-            Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+            TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
             swap.close();
         }
         return true;
@@ -199,14 +199,14 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
         }
 
         List<UsageVO> usageRecords = null;
-        Transaction txn = Transaction.open(Transaction.USAGE_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
         try {
             usageRecords = _usageDao.searchAllRecords(sc, usageFilter);
         } finally {
             txn.close();
 
             // switch back to VMOPS_DB
-            Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+            TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
             swap.close();
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java
index ae93548..c8007af 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -136,6 +136,9 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.InstanceGroupVO;
@@ -480,22 +483,23 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
     }
 
     @DB
-    public void updateLoginAttempts(Long id, int attempts, boolean toDisable) {
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+    public void updateLoginAttempts(final Long id, final int attempts, final boolean toDisable) {
         try {
-            UserAccountVO user = null;
-            user = _userAccountDao.lockRow(id, true);
-            user.setLoginAttempts(attempts);
-            if(toDisable) {
-                user.setState(State.disabled.toString());
-            }
-            _userAccountDao.update(id, user);
-             txn.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    UserAccountVO user = null;
+                    user = _userAccountDao.lockRow(id, true);
+                    user.setLoginAttempts(attempts);
+                    if(toDisable) {
+                        user.setState(State.disabled.toString());
+                    }
+                    _userAccountDao.update(id, user);
+                }
+            });
         } catch (Exception e) {
             s_logger.error("Failed to update login attempts for user with id " + id );
         }
-        txn.close();
     }
 
     private boolean doSetUserStatus(long userId, State state) {
@@ -859,8 +863,8 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         @ActionEvent(eventType = EventTypes.EVENT_ACCOUNT_CREATE, eventDescription = "creating Account"),
         @ActionEvent(eventType = EventTypes.EVENT_USER_CREATE, eventDescription = "creating User")
     })
-    public UserAccount createUserAccount(String userName, String password, String firstName, String lastName, String email, String timezone, String accountName, short accountType,
-                                         Long domainId, String networkDomain, Map<String, String> details, String accountUUID, String userUUID) {
+    public UserAccount createUserAccount(final String userName, final String password, final String firstName, final String lastName, final String email, final String timezone, String accountName, final short accountType,
+                                         Long domainId, final String networkDomain, final Map<String, String> details, String accountUUID, final String userUUID) {
 
         if (accountName == null) {
             accountName = userName;
@@ -902,31 +906,40 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        // create account
-        if(accountUUID == null){
-            accountUUID = UUID.randomUUID().toString();
-        }
-        AccountVO account = createAccount(accountName, accountType, domainId, networkDomain, details, accountUUID);
-        long accountId = account.getId();
-
-        // create the first user for the account
-        UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone, userUUID);
+        final String accountNameFinal = accountName;
+        final Long domainIdFinal = domainId;
+        final String accountUUIDFinal = accountUUID;
+        Pair<Long, Account> pair = Transaction.execute(new TransactionCallback<Pair<Long, Account>>() {
+            @Override
+            public Pair<Long, Account> doInTransaction(TransactionStatus status) {
+                // create account
+                String accountUUID = accountUUIDFinal;
+                if(accountUUID == null){
+                    accountUUID = UUID.randomUUID().toString();
+                }
+                AccountVO account = createAccount(accountNameFinal, accountType, domainIdFinal, networkDomain, details, accountUUID);
+                long accountId = account.getId();
+        
+                // create the first user for the account
+                UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone, userUUID);
+        
+                if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+                    // set registration token
+                    byte[] bytes = (domainIdFinal + accountNameFinal + userName + System.currentTimeMillis()).getBytes();
+                    String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
+                    user.setRegistrationToken(registrationToken);
+                }
+                return new Pair<Long, Account>(user.getId(), account);
+            }
+        });
 
-        if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
-            // set registration token
-            byte[] bytes = (domainId + accountName + userName + System.currentTimeMillis()).getBytes();
-            String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
-            user.setRegistrationToken(registrationToken);
-        }
-        txn.commit();
+        long userId = pair.first();
+        Account account = pair.second();
 
         CallContext.current().putContextParameter(Account.class, account.getUuid());
 
         //check success
-        return _userAccountDao.findById(user.getId());
+        return _userAccountDao.findById(userId);
     }
 
     @Override
@@ -1132,12 +1145,12 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_USER_ENABLE, eventDescription = "enabling User")
-    public UserAccount enableUser(long userId) {
+    public UserAccount enableUser(final long userId) {
 
         Account caller = CallContext.current().getCallingAccount();
 
         // Check if user exists in the system
-        User user = _userDao.findById(userId);
+        final User user = _userDao.findById(userId);
         if (user == null || user.getRemoved() != null) {
             throw new InvalidParameterValueException("Unable to find active user by id " + userId);
         }
@@ -1155,15 +1168,18 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
 
         checkAccess(caller, null, true, account);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        boolean success = doSetUserStatus(userId, State.enabled);
-
-        // make sure the account is enabled too
-        success = success && enableAccount(user.getAccountId());
+        boolean success = Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                boolean success = doSetUserStatus(userId, State.enabled);
+        
+                // make sure the account is enabled too
+                success = success && enableAccount(user.getAccountId());
+                
+                return success;
+            }
+        });
 
-        txn.commit();
 
         if (success) {
             // whenever the user is successfully enabled, reset the login attempts to zero
@@ -1390,7 +1406,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         String accountName = cmd.getAccountName();
         String newAccountName = cmd.getNewName();
         String networkDomain = cmd.getNetworkDomain();
-        Map<String, String> details = cmd.getDetails();
+        final Map<String, String> details = cmd.getDetails();
 
         boolean success = false;
         Account account = null;
@@ -1434,7 +1450,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
             }
         }
 
-        AccountVO acctForUpdate = _accountDao.findById(account.getId());
+        final AccountVO acctForUpdate = _accountDao.findById(account.getId());
         acctForUpdate.setAccountName(newAccountName);
 
         if (networkDomain != null) {
@@ -1445,16 +1461,19 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        success = _accountDao.update(account.getId(), acctForUpdate);
+        final Account accountFinal = account;
+        success = Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                boolean success = _accountDao.update(accountFinal.getId(), acctForUpdate);
 
-        if (details != null && success) {
-            _accountDetailsDao.update(account.getId(), details);
-        }
+                if (details != null && success) {
+                    _accountDetailsDao.update(accountFinal.getId(), details);
+                }
 
-        txn.commit();
+                return success;
+            }
+        });
 
         if (success) {
             CallContext.current().putContextParameter(Account.class, account.getUuid());
@@ -1706,7 +1725,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
 
     @Override
     @DB
-    public AccountVO createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map<String, String> details, String uuid) {
+    public AccountVO createAccount(final String accountName, final short accountType, final Long domainId, final String networkDomain, final Map<String, String> details, final String uuid) {
         // Validate domain
         Domain domain = _domainMgr.getDomain(domainId);
         if (domain == null) {
@@ -1747,29 +1766,30 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         }
 
         // Create the account
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-
-        AccountVO account = _accountDao.persist(new AccountVO(accountName, domainId, networkDomain, accountType, uuid));
-
-        if (account == null) {
-            throw new CloudRuntimeException("Failed to create account name " + accountName + " in domain id=" + domainId);
-        }
-
-        Long accountId = account.getId();
-
-        if (details != null) {
-            _accountDetailsDao.persist(accountId, details);
-        }
-
-        // Create resource count records for the account
-        _resourceCountDao.createResourceCounts(accountId, ResourceLimit.ResourceOwnerType.Account);
-
-        // Create default security group
-        _networkGroupMgr.createDefaultSecurityGroup(accountId);
-        txn.commit();
+        return Transaction.execute(new TransactionCallback<AccountVO>() {
+            @Override
+            public AccountVO doInTransaction(TransactionStatus status) {
+                AccountVO account = _accountDao.persist(new AccountVO(accountName, domainId, networkDomain, accountType, uuid));
+        
+                if (account == null) {
+                    throw new CloudRuntimeException("Failed to create account name " + accountName + " in domain id=" + domainId);
+                }
+        
+                Long accountId = account.getId();
+        
+                if (details != null) {
+                    _accountDetailsDao.persist(accountId, details);
+                }
+        
+                // Create resource count records for the account
+                _resourceCountDao.createResourceCounts(accountId, ResourceLimit.ResourceOwnerType.Account);
+        
+                // Create default security group
+                _networkGroupMgr.createDefaultSecurityGroup(accountId);
 
-        return account;
+                return account;
+            }
+        });
     }
 
     protected UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone, String userUUID) {
@@ -2006,7 +2026,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
     @Override @DB
     @ActionEvent(eventType = EventTypes.EVENT_REGISTER_FOR_SECRET_API_KEY, eventDescription = "register for the developer API keys")
     public String[] createApiKeyAndSecretKey(RegisterCmd cmd) {
-        Long userId = cmd.getId();
+        final Long userId = cmd.getId();
 
         User user = getUserIncludingRemoved(userId);
         if (user == null) {
@@ -2019,12 +2039,14 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
         }
 
         // generate both an api key and a secret key, update the user table with the keys, return the keys to the user
-        String[] keys = new String[2];
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        keys[0] = createUserApiKey(userId);
-        keys[1] = createUserSecretKey(userId);
-        txn.commit();
+        final String[] keys = new String[2];
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                keys[0] = createUserApiKey(userId);
+                keys[1] = createUserSecretKey(userId);
+            }
+        });
 
         return keys;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/user/DomainManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/DomainManagerImpl.java b/server/src/com/cloud/user/DomainManagerImpl.java
index b885c48..2942148 100644
--- a/server/src/com/cloud/user/DomainManagerImpl.java
+++ b/server/src/com/cloud/user/DomainManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
 import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
 import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
@@ -65,6 +64,9 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.ReservationContext;
@@ -158,7 +160,7 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
 
     @Override
     @DB
-    public Domain createDomain(String name, Long parentId, Long ownerId, String networkDomain, String domainUUID) {
+    public Domain createDomain(final String name, final Long parentId, final Long ownerId, final String networkDomain, String domainUUID) {
         // Verify network domain
         if (networkDomain != null) {
             if (!NetUtils.verifyDomainName(networkDomain)) {
@@ -181,11 +183,16 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
             domainUUID = UUID.randomUUID().toString();
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        DomainVO domain = _domainDao.create(new DomainVO(name, ownerId, parentId, networkDomain, domainUUID));
-        _resourceCountDao.createResourceCounts(domain.getId(), ResourceLimit.ResourceOwnerType.Domain);
-        txn.commit();
+        final String domainUUIDFinal = domainUUID;
+        DomainVO domain = Transaction.execute(new TransactionCallback<DomainVO>() {
+            @Override
+            public DomainVO doInTransaction(TransactionStatus status) {
+                DomainVO domain = _domainDao.create(new DomainVO(name, ownerId, parentId, networkDomain, domainUUIDFinal));
+                _resourceCountDao.createResourceCounts(domain.getId(), ResourceLimit.ResourceOwnerType.Domain);
+                return domain;
+            }
+        });
+
         CallContext.current().putContextParameter(Domain.class, domain.getUuid());
         return domain;
     }
@@ -544,12 +551,12 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
     @ActionEvent(eventType = EventTypes.EVENT_DOMAIN_UPDATE, eventDescription = "updating Domain")
     @DB
     public DomainVO updateDomain(UpdateDomainCmd cmd) {
-        Long domainId = cmd.getId();
-        String domainName = cmd.getDomainName();
-        String networkDomain = cmd.getNetworkDomain();
+        final Long domainId = cmd.getId();
+        final String domainName = cmd.getDomainName();
+        final String networkDomain = cmd.getNetworkDomain();
 
         // check if domain exists in the system
-        DomainVO domain = _domainDao.findById(domainId);
+        final DomainVO domain = _domainDao.findById(domainId);
         if (domain == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find domain with specified domain id");
             ex.addProxyObject(domainId.toString(), "domainId");
@@ -587,27 +594,28 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
             }
         }
 
-        Transaction txn = Transaction.currentTxn();
-
-        txn.start();
-
-        if (domainName != null) {
-            String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
-            updateDomainChildren(domain, updatedDomainPath);
-            domain.setName(domainName);
-            domain.setPath(updatedDomainPath);
-        }
-
-        if (networkDomain != null) {
-            if (networkDomain.isEmpty()) {
-                domain.setNetworkDomain(null);
-            } else {
-                domain.setNetworkDomain(networkDomain);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                if (domainName != null) {
+                    String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
+                    updateDomainChildren(domain, updatedDomainPath);
+                    domain.setName(domainName);
+                    domain.setPath(updatedDomainPath);
+                }
+        
+                if (networkDomain != null) {
+                    if (networkDomain.isEmpty()) {
+                        domain.setNetworkDomain(null);
+                    } else {
+                        domain.setNetworkDomain(networkDomain);
+                    }
+                }
+                _domainDao.update(domainId, domain);
+                CallContext.current().putContextParameter(Domain.class, domain.getUuid());
             }
-        }
-        _domainDao.update(domainId, domain);
-        CallContext.current().putContextParameter(Domain.class, domain.getUuid());
-        txn.commit();
+        });
+
 
         return _domainDao.findById(domainId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
index 18b7d8b..7e14c69 100644
--- a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
+++ b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
 
 @Component
 @Local(value={IdentityDao.class})
@@ -48,7 +49,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
 		assert(identityString != null);
 
         PreparedStatement pstmt = null;
-		Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
 		try {
 	        try {
 	            try {
@@ -100,7 +101,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
         assert(tableName != null);
         
         PreparedStatement pstmt = null;
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             Long domainId = null;
             Long accountId = null;
@@ -146,7 +147,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
 		assert(identityString != null);
 		
         PreparedStatement pstmt = null;
-		Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
 		try {
 	        try {
 	            pstmt = txn.prepareAutoCloseStatement(
@@ -187,7 +188,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
         assert(tableName != null);
         List<Long> l = getNullUuidRecords(tableName);
         
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             try {
                 txn.start();
@@ -209,7 +210,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
         List<Long> l = new ArrayList<Long>();
         
         PreparedStatement pstmt = null;
-        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+        TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
         try {
             try {
                 pstmt = txn.prepareAutoCloseStatement(
@@ -231,7 +232,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
     
     @DB
     void setInitialUuid(String tableName, long id) throws SQLException {
-        Transaction txn = Transaction.currentTxn();
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
         
         PreparedStatement pstmtUpdate = null;
         pstmtUpdate = txn.prepareAutoCloseStatement(


[08/20] New Transaction API

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index 55da113..65bc699 100755
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -22,7 +22,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 
 import com.cloud.dc.DataCenter;
@@ -33,6 +32,7 @@ import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.network.IpAddressManager;
@@ -56,6 +56,10 @@ import com.cloud.user.Account;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.ExceptionUtil;
 import com.cloud.vm.Nic;
 import com.cloud.vm.Nic.ReservationStrategy;
 import com.cloud.vm.NicProfile;
@@ -228,22 +232,32 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
     }
 
     @DB
-    protected void allocateDirectIp(NicProfile nic, Network network, VirtualMachineProfile vm, DataCenter dc, String requestedIp4Addr, String requestedIp6Addr)
+    protected void allocateDirectIp(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DataCenter dc, final String requestedIp4Addr, final String requestedIp6Addr)
             throws InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException {
-        
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
-        //save the placeholder nic if the vm is the Virtual router
-        if (vm.getType() == VirtualMachine.Type.DomainRouter) {
-            Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
-            if (placeholderNic == null) {
-                s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() + " for the network " + network);
-                _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
-            }
+
+        try {
+            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                @Override
+                public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+                    _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
+                    //save the placeholder nic if the vm is the Virtual router
+                    if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+                        Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+                        if (placeholderNic == null) {
+                            s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() + " for the network " + network);
+                            _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
+                        }
+                    }
+                    
+                    return null;
+                }
+            }, InsufficientCapacityException.class);
+        } catch (InsufficientCapacityException e) {
+            ExceptionUtil.rethrow(e, InsufficientVirtualNetworkCapcityException.class);
+            ExceptionUtil.rethrow(e, InsufficientAddressCapacityException.class);
+            throw new IllegalStateException(e);
         }
-        txn.commit();
     }
 
     @Override
@@ -257,37 +271,37 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
     }
 
     @Override @DB
-    public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) {
+    public void deallocate(final Network network, final NicProfile nic, VirtualMachineProfile vm) {
     	if (s_logger.isDebugEnabled()) {
             s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
         }
     	
     	if (nic.getIp4Address() != null) {
-            IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+            final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
             if (ip != null) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                
-                // if the ip address a part of placeholder, don't release it
-                Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
-                if (placeholderNic != null && placeholderNic.getIp4Address().equalsIgnoreCase(ip.getAddress().addr())) {
-                    s_logger.debug("Not releasing direct ip " + ip.getId() +" yet as its ip is saved in the placeholder");
-                } else {
-                    _ipAddrMgr.markIpAsUnavailable(ip.getId());
-                    _ipAddressDao.unassignIpAddress(ip.getId());
-                }
-               
-                //unassign nic secondary ip address
-                s_logger.debug("remove nic " + nic.getId() + " secondary ip ");
-                List<String> nicSecIps = null;
-                nicSecIps = _nicSecondaryIpDao.getSecondaryIpAddressesForNic(nic.getId());
-                for (String secIp: nicSecIps) {
-                    IPAddressVO pubIp = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), secIp);
-                    _ipAddrMgr.markIpAsUnavailable(pubIp.getId());
-                    _ipAddressDao.unassignIpAddress(pubIp.getId());
-                }
-    
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        // if the ip address a part of placeholder, don't release it
+                        Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+                        if (placeholderNic != null && placeholderNic.getIp4Address().equalsIgnoreCase(ip.getAddress().addr())) {
+                            s_logger.debug("Not releasing direct ip " + ip.getId() +" yet as its ip is saved in the placeholder");
+                        } else {
+                            _ipAddrMgr.markIpAsUnavailable(ip.getId());
+                            _ipAddressDao.unassignIpAddress(ip.getId());
+                        }
+                       
+                        //unassign nic secondary ip address
+                        s_logger.debug("remove nic " + nic.getId() + " secondary ip ");
+                        List<String> nicSecIps = null;
+                        nicSecIps = _nicSecondaryIpDao.getSecondaryIpAddressesForNic(nic.getId());
+                        for (String secIp: nicSecIps) {
+                            IPAddressVO pubIp = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), secIp);
+                            _ipAddrMgr.markIpAsUnavailable(pubIp.getId());
+                            _ipAddressDao.unassignIpAddress(pubIp.getId());
+                        }
+                    }
+                });
             }
     	}
     	
@@ -305,21 +319,23 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
     @DB
     public boolean trash(Network network, NetworkOffering offering) {
         //Have to remove all placeholder nics
-        List<NicVO> nics = _nicDao.listPlaceholderNicsByNetworkId(network.getId());
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        for (Nic nic : nics) {
-            if (nic.getIp4Address() != null) {
-                s_logger.debug("Releasing ip " + nic.getIp4Address() + " of placeholder nic " + nic);
-                IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
-                _ipAddrMgr.markIpAsUnavailable(ip.getId());
-                _ipAddressDao.unassignIpAddress(ip.getId());
-                s_logger.debug("Removing placeholder nic " + nic);
-                _nicDao.remove(nic.getId());
+        final List<NicVO> nics = _nicDao.listPlaceholderNicsByNetworkId(network.getId());
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (Nic nic : nics) {
+                    if (nic.getIp4Address() != null) {
+                        s_logger.debug("Releasing ip " + nic.getIp4Address() + " of placeholder nic " + nic);
+                        IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+                        _ipAddrMgr.markIpAsUnavailable(ip.getId());
+                        _ipAddressDao.unassignIpAddress(ip.getId());
+                        s_logger.debug("Removing placeholder nic " + nic);
+                        _nicDao.remove(nic.getId());
+                    }
+                }
             }
-        }
-        
-        txn.commit();
+        });
+
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
index 31bc021..691135f 100755
--- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -23,7 +23,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 
 import com.cloud.configuration.ZoneConfig;
@@ -53,6 +52,10 @@ import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.Nic;
 import com.cloud.vm.Nic.ReservationStrategy;
@@ -133,18 +136,18 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
             getNewIp = true;
         } else {
             // we need to get a new ip address if we try to deploy a vm in a different pod
-            IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
+            final IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
             if (ipVO != null) {
                 PodVlanMapVO mapVO = _podVlanDao.listPodVlanMapsByVlan(ipVO.getVlanId());
                 if (mapVO.getPodId() != dest.getPod().getId()) {
-                    Transaction txn = Transaction.currentTxn();
-                    txn.start();
-
-                    //release the old ip here
-                    _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
-                    _ipAddressDao.unassignIpAddress(ipVO.getId());
-
-                    txn.commit();
+                    Transaction.execute(new TransactionCallbackNoReturn() {
+                        @Override
+                        public void doInTransactionWithoutResult(TransactionStatus status) {
+                            //release the old ip here
+                            _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
+                            _ipAddressDao.unassignIpAddress(ipVO.getId());
+                        }
+                    });
 
                     nic.setIp4Address(null);
                     getNewIp = true;
@@ -163,54 +166,57 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
     }
 
     @DB
-    protected void getIp(NicProfile nic, Pod pod, VirtualMachineProfile vm, Network network) throws InsufficientVirtualNetworkCapcityException,
+    protected void getIp(final NicProfile nic, final Pod pod, final VirtualMachineProfile vm, final Network network) throws InsufficientVirtualNetworkCapcityException,
             InsufficientAddressCapacityException, ConcurrentOperationException {
-        DataCenter dc = _dcDao.findById(pod.getDataCenterId());
+        final DataCenter dc = _dcDao.findById(pod.getDataCenterId());
         if (nic.getIp4Address() == null) {
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-            
-            PublicIp ip = null;
-            List<PodVlanMapVO> podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId());
-            String podRangeGateway = null;
-            if (!podRefs.isEmpty()) {
-                podRangeGateway = _vlanDao.findById(podRefs.get(0).getVlanDbId()).getVlanGateway();
-            }
-            //Get ip address from the placeholder and don't allocate a new one
-            if (vm.getType() == VirtualMachine.Type.DomainRouter) {
-                Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
-                if (placeholderNic != null) {
-                    IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
-                    ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
-                    s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network + " and gateway " + podRangeGateway);
+            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                @Override
+                public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+                    PublicIp ip = null;
+                    List<PodVlanMapVO> podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId());
+                    String podRangeGateway = null;
+                    if (!podRefs.isEmpty()) {
+                        podRangeGateway = _vlanDao.findById(podRefs.get(0).getVlanDbId()).getVlanGateway();
+                    }
+                    //Get ip address from the placeholder and don't allocate a new one
+                    if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+                        Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
+                        if (placeholderNic != null) {
+                            IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
+                            ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+                            s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network + " and gateway " + podRangeGateway);
+                        }
+                    }
+                    
+                    if (ip == null) {
+                        ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), null, false);
+                    }
+                    
+                    nic.setIp4Address(ip.getAddress().toString());
+                    nic.setFormat(AddressFormat.Ip4);
+                    nic.setGateway(ip.getGateway());
+                    nic.setNetmask(ip.getNetmask());
+                    if (ip.getVlanTag() != null && ip.getVlanTag().equalsIgnoreCase(Vlan.UNTAGGED)) {
+                        nic.setIsolationUri(IsolationType.Ec2.toUri(Vlan.UNTAGGED));
+                        nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED));
+                        nic.setBroadcastType(BroadcastDomainType.Native);
+                    }
+                    nic.setReservationId(String.valueOf(ip.getVlanTag()));
+                    nic.setMacAddress(ip.getMacAddress());
+                    
+                    //save the placeholder nic if the vm is the Virtual router
+                    if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+                        Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
+                        if (placeholderNic == null) {
+                            s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " for the network " + network);
+                            _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter);
+                        }
+                    }
+                    
+                    return null;
                 }
-            }
-            
-            if (ip == null) {
-                ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), null, false);
-            }
-            
-            nic.setIp4Address(ip.getAddress().toString());
-            nic.setFormat(AddressFormat.Ip4);
-            nic.setGateway(ip.getGateway());
-            nic.setNetmask(ip.getNetmask());
-            if (ip.getVlanTag() != null && ip.getVlanTag().equalsIgnoreCase(Vlan.UNTAGGED)) {
-                nic.setIsolationUri(IsolationType.Ec2.toUri(Vlan.UNTAGGED));
-                nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED));
-                nic.setBroadcastType(BroadcastDomainType.Native);
-            }
-            nic.setReservationId(String.valueOf(ip.getVlanTag()));
-            nic.setMacAddress(ip.getMacAddress());
-            
-            //save the placeholder nic if the vm is the Virtual router
-            if (vm.getType() == VirtualMachine.Type.DomainRouter) {
-                Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
-                if (placeholderNic == null) {
-                    s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " for the network " + network);
-                    _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter);
-                }
-            }
-            txn.commit();
+            }, InsufficientAddressCapacityException.class);
         }
         nic.setDns1(dc.getDns1());
         nic.setDns2(dc.getDns2());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
index 20b0ce5..85728c2 100755
--- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
@@ -24,7 +24,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -70,6 +69,8 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.Nic.ReservationStrategy;
@@ -223,13 +224,15 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
                 s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
             }
 
-            IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+            final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
             if (ip != null) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                _ipAddrMgr.markIpAsUnavailable(ip.getId());
-                _ipAddressDao.unassignIpAddress(ip.getId());
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                    _ipAddrMgr.markIpAsUnavailable(ip.getId());
+                    _ipAddressDao.unassignIpAddress(ip.getId());
+                    }
+                });
             }
             nic.deallocate();
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/PublicNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
index f82e22e..6fed1a6 100755
--- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
@@ -20,7 +20,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 
 import com.cloud.dc.DataCenter;
@@ -50,6 +49,8 @@ import com.cloud.user.Account;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.Nic.ReservationStrategy;
 import com.cloud.vm.NicProfile;
@@ -192,16 +193,15 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
             s_logger.debug("public network deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
         }
 
-        IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+        final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
         if (ip != null && nic.getReservationStrategy() != ReservationStrategy.Managed) {
-
-            Transaction txn = Transaction.currentTxn();
-            txn.start();
-
-            _ipAddrMgr.markIpAsUnavailable(ip.getId());
-            _ipAddressDao.unassignIpAddress(ip.getId());
-
-            txn.commit();
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(TransactionStatus status) {
+                    _ipAddrMgr.markIpAsUnavailable(ip.getId());
+                    _ipAddressDao.unassignIpAddress(ip.getId());
+                }
+            });
         }
         nic.deallocate();
         

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index c685ee3..60bb40b 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -152,6 +152,10 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
@@ -379,11 +383,11 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
     @Override
     @DB
-    public boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException {
-        AutoScaleVmGroupVO vmGroup = _autoScaleVmGroupDao.findById(vmGroupid);
+    public boolean configureLbAutoScaleVmGroup(final long vmGroupid, String currentState) throws ResourceUnavailableException {
+        final AutoScaleVmGroupVO vmGroup = _autoScaleVmGroupDao.findById(vmGroupid);
         boolean success = false;
 
-        LoadBalancerVO loadBalancer = _lbDao.findById(vmGroup.getLoadBalancerId());
+        final LoadBalancerVO loadBalancer = _lbDao.findById(vmGroup.getLoadBalancerId());
 
         FirewallRule.State backupState = loadBalancer.getState();
 
@@ -416,14 +420,17 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
         if (success) {
             if (vmGroup.getState().equals(AutoScaleVmGroup.State_New)) {
-                Transaction.currentTxn().start();
-                loadBalancer.setState(FirewallRule.State.Active);
-                s_logger.debug("LB rule " + loadBalancer.getId() + " state is set to Active");
-                _lbDao.persist(loadBalancer);
-                vmGroup.setState(AutoScaleVmGroup.State_Enabled);
-                _autoScaleVmGroupDao.persist(vmGroup);
-                s_logger.debug("LB Auto Scale Vm Group with Id: " + vmGroupid + " is set to Enabled state.");
-                Transaction.currentTxn().commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        loadBalancer.setState(FirewallRule.State.Active);
+                        s_logger.debug("LB rule " + loadBalancer.getId() + " state is set to Active");
+                        _lbDao.persist(loadBalancer);
+                        vmGroup.setState(AutoScaleVmGroup.State_Enabled);
+                        _autoScaleVmGroupDao.persist(vmGroup);
+                        s_logger.debug("LB Auto Scale Vm Group with Id: " + vmGroupid + " is set to Enabled state.");
+                    }
+                });
             }
             s_logger.info("Successfully configured LB Autoscale Vm Group with Id: " + vmGroupid);
         }
@@ -813,7 +820,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             throw new InvalidParameterException("Invalid Load balancer : " + healthCheckPolicy.getLoadBalancerId()
                     + " for HealthCheck policy id: " + healthCheckPolicyId);
         }
-        long loadBalancerId = loadBalancer.getId();
+        final long loadBalancerId = loadBalancer.getId();
         FirewallRule.State backupState = loadBalancer.getState();
         _accountMgr.checkAccess(caller.getCallingAccount(), null, true, loadBalancer);
 
@@ -830,17 +837,19 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                     + ", healthCheckpolicyID " + healthCheckPolicyId);
 
             // removing the state of services set by the monitor.
-            List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
+            final List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
             if (maps != null) {
-                Transaction txn = Transaction.currentTxn();
-                txn.start();
-                s_logger.debug("Resetting health state policy for services in loadbalancing rule id : "
-                        + loadBalancerId);
-                for (LoadBalancerVMMapVO map : maps) {
-                    map.setState(null);
-                    _lb2VmMapDao.persist(map);
-                }
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        s_logger.debug("Resetting health state policy for services in loadbalancing rule id : "
+                                + loadBalancerId);
+                        for (LoadBalancerVMMapVO map : maps) {
+                            map.setState(null);
+                            _lb2VmMapDao.persist(map);
+                        }
+                    }
+                });
             }
 
             try {
@@ -957,7 +966,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         CallContext ctx = CallContext.current();
         Account caller = ctx.getCallingAccount();
 
-        LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId);
+        final LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId);
         if (loadBalancer == null) {
             throw new InvalidParameterValueException("Failed to assign to load balancer " + loadBalancerId
                     + ", the load balancer was not found.");
@@ -969,7 +978,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             mappedInstanceIds.add(Long.valueOf(mappedInstance.getInstanceId()));
         }
 
-        List<UserVm> vmsToAdd = new ArrayList<UserVm>();
+        final List<UserVm> vmsToAdd = new ArrayList<UserVm>();
         
         if (instanceIds == null || instanceIds.isEmpty()) {
             s_logger.warn("List of vms to assign to the lb, is empty");
@@ -1022,13 +1031,16 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             vmsToAdd.add(vm);
         }
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        for (UserVm vm : vmsToAdd) {
-            LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false);
-            map = _lb2VmMapDao.persist(map);
-        }
-        txn.commit();
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (UserVm vm : vmsToAdd) {
+                    LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false);
+                    map = _lb2VmMapDao.persist(map);
+                }
+            }
+        });
+
         if (_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancerId)) {
             // For autoscaled loadbalancer, the rules need not be applied,
             // meaning the call need not reach the resource layer.
@@ -1044,13 +1056,15 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             success = true;
         } catch (ResourceUnavailableException e) {
             if (isRollBackAllowedForProvider(loadBalancer)) {
-                List<Long> vmInstanceIds = new ArrayList<Long>();
-                txn = Transaction.currentTxn();
-                txn.start();
-                for (UserVm vm : vmsToAdd) {
-                    vmInstanceIds.add(vm.getId());
-                }
-                txn.commit();
+                final List<Long> vmInstanceIds = new ArrayList<Long>();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        for (UserVm vm : vmsToAdd) {
+                            vmInstanceIds.add(vm.getId());
+                        }
+                    }
+                });
                 if (!vmInstanceIds.isEmpty()) {
                     _lb2VmMapDao.remove(loadBalancer.getId(), vmInstanceIds, null);
                     s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + "  while attaching VM: "
@@ -1203,49 +1217,52 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     }
 
     @DB
-    public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply, Account caller, long callerUserId,
+    public boolean deleteLoadBalancerRule(final long loadBalancerId, boolean apply, Account caller, long callerUserId,
             boolean rollBack) {
-        LoadBalancerVO lb = _lbDao.findById(loadBalancerId);
-        Transaction txn = Transaction.currentTxn();
-        boolean generateUsageEvent = false;
-        boolean success = true;
+        final LoadBalancerVO lb = _lbDao.findById(loadBalancerId);
         FirewallRule.State backupState = lb.getState();
 
-        txn.start();
-        if (lb.getState() == FirewallRule.State.Staged) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb);
-            }
-            generateUsageEvent = true;
-        } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) {
-            lb.setState(FirewallRule.State.Revoke);
-            _lbDao.persist(lb);
-            generateUsageEvent = true;
-        }
-        List<LoadBalancerVMMapVO> backupMaps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
-        List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
-        if (maps != null) {
-            for (LoadBalancerVMMapVO map : maps) {
-                map.setRevoke(true);
-                _lb2VmMapDao.persist(map);
-                s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId "
-                        + map.getInstanceId());
+        List<LoadBalancerVMMapVO> backupMaps = Transaction.execute(new TransactionCallback<List<LoadBalancerVMMapVO>>() {
+            @Override
+            public List<LoadBalancerVMMapVO> doInTransaction(TransactionStatus status) {
+                boolean generateUsageEvent = false;
+        
+                if (lb.getState() == FirewallRule.State.Staged) {
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb);
+                    }
+                    generateUsageEvent = true;
+                } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) {
+                    lb.setState(FirewallRule.State.Revoke);
+                    _lbDao.persist(lb);
+                    generateUsageEvent = true;
+                }
+                List<LoadBalancerVMMapVO> backupMaps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
+                List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
+                if (maps != null) {
+                    for (LoadBalancerVMMapVO map : maps) {
+                        map.setRevoke(true);
+                        _lb2VmMapDao.persist(map);
+                        s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId "
+                                + map.getInstanceId());
+                    }
+                }
+        
+                List<LBHealthCheckPolicyVO> hcPolicies = _lb2healthcheckDao.listByLoadBalancerId(loadBalancerId);
+                for (LBHealthCheckPolicyVO lbHealthCheck : hcPolicies) {
+                    lbHealthCheck.setRevoke(true);
+                    _lb2healthcheckDao.persist(lbHealthCheck);
+                }
+        
+                if (generateUsageEvent) {
+                    // Generate usage event right after all rules were marked for revoke
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(),
+                            null, LoadBalancingRule.class.getName(), lb.getUuid());
+                }
+                
+                return backupMaps;
             }
-        }
-
-        List<LBHealthCheckPolicyVO> hcPolicies = _lb2healthcheckDao.listByLoadBalancerId(loadBalancerId);
-        for (LBHealthCheckPolicyVO lbHealthCheck : hcPolicies) {
-            lbHealthCheck.setRevoke(true);
-            _lb2healthcheckDao.persist(lbHealthCheck);
-        }
-
-        if (generateUsageEvent) {
-            // Generate usage event right after all rules were marked for revoke
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(),
-                    null, LoadBalancingRule.class.getName(), lb.getUuid());
-        }
-
-        txn.commit();
+        });
 
         // gather external network usage stats for this lb rule
         NetworkVO network = _networkDao.findById(lb.getNetworkId());
@@ -1283,7 +1300,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         if (relatedRule != null) {
             s_logger.warn("Unable to remove firewall rule id=" + lb.getId() + " as it has related firewall rule id="
                     + relatedRule.getId() + "; leaving it in Revoke state");
-            success = false;
+            return false;
         } else {
             _firewallMgr.removeRule(lb);
         }
@@ -1293,11 +1310,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         // Bug CS-15411 opened to document this
         // _elbMgr.handleDeleteLoadBalancerRule(lb, callerUserId, caller);
 
-        if (success) {
-            s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");
-        }
-
-        return success;
+        s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");
+        
+        return true;
     }
 
     @Override
@@ -1392,8 +1407,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
     @DB
     @Override
-    public LoadBalancer createPublicLoadBalancer(String xId, String name, String description,
-            int srcPort, int destPort, long sourceIpId, String protocol, String algorithm, boolean openFirewall, CallContext caller)
+    public LoadBalancer createPublicLoadBalancer(final String xId, final String name, final String description,
+            final int srcPort, final int destPort, final long sourceIpId, final String protocol, final String algorithm, final boolean openFirewall, final CallContext caller)
             throws NetworkRuleConflictException {
         
         if (!NetUtils.isValidPort(destPort)) {
@@ -1404,7 +1419,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             throw new InvalidParameterValueException("Invalid algorithm: " + algorithm);
         }
 
-        IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId);
+        final IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId);
         // make sure ip address exists
         if (ipAddr == null || !ipAddr.readyToUse()) {
             InvalidParameterValueException ex = new InvalidParameterValueException(
@@ -1426,7 +1441,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         _accountMgr.checkAccess(caller.getCallingAccount(), null, true, ipAddr);
 
 
-        Long networkId = ipAddr.getAssociatedWithNetworkId();
+        final Long networkId = ipAddr.getAssociatedWithNetworkId();
         if (networkId == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException(
                     "Unable to create load balancer rule ; specified sourceip id is not associated with any network");
@@ -1440,61 +1455,60 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         _firewallMgr.validateFirewallRule(caller.getCallingAccount(), ipAddr, srcPort, srcPort, protocol,
                 Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
 
-        LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
-                sourceIpId, srcPort, destPort, algorithm,
-                networkId, ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
 
-        // verify rule is supported by Lb provider of the network
-        Ip sourceIp = getSourceIp(newRule);
-        LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
-                new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>(), sourceIp);
-        if (!validateLbRule(loadBalancing)) {
-            throw new InvalidParameterValueException("LB service provider cannot support this rule");
-        }
+        return Transaction.executeWithException(new TransactionCallbackWithException<LoadBalancerVO>() {
+            @Override
+            public LoadBalancerVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+                LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
+                        sourceIpId, srcPort, destPort, algorithm,
+                        networkId, ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
-        
-        newRule = _lbDao.persist(newRule);
-
-        //create rule for all CIDRs
-        if (openFirewall) {
-            _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCallingAccount(), srcPort,
-                    srcPort, protocol, null, null, newRule.getId(), networkId);
-        }
-
-        boolean success = true;
+                // verify rule is supported by Lb provider of the network
+                Ip sourceIp = getSourceIp(newRule);
+                LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
+                        new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>(), sourceIp);
+                if (!validateLbRule(loadBalancing)) {
+                    throw new InvalidParameterValueException("LB service provider cannot support this rule");
+                }
 
-        try {
-            _firewallMgr.detectRulesConflict(newRule);
-            if (!_firewallDao.setStateToAdd(newRule)) {
-                throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
-            }
-            s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port "
-                    + srcPort + ", private port " + destPort + " is added successfully.");
-            CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
-            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(),
-                    ipAddr.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
-                    newRule.getUuid());
-            txn.commit();
-
-            return newRule;
-        } catch (Exception e) {
-            success = false;
-            if (e instanceof NetworkRuleConflictException) {
-                throw (NetworkRuleConflictException) e;
+                newRule = _lbDao.persist(newRule);
+        
+                //create rule for all CIDRs
+                if (openFirewall) {
+                    _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCallingAccount(), srcPort,
+                            srcPort, protocol, null, null, newRule.getId(), networkId);
+                }
+        
+                boolean success = true;
+        
+                try {
+                    _firewallMgr.detectRulesConflict(newRule);
+                    if (!_firewallDao.setStateToAdd(newRule)) {
+                        throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+                    }
+                    s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port "
+                            + srcPort + ", private port " + destPort + " is added successfully.");
+                    CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
+                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(),
+                            ipAddr.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
+                            newRule.getUuid());
+        
+                    return newRule;
+                } catch (Exception e) {
+                    success = false;
+                    if (e instanceof NetworkRuleConflictException) {
+                        throw (NetworkRuleConflictException) e;
+                    }
+                    throw new CloudRuntimeException("Unable to add rule for ip address id=" + newRule.getSourceIpAddressId(), e);
+                } finally {
+                    if (!success && newRule != null) {
+                        _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
+                        removeLBRule(newRule);
+                    }
+                }
             }
-            throw new CloudRuntimeException("Unable to add rule for ip address id=" + newRule.getSourceIpAddressId(), e);
-        } finally {
-            if (!success && newRule != null) {
+        }, NetworkRuleConflictException.class);
 
-                txn.start();
-                _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
-                removeLBRule(newRule);
-
-                txn.commit();
-            }
-        }
     }
 
     @Override
@@ -1583,7 +1597,6 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     @DB
     protected boolean applyLoadBalancerRules(List<LoadBalancerVO> lbs, boolean updateRulesInDB)
             throws ResourceUnavailableException {
-        Transaction txn = Transaction.currentTxn();
         List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
         for (LoadBalancerVO lb : lbs) {
             rules.add(getLoadBalancerRuleToApply(lb));
@@ -1595,57 +1608,63 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         }
 
         if (updateRulesInDB) {
-            for (LoadBalancerVO lb : lbs) {
-                boolean checkForReleaseElasticIp = false;
-                txn.start();
-                if (lb.getState() == FirewallRule.State.Revoke) {
-                    removeLBRule(lb);
-                    s_logger.debug("LB " + lb.getId() + " is successfully removed");
-                    checkForReleaseElasticIp = true;
-                } else if (lb.getState() == FirewallRule.State.Add) {
-                    lb.setState(FirewallRule.State.Active);
-                    s_logger.debug("LB rule " + lb.getId() + " state is set to Active");
-                    _lbDao.persist(lb);
-                }
-
-                // remove LB-Vm mappings that were state to revoke
-                List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true);
-                List<Long> instanceIds = new ArrayList<Long>();
-
-                for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
-                    instanceIds.add(lbVmMap.getInstanceId());
-                }
-
-                if (!instanceIds.isEmpty()) {
-                    _lb2VmMapDao.remove(lb.getId(), instanceIds, null);
-                    s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds);
-                }
-
-                if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) {
-                    lb.setState(FirewallRule.State.Add);
-                    _lbDao.persist(lb);
-                    s_logger.debug("LB rule " + lb.getId()
-                            + " state is set to Add as there are no more active LB-VM mappings");
-                }
-
-                // remove LB-Stickiness policy mapping that were state to revoke
-                List<LBStickinessPolicyVO> stickinesspolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(
-                        lb.getId(), true);
-                if (!stickinesspolicies.isEmpty()) {
-                    _lb2stickinesspoliciesDao.remove(lb.getId(), true);
-                    s_logger.debug("Load balancer rule id " + lb.getId() + " is removed stickiness policies");
-                }
-
-                // remove LB-HealthCheck policy mapping that were state to
-                // revoke
-                List<LBHealthCheckPolicyVO> healthCheckpolicies = _lb2healthcheckDao.listByLoadBalancerId(lb.getId(),
-                        true);
-                if (!healthCheckpolicies.isEmpty()) {
-                    _lb2healthcheckDao.remove(lb.getId(), true);
-                    s_logger.debug("Load balancer rule id " + lb.getId() + " is removed health check monitors policies");
-                }
+            for (final LoadBalancerVO lb : lbs) {
+                boolean checkForReleaseElasticIp = Transaction.execute(new TransactionCallback<Boolean>() {
+                    @Override
+                    public Boolean doInTransaction(TransactionStatus status) {
+                        boolean checkForReleaseElasticIp = false;
+
+                        if (lb.getState() == FirewallRule.State.Revoke) {
+                            removeLBRule(lb);
+                            s_logger.debug("LB " + lb.getId() + " is successfully removed");
+                            checkForReleaseElasticIp = true;
+                        } else if (lb.getState() == FirewallRule.State.Add) {
+                            lb.setState(FirewallRule.State.Active);
+                            s_logger.debug("LB rule " + lb.getId() + " state is set to Active");
+                            _lbDao.persist(lb);
+                        }
+        
+                        // remove LB-Vm mappings that were state to revoke
+                        List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true);
+                        List<Long> instanceIds = new ArrayList<Long>();
+        
+                        for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
+                            instanceIds.add(lbVmMap.getInstanceId());
+                        }
+        
+                        if (!instanceIds.isEmpty()) {
+                            _lb2VmMapDao.remove(lb.getId(), instanceIds, null);
+                            s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds);
+                        }
+        
+                        if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) {
+                            lb.setState(FirewallRule.State.Add);
+                            _lbDao.persist(lb);
+                            s_logger.debug("LB rule " + lb.getId()
+                                    + " state is set to Add as there are no more active LB-VM mappings");
+                        }
+        
+                        // remove LB-Stickiness policy mapping that were state to revoke
+                        List<LBStickinessPolicyVO> stickinesspolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(
+                                lb.getId(), true);
+                        if (!stickinesspolicies.isEmpty()) {
+                            _lb2stickinesspoliciesDao.remove(lb.getId(), true);
+                            s_logger.debug("Load balancer rule id " + lb.getId() + " is removed stickiness policies");
+                        }
+        
+                        // remove LB-HealthCheck policy mapping that were state to
+                        // revoke
+                        List<LBHealthCheckPolicyVO> healthCheckpolicies = _lb2healthcheckDao.listByLoadBalancerId(lb.getId(),
+                                true);
+                        if (!healthCheckpolicies.isEmpty()) {
+                            _lb2healthcheckDao.remove(lb.getId(), true);
+                            s_logger.debug("Load balancer rule id " + lb.getId() + " is removed health check monitors policies");
+                        }
+                        
+                        return checkForReleaseElasticIp;
+                    }
+                });
 
-                txn.commit();
                 if (checkForReleaseElasticIp && lb.getSourceIpAddressId() != null) {
                     boolean success = true;
                     long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 5ea7560..56e0e5d 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -230,6 +230,8 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.MacAddress;
@@ -578,34 +580,30 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
 
     @DB
     public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) {
-        final Transaction txn = Transaction.currentTxn();
-        try {
-            txn.start();
-            //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR
-            List<Long> routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId());
-            for (Long guestNtwkId : routerGuestNtwkIds) {
-                final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(),
-                        guestNtwkId, null, router.getId(), router.getType().toString());
-            if (userStats != null) {
-                final long currentBytesRcvd = userStats.getCurrentBytesReceived();
-                userStats.setCurrentBytesReceived(0);
-                userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd);
-
-                final long currentBytesSent = userStats.getCurrentBytesSent();
-                userStats.setCurrentBytesSent(0);
-                userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent);
-                _userStatsDao.update(userStats.getId(), userStats);
-                s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop");
-            } else {
-                s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterId());
-            }
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR
+                List<Long> routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId());
+                for (Long guestNtwkId : routerGuestNtwkIds) {
+                    final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(),
+                            guestNtwkId, null, router.getId(), router.getType().toString());
+                    if (userStats != null) {
+                        final long currentBytesRcvd = userStats.getCurrentBytesReceived();
+                        userStats.setCurrentBytesReceived(0);
+                        userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd);
+        
+                        final long currentBytesSent = userStats.getCurrentBytesSent();
+                        userStats.setCurrentBytesSent(0);
+                        userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent);
+                        _userStatsDao.update(userStats.getId(), userStats);
+                        s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop");
+                    } else {
+                        s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterId());
+                    }
+                }
             }
-            
-            txn.commit();
-        } catch (final Exception e) {
-            txn.rollback();
-            throw new CloudRuntimeException("Problem updating stats after reboot/stop ", e);
-        }
+        });
     }
 
     @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_REBOOT, eventDescription = "rebooting router Vm", async = true)
@@ -862,21 +860,21 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 final List<DomainRouterVO> routers = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId);
                 s_logger.debug("Found " + routers.size() + " running routers. ");
 
-                for (DomainRouterVO router : routers) {
+                for (final DomainRouterVO router : routers) {
                     String privateIP = router.getPrivateIpAddress();
 
                     if (privateIP != null) {
-                        boolean forVpc = router.getVpcId() != null;
+                        final boolean forVpc = router.getVpcId() != null;
                         List<? extends Nic> routerNics = _nicDao.listByVmId(router.getId());
-                        for (Nic routerNic : routerNics) {
-                            Network network = _networkModel.getNetwork(routerNic.getNetworkId());
+                        for (final Nic routerNic : routerNics) {
+                            final Network network = _networkModel.getNetwork(routerNic.getNetworkId());
                             //Send network usage command for public nic in VPC VR
                             //Send network usage command for isolated guest nic of non VPC VR
                             if ((forVpc && network.getTrafficType() == TrafficType.Public) || (!forVpc && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Isolated)) {
                                 final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(),
                                         forVpc, routerNic.getIp4Address());
-                                String routerType = router.getType().toString();
-                                UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
+                                final String routerType = router.getType().toString();
+                                final UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
                                         router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
                                 NetworkUsageAnswer answer = null;
                                 try {
@@ -891,62 +889,63 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                                         s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId() + "; details: " + answer.getDetails());
                                         continue;
                                     }
-                                    Transaction txn = Transaction.open(Transaction.CLOUD_DB);
                                     try {
                                         if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) {
                                             s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics");
                                             continue;
                                         }
-                                        txn.start();
-                                        UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
-                                                router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
-                                        if (stats == null) {
-                                            s_logger.warn("unable to find stats for account: " + router.getAccountId());
-                                            continue;
-                                        }
-
-                                        if (previousStats != null
-                                                && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
-                                                || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))) {
-                                            s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
-                                                    "Ignoring current answer. Router: " + answer.getRouterName() + " Rcvd: " +
-                                                    answer.getBytesReceived() + "Sent: " + answer.getBytesSent());
-                                            continue;
-                                        }
-
-                                        if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) {
-                                            if (s_logger.isDebugEnabled()) {
-                                                s_logger.debug("Received # of bytes that's less than the last one.  " +
-                                                        "Assuming something went wrong and persisting it. Router: " +
-                                                        answer.getRouterName() + " Reported: " + answer.getBytesReceived()
-                                                        + " Stored: " + stats.getCurrentBytesReceived());
-                                            }
-                                            stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
-                                        }
-                                        stats.setCurrentBytesReceived(answer.getBytesReceived());
-                                        if (stats.getCurrentBytesSent() > answer.getBytesSent()) {
-                                            if (s_logger.isDebugEnabled()) {
-                                                s_logger.debug("Received # of bytes that's less than the last one.  " +
-                                                        "Assuming something went wrong and persisting it. Router: " +
-                                                        answer.getRouterName() + " Reported: " + answer.getBytesSent()
-                                                        + " Stored: " + stats.getCurrentBytesSent());
+                                        final NetworkUsageAnswer answerFinal = answer;
+                                        Transaction.execute(new TransactionCallbackNoReturn() {
+                                            @Override
+                                            public void doInTransactionWithoutResult(TransactionStatus status) {
+                                                UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
+                                                        router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
+                                                if (stats == null) {
+                                                    s_logger.warn("unable to find stats for account: " + router.getAccountId());
+                                                    return;
+                                                }
+        
+                                                if (previousStats != null
+                                                        && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
+                                                        || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))) {
+                                                    s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
+                                                            "Ignoring current answer. Router: " + answerFinal.getRouterName() + " Rcvd: " +
+                                                            answerFinal.getBytesReceived() + "Sent: " + answerFinal.getBytesSent());
+                                                    return;
+                                                }
+        
+                                                if (stats.getCurrentBytesReceived() > answerFinal.getBytesReceived()) {
+                                                    if (s_logger.isDebugEnabled()) {
+                                                        s_logger.debug("Received # of bytes that's less than the last one.  " +
+                                                                "Assuming something went wrong and persisting it. Router: " +
+                                                                answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesReceived()
+                                                                + " Stored: " + stats.getCurrentBytesReceived());
+                                                    }
+                                                    stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+                                                }
+                                                stats.setCurrentBytesReceived(answerFinal.getBytesReceived());
+                                                if (stats.getCurrentBytesSent() > answerFinal.getBytesSent()) {
+                                                    if (s_logger.isDebugEnabled()) {
+                                                        s_logger.debug("Received # of bytes that's less than the last one.  " +
+                                                                "Assuming something went wrong and persisting it. Router: " +
+                                                                answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesSent()
+                                                                + " Stored: " + stats.getCurrentBytesSent());
+                                                    }
+                                                    stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+                                                }
+                                                stats.setCurrentBytesSent(answerFinal.getBytesSent());
+                                                if (! _dailyOrHourly) {
+                                                    //update agg bytes
+                                                    stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+                                                    stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+                                                }
+                                                _userStatsDao.update(stats.getId(), stats);
                                             }
-                                            stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
-                                        }
-                                        stats.setCurrentBytesSent(answer.getBytesSent());
-                                        if (! _dailyOrHourly) {
-                                            //update agg bytes
-                                            stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
-                                            stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
-                                        }
-                                        _userStatsDao.update(stats.getId(), stats);
-                                        txn.commit();
+                                        });
+
                                     } catch (Exception e) {
-                                        txn.rollback();
                                         s_logger.warn("Unable to update user statistics for account: " + router.getAccountId()
                                                 + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent());
-                                    } finally {
-                                        txn.close();
                                     }
                                 }
                             }
@@ -977,30 +976,30 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                         scanLock.unlock();
                         return;
                     }
-                    Transaction txn = Transaction.open(Transaction.CLOUD_DB);
                     try {
-                        txn.start();
-                        //get all stats with delta > 0
-                        List<UserStatisticsVO> updatedStats = _userStatsDao.listUpdatedStats();
-                        Date updatedTime = new Date();
-                        for(UserStatisticsVO stat : updatedStats){
-                            //update agg bytes
-                            stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived());
-                            stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent());
-                            _userStatsDao.update(stat.getId(), stat);
-                            //insert into op_user_stats_log
-                            UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(),
-                                                                         stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime);
-                            _userStatsLogDao.persist(statsLog);
-                        }
-                        s_logger.debug("Successfully updated aggregate network stats");
-                        txn.commit();
+                        Transaction.execute(new TransactionCallbackNoReturn() {
+                            @Override
+                            public void doInTransactionWithoutResult(TransactionStatus status) {
+                                //get all stats with delta > 0
+                                List<UserStatisticsVO> updatedStats = _userStatsDao.listUpdatedStats();
+                                Date updatedTime = new Date();
+                                for(UserStatisticsVO stat : updatedStats){
+                                    //update agg bytes
+                                    stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived());
+                                    stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent());
+                                    _userStatsDao.update(stat.getId(), stat);
+                                    //insert into op_user_stats_log
+                                    UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(),
+                                                                                 stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime);
+                                    _userStatsLogDao.persist(statsLog);
+                                }
+                                s_logger.debug("Successfully updated aggregate network stats");
+                            }
+                        });
                     } catch (Exception e){
-                        txn.rollback();
                         s_logger.debug("Failed to update aggregate network stats", e);
                     } finally {
                         scanLock.unlock();
-                        txn.close();
                     }
                 }
             } catch (Exception e){
@@ -1137,17 +1136,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 }
             }
             if (updated) {
-                Transaction txn = Transaction.open(Transaction.CLOUD_DB);
-                try {
-                    txn.start();
-                    _routerDao.update(router.getId(), router);
-                    txn.commit();
-                } catch (Exception e) {
-                    txn.rollback();
-                    s_logger.warn("Unable to update router status for account: " + router.getAccountId());
-                } finally {
-                    txn.close();
-                }
+                _routerDao.update(router.getId(), router);
             }
             RedundantState currState = router.getRedundantState();
             if (prevState != currState) {
@@ -2847,12 +2836,15 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 configDnsMasq(router, network, cmds);
                 boolean result = sendCommandsToRouter(router, cmds);
                 if (result == false) {
-                    NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
-                    Transaction txn = Transaction.currentTxn();
-                    txn.start();
-                    _nicIpAliasDao.expunge(ipAliasVO.getId());
-                    _ipAddressDao.unassignIpAddress(routerPublicIP.getId());
-                    txn.commit();
+                    final NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
+                    final PublicIp routerPublicIPFinal = routerPublicIP; 
+                    Transaction.execute(new TransactionCallbackNoReturn() {
+                        @Override
+                        public void doInTransactionWithoutResult(TransactionStatus status) {
+                            _nicIpAliasDao.expunge(ipAliasVO.getId());
+                            _ipAddressDao.unassignIpAddress(routerPublicIPFinal.getId());
+                        }
+                    });
                     throw new CloudRuntimeException("failed to configure ip alias on the router as a part of dhcp config");
                 }
             }
@@ -2877,7 +2869,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             }
 
             Commands cmds = new Commands(Command.OnError.Continue);
-            List<NicIpAliasVO> revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.state.revoked);
+            final List<NicIpAliasVO> revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.state.revoked);
             s_logger.debug("Found" + revokedIpAliasVOs.size() + "ip Aliases to revoke on the router as a part of dhcp configuration");
             List<IpAliasTO> revokedIpAliasTOs = new ArrayList<IpAliasTO>();
             for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
@@ -2893,12 +2885,14 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             configDnsMasq(router, network, cmds);
             boolean result = sendCommandsToRouter(router, cmds);
             if (result) {
-                Transaction txn= Transaction.currentTxn();
-                txn.start();
-                for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
-                    _nicIpAliasDao.expunge(revokedAliasVO.getId());
-                }
-                txn.commit();
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
+                            _nicIpAliasDao.expunge(revokedAliasVO.getId());
+                        }
+                    }
+                });
                 return true;
             }
         }
@@ -3966,7 +3960,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
     public void prepareStop(VirtualMachineProfile profile){
         //Collect network usage before stopping Vm
 
-        DomainRouterVO router = _routerDao.findById(profile.getVirtualMachine().getId());
+        final DomainRouterVO router = _routerDao.findById(profile.getVirtualMachine().getId());
         if(router == null){
             return;
         }
@@ -3974,17 +3968,17 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         String privateIP = router.getPrivateIpAddress();
 
         if (privateIP != null) {
-            boolean forVpc = router.getVpcId() != null;
+            final boolean forVpc = router.getVpcId() != null;
             List<? extends Nic> routerNics = _nicDao.listByVmId(router.getId());
-            for (Nic routerNic : routerNics) {
-                Network network = _networkModel.getNetwork(routerNic.getNetworkId());
+            for (final Nic routerNic : routerNics) {
+                final Network network = _networkModel.getNetwork(routerNic.getNetworkId());
                 //Send network usage command for public nic in VPC VR
                 //Send network usage command for isolated guest nic of non VPC VR
                 if ((forVpc && network.getTrafficType() == TrafficType.Public) || (!forVpc && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Isolated)) {
                     final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(),
                             forVpc, routerNic.getIp4Address());
-                    String routerType = router.getType().toString();
-                    UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
+                    final String routerType = router.getType().toString();
+                    final UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
                             router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
                     NetworkUsageAnswer answer = null;
                     try {
@@ -3999,62 +3993,63 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                             s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId() + "; details: " + answer.getDetails());
                             continue;
                         }
-                        Transaction txn = Transaction.open(Transaction.CLOUD_DB);
                         try {
                             if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) {
                                 s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics");
                                 continue;
                             }
-                            txn.start();
-                            UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
-                                    router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
-                            if (stats == null) {
-                                s_logger.warn("unable to find stats for account: " + router.getAccountId());
-                                continue;
-                            }
-
-                            if (previousStats != null
-                                    && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
-                                    || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){
-                                s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
-                                        "Ignoring current answer. Router: " + answer.getRouterName() + " Rcvd: " +
-                                        answer.getBytesReceived() + "Sent: " + answer.getBytesSent());
-                                continue;
-                            }
-
-                            if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) {
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Received # of bytes that's less than the last one.  " +
-                                            "Assuming something went wrong and persisting it. Router: " +
-                                            answer.getRouterName() + " Reported: " + answer.getBytesReceived()
-                                            + " Stored: " + stats.getCurrentBytesReceived());
-                                }
-                                stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
-                            }
-                            stats.setCurrentBytesReceived(answer.getBytesReceived());
-                            if (stats.getCurrentBytesSent() > answer.getBytesSent()) {
-                                if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Received # of bytes that's less than the last one.  " +
-                                            "Assuming something went wrong and persisting it. Router: " +
-                                            answer.getRouterName() + " Reported: " + answer.getBytesSent()
-                                            + " Stored: " + stats.getCurrentBytesSent());
+                            
+                            final NetworkUsageAnswer answerFinal = answer;
+                            Transaction.execute(new TransactionCallbackNoReturn() {
+                                @Override
+                                public void doInTransactionWithoutResult(TransactionStatus status) {
+                                    UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
+                                            router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
+                                    if (stats == null) {
+                                        s_logger.warn("unable to find stats for account: " + router.getAccountId());
+                                        return;
+                                    }
+        
+                                    if (previousStats != null
+                                            && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
+                                            || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){
+                                        s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
+                                                "Ignoring current answer. Router: " + answerFinal.getRouterName() + " Rcvd: " +
+                                                answerFinal.getBytesReceived() + "Sent: " + answerFinal.getBytesSent());
+                                        return;
+                                    }
+        
+                                    if (stats.getCurrentBytesReceived() > answerFinal.getBytesReceived()) {
+                                        if (s_logger.isDebugEnabled()) {
+                                            s_logger.debug("Received # of bytes that's less than the last one.  " +
+                                                    "Assuming something went wrong and persisting it. Router: " +
+                                                    answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesReceived()
+                                                    + " Stored: " + stats.getCurrentBytesReceived());
+                                        }
+                                        stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+                                    }
+                                    stats.setCurrentBytesReceived(answerFinal.getBytesReceived());
+                                    if (stats.getCurrentBytesSent() > answerFinal.getBytesSent()) {
+                                        if (s_logger.isDebugEnabled()) {
+                                            s_logger.debug("Received # of bytes that's less than the last one.  " +
+                                                    "Assuming something went wrong and persisting it. Router: " +
+                                                    answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesSent()
+                                                    + " Stored: " + stats.getCurrentBytesSent());
+                                        }
+                                        stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+                                    }
+                                    stats.setCurrentBytesSent(answerFinal.getBytesSent());
+                                    if (! _dailyOrHourly) {
+                                        //update agg bytes
+                                        stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+                                        stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+                                    }
+                                    _userStatsDao.update(stats.getId(), stats);
                                 }
-                                stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
-                            }
-                            stats.setCurrentBytesSent(answer.getBytesSent());
-                            if (! _dailyOrHourly) {
-                                //update agg bytes
-                                stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
-                                stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
-                            }
-                            _userStatsDao.update(stats.getId(), stats);
-                            txn.commit();
+                            });
                         } catch (Exception e) {
-                            txn.rollback();
                             s_logger.warn("Unable to update user statistics for account: " + router.getAccountId()
                                     + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent());
-                        } finally {
-                            txn.close();
                         }
                     }
                 }