github.com/polarismesh/polaris@v1.17.8/store/boltdb/bolt_common.go (about) 1 /** 2 * Tencent is pleased to support the open source community by making Polaris available. 3 * 4 * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. 5 * 6 * Licensed under the BSD 3-Clause License (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * https://opensource.org/licenses/BSD-3-Clause 11 * 12 * Unless required by applicable law or agreed to in writing, software distributed 13 * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 14 * CONDITIONS OF ANY KIND, either express or implied. See the License for the 15 * specific language governing permissions and limitations under the License. 16 */ 17 18 package boltdb 19 20 import ( 21 bolt "go.etcd.io/bbolt" 22 "go.uber.org/zap" 23 24 "github.com/polarismesh/polaris/store" 25 ) 26 27 type transactionFunc func(tx *bolt.Tx) ([]interface{}, error) 28 29 func DoTransactionIfNeed(sTx store.Tx, handler BoltHandler, handle transactionFunc) ([]interface{}, error) { 30 var ( 31 err error 32 autoManageTx bool 33 ) 34 autoManageTx = (sTx == nil) 35 if sTx == nil { 36 sTx, err = handler.StartTx() 37 if err != nil { 38 return nil, err 39 } 40 } 41 tx := sTx.GetDelegateTx().(*bolt.Tx) 42 defer func() { 43 if autoManageTx { 44 _ = tx.Rollback() 45 } 46 }() 47 48 ret, err := handle(tx) 49 50 if autoManageTx && err == nil { 51 if err := tx.Commit(); err != nil { 52 log.Error("do tx commit", zap.Error(err)) 53 return nil, err 54 } 55 } 56 57 return ret, err 58 }