forked from zhuxiujia/GoMybatis
/
TxStack.go
62 lines (54 loc) · 1.17 KB
/
TxStack.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package tx
import "database/sql"
//session map是协程安全的
//session对应TxStack是1:1关系,此处无需处理并发,因为都是单协程访问
type TxStack struct {
i int
data []*sql.Tx //队列
propagations []*Propagation //队列
}
func (it TxStack) New() TxStack {
return TxStack{
data: []*sql.Tx{},
propagations: []*Propagation{},
i: 0,
}
}
func (s *TxStack) Push(k *sql.Tx, p *Propagation) {
s.data = append(s.data, k)
s.propagations = append(s.propagations, p)
s.i++
}
func (s *TxStack) Pop() (*sql.Tx, *Propagation) {
if s.i == 0 {
return nil, nil
}
s.i--
var ret = s.data[s.i]
s.data = s.data[0:s.i]
var p = s.propagations[s.i]
s.propagations = s.propagations[0:s.i]
return ret, p
}
func (s *TxStack) First() (*sql.Tx, *Propagation) {
if s.i == 0 {
return nil, nil
}
var ret = s.data[0]
var p = s.propagations[0]
return ret, p
}
func (s *TxStack) Last() (*sql.Tx, *Propagation) {
if s.i == 0 {
return nil, nil
}
var ret = s.data[s.i-1]
var p = s.propagations[s.i-1]
return ret, p
}
func (s *TxStack) Len() int {
return s.i
}
func (s *TxStack) HaveTx() bool {
return s.Len() > 0
}