1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-25 23:11:27 +00:00

Merge pull request #4022 from jianzhiyao/develop

stmt: fix bug of non concurrent security & add double check
This commit is contained in:
Ming Deng 2020-06-21 18:01:14 +08:00 committed by GitHub
commit e1386c448c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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() d.RUnlock()
return stmt, nil if ok {
return c, nil
}
d.Lock()
c, ok = d.stmts[query]
if ok {
d.Unlock()
return c, nil
} }
d.RUnlock()
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