1
0
mirror of https://github.com/astaxie/beego.git synced 2024-06-14 06:23:32 +00:00

fix bug of non concurrent security & add double check

This commit is contained in:
jianzhiyao 2020-06-21 16:25:32 +08:00
parent 8160059182
commit decc75e025

View File

@ -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) { func (d *DB) getStmt(query string) (*sql.Stmt, error) {
d.RLock() d.RLock()
if stmt, ok := d.stmts[query]; ok { c, ok := d.stmts[query]
d.RUnlock()
return stmt, nil
}
d.RUnlock() 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) stmt, err := d.Prepare(query)
if err != nil { if err != nil {
d.Unlock()
return nil, err return nil, err
} }
d.Lock()
d.stmts[query] = stmt d.stmts[query] = stmt
d.Unlock() d.Unlock()
return stmt, nil return stmt, nil