managed calls a block of code that is fully contained in a transaction.
(writable bool, fn func(tx *Tx) error)
| 1038 | |
| 1039 | // managed calls a block of code that is fully contained in a transaction. |
| 1040 | func (db *DB) managed(writable bool, fn func(tx *Tx) error) (err error) { |
| 1041 | var tx *Tx |
| 1042 | |
| 1043 | tx, err = db.Begin(writable) |
| 1044 | if err != nil { |
| 1045 | return err |
| 1046 | } |
| 1047 | defer func() { |
| 1048 | if r := recover(); r != nil { |
| 1049 | err = fmt.Errorf("panic when executing tx, err is %+v", r) |
| 1050 | } |
| 1051 | }() |
| 1052 | |
| 1053 | if err = fn(tx); err == nil { |
| 1054 | err = tx.Commit() |
| 1055 | } else { |
| 1056 | if db.opt.ErrorHandler != nil { |
| 1057 | db.opt.ErrorHandler.HandleError(err) |
| 1058 | } |
| 1059 | |
| 1060 | if errRollback := tx.Rollback(); errRollback != nil { |
| 1061 | err = fmt.Errorf("%v. Rollback err: %v", err, errRollback) |
| 1062 | } |
| 1063 | } |
| 1064 | |
| 1065 | return err |
| 1066 | } |
| 1067 | |
| 1068 | func (db *DB) sendToWriteCh(tx *Tx) (*request, error) { |
| 1069 | req := requestPool.Get().(*request) |