對於資料庫執行多個更新操作時,事務會將多個操作當成單個單元處理,要成功都成功,否則都失敗。本文通過例項說明go sql事務處理。
搭建postgresql資料庫環境,我們打算在postgre資料庫中新建表meta_data(id, source),然後插入記錄測試事務。
go運算元據庫的包為"database/sql",這裡資料庫使用postgresql,需要匯入github.com/lib/pq;下面是準備資料庫連線**。
)}go預設實現了資料庫連線池,無需引入第三方連線池實現。
下面是事務示例實現,我們使用postgresql,因此變數佔位符使用 $ , mysql使用 ?。
func
insertdata()
sql :=
"insert into meta_data(id, source) values($1, $2)"
tx,err := db.
begin()
checkerror
(err)
defer tx.
commit()
for_
, item :=
range data
}}
函式開始之前首先啟動事務,使用defer語句確保最後提交事務。接著執行多個插入語句,如果有錯誤回滾事務。
這個實現沒有問題,只是每次需要寫和事務相關的**,顯得多餘,最好能封裝事務相關**,使用者只關心業務。
上節手動實現了事務,本節對事務操作進行封裝,讓**更有通用性。
這裡定義updatewithtx()函式,其中封裝了事務相關**,具體執行和資料庫相關操作通過其函式引數傳入。
func
updatewithtx
(fn func
(tx *sql.tx)
error
)error
defer
func()
}() err =
fn(tx)
return err
}
func
testupdatewithtx
(t *testing.t)
sql :=
"insert into meta_data(id, source) values($1, $2)"
for_
, item :=
range data
// err = errors.new("人為錯誤")
}return err
})}
具體業務和上節**一樣,但我們不在關心事務相關**,使用者可測試有錯誤時是否回滾事務。 mysql業務資料庫回退 MySQL 事務處理
事務 一組sql語句操作單元,組內所有sql語句,完成乙個業務。若整組成功,意味著組內的全部操作都成功 反之,若其中任何一條語句失敗,意味著整個操作都失敗。操作失敗,意味著整個過程都是沒有意義的,應使資料庫回到操作前的初始狀態。point 1.失敗後,能回到開始位置 2.成功之前,其他使用者 程序 ...
事務處理 資料庫事務
事務簡介 事務的作用 事務的作用是將一系列操作作為乙個整體,一但其 現問題,會回滾到事務的開始狀態。即事務維護了資料的完整性和一致性。事務的四個特性 acid 原子性 事務的操作是原子不可分割的。一致性 事務的運算元據保證一致性,不存在一部分改變一部分不改變。隔離性 隔離性是當多個使用者併發訪問資料...
MySQL資料庫總結(10)儲存引擎與事務處理
事務 資料庫對同樣的資料,有著不同的儲存方式和管理方式,在mysql中,稱為儲存引擎 儲存引擎與其特點 文章,新聞等安全性要求不高的,選myisam 訂單,資金,賬單,火車票等對安全性要求高的,可以選用innodb 對於臨時中轉表,可以用memory型 速度最快 通俗的說事務 原子性 要麼都成功執行...