From decc75e0251abfaaae8baa1c017fc01279991262 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Sun, 21 Jun 2020 16:25:32 +0800 Subject: [PATCH] fix bug of non concurrent security & add double check --- orm/db_alias.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/orm/db_alias.go b/orm/db_alias.go index 51ce10f3..7d8ece4b 100644 --- a/orm/db_alias.go +++ b/orm/db_alias.go @@ -120,17 +120,24 @@ func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) func (d *DB) getStmt(query string) (*sql.Stmt, error) { d.RLock() - if stmt, ok := d.stmts[query]; ok { - d.RUnlock() - return stmt, nil - } + c, ok := d.stmts[query] d.RUnlock() + if ok { + return c, nil + } + + d.Lock() + c, ok = d.stmts[query] + if ok { + d.Unlock() + return c, nil + } stmt, err := d.Prepare(query) if err != nil { + d.Unlock() return nil, err } - d.Lock() d.stmts[query] = stmt d.Unlock() return stmt, nil