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:23 UTC

[12/20] New Transaction API

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