diff --git a/listener.go b/listener.go
index 6a9c8ec..a557a25 100644
--- a/listener.go
+++ b/listener.go
@@ -17,68 +17,86 @@
 
 func (h *handler) Handle(e apid.Event) {
 
-	snapData, ok := e.(*common.Snapshot)
-	if ok {
-		processSnapshot(snapData)
-	} else {
-		changeSet, ok := e.(*common.ChangeList)
-		if ok {
-			processChange(changeSet)
-		} else {
-			log.Errorf("Received Invalid event. This shouldn't happen!")
-		}
-	}
-	return
-}
-
-func processSnapshot(snapshot *common.Snapshot) {
-
-	log.Debugf("Process Snapshot data")
+	res := true
 
 	db, err := data.DB()
 	if err != nil {
 		panic("Unable to access Sqlite DB")
 	}
+	txn, err := db.Begin()
+	if err != nil {
+		log.Error("Unable to create Sqlite transaction")
+		return
+	}
+
+	snapData, ok := e.(*common.Snapshot)
+	if ok {
+		res = processSnapshot(snapData, db, txn)
+	} else {
+		changeSet, ok := e.(*common.ChangeList)
+		if ok {
+			res = processChange(changeSet, db, txn)
+		} else {
+			log.Fatal("Received Invalid event. This shouldn't happen!")
+		}
+	}
+	if res == true {
+		txn.Commit()
+	} else {
+		txn.Rollback()
+	}
+	return
+}
+
+func processSnapshot(snapshot *common.Snapshot, db *sql.DB, txn *sql.Tx) bool {
+
+	log.Debugf("Process Snapshot data")
+	res := true
 
 	for _, payload := range snapshot.Tables {
 
 		switch payload.Name {
 		case "edgex.apid_config":
-			for _, row := range payload.Rows {
-				insertApidConfig(row, db, snapshot.SnapshotInfo)
-			}
+			res = insertApidConfig(payload.Rows, db, txn, snapshot.SnapshotInfo)
 		case "edgex.apid_config_scope":
-			insertApidConfigScopes(payload.Rows, db)
+			res = insertApidConfigScopes(payload.Rows, db, txn)
+		}
+		if res == false {
+			log.Error("Error encountered in Downloading Snapshot for ApidApigeeSync")
+			return res
 		}
 	}
+	return res
 }
 
-func processChange(changes *common.ChangeList) {
+func processChange(changes *common.ChangeList, db *sql.DB, txn *sql.Tx) bool {
 
 	log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
 	var rows []common.Row
-	db, err := data.DB()
-	if err != nil {
-		panic("Unable to access Sqlite DB")
-	}
+	res := true
 
 	for _, payload := range changes.Changes {
 		rows = nil
 		switch payload.Table {
 		case "edgex.apid_config_scope":
 			switch payload.Operation {
-			case 1:
+			case common.Insert:
 				rows = append(rows, payload.NewRow)
-				insertApidConfigScopes(rows, db)
+				res = insertApidConfigScopes(rows, db, txn)
 			}
 		}
+		if res == false {
+			log.Error("Sql Operation error. Operation rollbacked")
+			return res
+		}
 	}
+	return res
 }
 
 /*
  * INSERT INTO APP_CREDENTIAL op
  */
-func insertApidConfig(ele common.Row, db *sql.DB, snapInfo string) bool {
+func insertApidConfig(rows []common.Row, db *sql.DB, txn *sql.Tx, snapInfo string) bool {
 
 	var scope, id, name, orgAppName, createdBy, updatedBy, Description string
 	var updated, created int64
@@ -88,46 +106,44 @@
 		log.Error("INSERT APID_CONFIG Failed: ", err)
 		return false
 	}
+	defer prep.Close()
 
-	txn, err := db.Begin()
+	for _, ele := range rows {
+		ele.Get("id", &id)
+		ele.Get("_apid_scope", &scope)
+		ele.Get("name", &name)
+		ele.Get("umbrella_org_app_name", &orgAppName)
+		ele.Get("created", &created)
+		ele.Get("created_by", &createdBy)
+		ele.Get("updated", &updated)
+		ele.Get("updated_by", &updatedBy)
+		ele.Get("description", &Description)
 
-	ele.Get("id", &id)
-	ele.Get("_apid_scope", &scope)
-	ele.Get("name", &name)
-	ele.Get("umbrella_org_app_name", &orgAppName)
-	ele.Get("created", &created)
-	ele.Get("created_by", &createdBy)
-	ele.Get("updated", &updated)
-	ele.Get("updated_by", &updatedBy)
-	ele.Get("description", &Description)
+		_, err = txn.Stmt(prep).Exec(
+			id,
+			scope,
+			name,
+			orgAppName,
+			created,
+			createdBy,
+			updated,
+			updatedBy,
+			snapInfo)
 
-	_, err = txn.Stmt(prep).Exec(
-		id,
-		scope,
-		name,
-		orgAppName,
-		created,
-		createdBy,
-		updated,
-		updatedBy,
-		snapInfo)
-
-	if err != nil {
-		log.Error("INSERT APID_CONFIG Failed: ", id, ", ", scope, ")", err)
-		txn.Rollback()
-		return false
-	} else {
-		log.Info("INSERT APID_CONFIG Success: (", id, ", ", scope, ")")
-		txn.Commit()
-		return true
+		if err != nil {
+			log.Error("INSERT APID_CONFIG Failed: ", id, ", ", scope, ")", err)
+			return false
+		} else {
+			log.Info("INSERT APID_CONFIG Success: (", id, ", ", scope, ")")
+		}
 	}
-
+	return true
 }
 
 /*
  * INSERT INTO APP_CREDENTIAL op
  */
-func insertApidConfigScopes(rows []common.Row, db *sql.DB) bool {
+func insertApidConfigScopes(rows []common.Row, db *sql.DB, txn *sql.Tx) bool {
 
 	var id, scopeId, apiConfigId, scope, createdBy, updatedBy string
 	var created, updated int64
@@ -137,8 +153,8 @@
 		log.Error("INSERT APID_CONFIG_SCOPE Failed: ", err)
 		return false
 	}
+	defer prep.Close()
 
-	txn, err := db.Begin()
 	for _, ele := range rows {
 
 		ele.Get("id", &id)
@@ -162,12 +178,10 @@
 
 		if err != nil {
 			log.Error("INSERT APID_CONFIG_SCOPE Failed: ", id, ", ", scope, ")", err)
-			txn.Rollback()
 			return false
 		} else {
 			log.Info("INSERT APID_CONFIG_SCOPE Success: (", id, ", ", scope, ")")
 		}
 	}
-	txn.Commit()
 	return true
 }
