golang db事務的統一封裝

2021-09-23 18:46:07 字數 1738 閱讀 2379

database := db.db

tx, err := database.

begin()

if err !=

nil stmt, err := tx.

prepare

(sqlquery)

if err !=

nil_

, err = stmt.

exec

(paras...

)if err !=

nil err = tx.

commit()

if err !=

nil

以上是我們使用事務時的一般操作,如果每做一次事務的操作均要進行重新寫一遍**豈不是很麻煩,尤其是出錯時,rollback需要多次在不同錯誤的地方的進行呼叫處理。

採用defer處理rollback

defer tx.

rollback

()

無論成功與否,均進行rollback操作,只是有點影響,如果成功還呼叫rollback的話,將會報錯。雖然可以忽略,但作為程式設計師,有必要進一步調整。

根據執行結果來選擇執行rollback,避免無效使用。

defer

func()

}()

如此,我們就可以根據事務的執行結果決定是否rollback了。

封裝,以上**本身就具有極大的普適性,因此,我們抽出通用的引數,將此過程封裝成乙個func,以後就可以直接呼叫了。

func

execsqlwithtransaction

(database *sql.db, query string

, args ...

inte***ce

)(err error

)defer

func()

}() stmt, err := tx.

prepare

(query)

if err !=

nildefer stmt.

close()

_, err = stmt.

exec

(args...

)if err !=

nilreturn tx.

commit()

}

封裝後我們可以如下使用:

if err :=

execsqlwithtransaction

(database,sqlquery,paras...

);err !=

nil

封裝後是不是很簡潔啊?

在乙個事務中可能會出現多個select、update等操作,以上封裝僅處理了一種操作,還不能滿足我們的實際需求,因此需要更進一步封裝。

func

execsqlwithtransaction

(db *sql.db, handle func

(tx *sql.tx)

error

)(err error

)defer

func()

}()if err =

handle

(tx)

; err !=

nilreturn tx.

commit()

}

在handle func內可以直接使用事務tx進行增刪改查。

vue 請求統一封裝和呼叫

1.request.js統一封裝的請求介面 author your name date 2020 03 20 14 17 34 lastedittime 2020 03 26 11 27 50 lasteditors your name description in user settings ed...

統一封裝 Axios 介面與異常處理

vue.config.js vue.config.js 配置說明 這裡只列一部分,具體配置慘考文件 module.exports 3個屬性host,port,https 它支援webpack dev server的所有選項 devserver open false,配置自動啟動瀏覽器 proxy 配...

js物件導向程式設計一 封裝

js是物件導向程式設計的語言,既是它的函式,陣列,屬性都是物件,可以設定物件的屬性和方法。一.生成物件的原始模式 假定把貓看成乙個物件,它有name和color兩個屬性.var cat 現在,我們需要根據這個原型物件的規格,生成兩個例項物件.var cat1 建立乙個空物件 cat1.name 大毛...