From a5476b5d097b0609a5da902c8525ae0d9a82253a Mon Sep 17 00:00:00 2001 From: asahi Date: Fri, 20 Jun 2025 12:32:34 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBgolang=20sqlx=20Prepar?= =?UTF-8?q?edStatement=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Golang/go-sqlx.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Golang/go-sqlx.md b/Golang/go-sqlx.md index dfc90cc..a7d0a97 100644 --- a/Golang/go-sqlx.md +++ b/Golang/go-sqlx.md @@ -282,3 +282,20 @@ row = txStmt.QueryRow(852) prepare操作实际会在数据库运行,故而其需要connection和connection state。 +### PreparedStatement事务操作 +在使用sqlx进行事务操作时,首先需要通过`db.Begin()`开启事务,且`后续所有想要加入事务的操作(dml/query)都需要通过tx.Exec/tx.Query来执行`。 + +如果在开启事务并获取`tx`对象后,后续操作仍然通过`db.Exec/db.Query`来执行,`那么后续操作会从连接池中获取一个新的连接来执行,并不会自动加入已经开启的事务`。 + +```go +tx, _ = db.Begin() +// 错误操作,此处dml会从连接池获取新的连接来执行 +db.Exec(xxxx) +// 正确操作,此处dml会在tx绑定的连接中执行 +tx.Exec(xxxx) +``` + +对于PreparedStatement操作,如果想要将其和事务相关联,有如下两种使用方式: +- `如果statement此时尚未创建`,可以通过`tx.Prepare`来创建该连接 +- `如果Steement此时已经创建`,那么可以通过`tx.Stmt(dbStmt)`来获取新的Stmt,新Stmt会和事务所属连接绑定,通过新Stmt执行dml可以加入当前事务 +