ledisdb/ledis/tx.go

86 lines
1.2 KiB
Go
Raw Normal View History

2014-05-09 10:49:22 +04:00
package ledis
2014-05-04 15:02:55 +04:00
import (
"github.com/siddontang/go-leveldb/leveldb"
2014-06-03 05:51:29 +04:00
"github.com/siddontang/ledisdb/replication"
2014-05-06 09:32:38 +04:00
"sync"
2014-05-04 15:02:55 +04:00
)
type tx struct {
2014-05-06 09:32:38 +04:00
m sync.Mutex
2014-05-29 11:07:14 +04:00
l *Ledis
2014-05-04 15:02:55 +04:00
wb *leveldb.WriteBatch
2014-05-27 12:05:24 +04:00
2014-06-03 05:51:29 +04:00
binlog *replication.BinLog
2014-05-27 12:05:24 +04:00
batch [][]byte
}
func newTx(l *Ledis) *tx {
t := new(tx)
2014-05-29 11:07:14 +04:00
t.l = l
2014-05-27 12:05:24 +04:00
t.wb = l.ldb.NewWriteBatch()
t.batch = make([][]byte, 0, 4)
t.binlog = l.binlog
return t
2014-05-04 15:02:55 +04:00
}
2014-05-06 09:32:38 +04:00
func (t *tx) Close() {
t.wb.Close()
}
2014-05-04 15:02:55 +04:00
func (t *tx) Put(key []byte, value []byte) {
t.wb.Put(key, value)
2014-05-27 12:05:24 +04:00
if t.binlog != nil {
2014-05-29 11:07:14 +04:00
buf := encodeBinLogPut(key, value)
2014-05-27 12:05:24 +04:00
t.batch = append(t.batch, buf)
}
2014-05-04 15:02:55 +04:00
}
func (t *tx) Delete(key []byte) {
t.wb.Delete(key)
2014-05-27 12:05:24 +04:00
if t.binlog != nil {
2014-05-29 11:07:14 +04:00
buf := encodeBinLogDelete(key)
2014-05-27 12:05:24 +04:00
t.batch = append(t.batch, buf)
}
2014-05-04 15:02:55 +04:00
}
2014-05-06 09:32:38 +04:00
func (t *tx) Lock() {
t.m.Lock()
}
func (t *tx) Unlock() {
2014-05-27 12:05:24 +04:00
t.batch = t.batch[0:0]
2014-05-06 09:32:38 +04:00
t.wb.Rollback()
t.m.Unlock()
}
2014-05-04 15:02:55 +04:00
func (t *tx) Commit() error {
2014-05-27 12:05:24 +04:00
var err error
if t.binlog != nil {
2014-05-29 11:07:14 +04:00
t.l.Lock()
2014-05-27 12:05:24 +04:00
err = t.wb.Commit()
if err != nil {
2014-05-29 11:07:14 +04:00
t.l.Unlock()
2014-05-27 12:05:24 +04:00
return err
}
err = t.binlog.Log(t.batch...)
2014-05-29 11:07:14 +04:00
t.l.Unlock()
2014-05-27 12:05:24 +04:00
} else {
2014-05-29 11:07:14 +04:00
t.l.Lock()
2014-05-27 12:05:24 +04:00
err = t.wb.Commit()
2014-05-29 11:07:14 +04:00
t.l.Unlock()
2014-05-27 12:05:24 +04:00
}
2014-05-04 15:02:55 +04:00
return err
}
2014-05-05 07:37:44 +04:00
func (t *tx) Rollback() {
t.wb.Rollback()
2014-05-04 15:02:55 +04:00
}