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
1 changed files with 12 additions and 5 deletions

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) {
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