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/23 21:43:50 UTC

[33/47] New Transaction API

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