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

[09/20] New Transaction API

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

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

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

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

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

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