Skip to content

Commit bfb9eb1

Browse files
authored
fix xa branch commit bug (apache#564)
* fix xa branch commit bug
1 parent 96351cb commit bfb9eb1

File tree

7 files changed

+46
-10
lines changed

7 files changed

+46
-10
lines changed

Diff for: goimports.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#
1717

1818
# format go imports style
19-
go install -v golang.org/x/tools/cmd/goimports
19+
go install golang.org/x/tools/cmd/goimports
2020
goimports -local github.com/seata/seata-go -w .
2121

2222
# format licence style

Diff for: pkg/client/client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
package client
1919

2020
import (
21-
"github.com/seata/seata-go/pkg/remoting/getty"
2221
"sync"
2322

2423
"github.com/seata/seata-go/pkg/datasource"
2524
at "github.com/seata/seata-go/pkg/datasource/sql"
2625
"github.com/seata/seata-go/pkg/datasource/sql/exec/config"
2726
"github.com/seata/seata-go/pkg/integration"
2827
remoteConfig "github.com/seata/seata-go/pkg/remoting/config"
28+
"github.com/seata/seata-go/pkg/remoting/getty"
2929
"github.com/seata/seata-go/pkg/remoting/processor/client"
3030
"github.com/seata/seata-go/pkg/rm"
3131
"github.com/seata/seata-go/pkg/rm/tcc"

Diff for: pkg/datasource/sql/conn_xa.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -322,22 +322,22 @@ func (c *XAConn) Commit(ctx context.Context) error {
322322

323323
now := time.Now()
324324
if c.end(ctx, xa.TMSuccess) != nil {
325-
return c.commitErrorHandle()
325+
return c.commitErrorHandle(ctx)
326326
}
327327

328328
if c.checkTimeout(ctx, now) != nil {
329-
return c.commitErrorHandle()
329+
return c.commitErrorHandle(ctx)
330330
}
331331

332332
if c.xaResource.XAPrepare(ctx, c.xaBranchXid.String()) != nil {
333-
return c.commitErrorHandle()
333+
return c.commitErrorHandle(ctx)
334334
}
335335
return nil
336336
}
337337

338-
func (c *XAConn) commitErrorHandle() error {
338+
func (c *XAConn) commitErrorHandle(ctx context.Context) error {
339339
var err error
340-
if err = c.tx.Rollback(); err != nil {
340+
if err = c.XaRollback(ctx, c.xaBranchXid); err != nil {
341341
err = fmt.Errorf("failed to report XA branch commit-failure xid:%s, err:%w", c.txCtx.XID, err)
342342
}
343343
c.cleanXABranchContext()
@@ -389,7 +389,7 @@ func (c *XAConn) XaRollbackByBranchId(ctx context.Context, xaXid XAXid) error {
389389
}
390390

391391
func (c *XAConn) XaRollback(ctx context.Context, xaXid XAXid) error {
392-
err := c.xaResource.Rollback(ctx, xaXid.GetGlobalXid())
392+
err := c.xaResource.Rollback(ctx, xaXid.String())
393393
c.releaseIfNecessary()
394394
return err
395395
}

Diff for: pkg/datasource/sql/db.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ import (
2222
"database/sql"
2323
"database/sql/driver"
2424
"fmt"
25-
"github.com/seata/seata-go/pkg/util/log"
2625
"sync"
2726

2827
"github.com/seata/seata-go/pkg/datasource/sql/datasource"
2928
"github.com/seata/seata-go/pkg/datasource/sql/types"
3029
"github.com/seata/seata-go/pkg/datasource/sql/undo"
3130
"github.com/seata/seata-go/pkg/datasource/sql/util"
31+
"github.com/seata/seata-go/pkg/datasource/sql/xa"
3232
"github.com/seata/seata-go/pkg/protocol/branch"
33+
"github.com/seata/seata-go/pkg/util/log"
3334
)
3435

3536
type dbOption func(db *DBResource)
@@ -218,10 +219,17 @@ func (db *DBResource) ConnectionForXA(ctx context.Context, xaXid XAXid) (*XAConn
218219
if err != nil {
219220
return nil, fmt.Errorf("get xa new connection failure, xid:%s, err:%v", xaXid.String(), err)
220221
}
222+
xaResource, err := xa.CreateXAResource(newDriverConn, types.DBTypeMySQL)
223+
if err != nil {
224+
return nil, fmt.Errorf("create xa resoruce err:%w", err)
225+
}
221226
xaConn := &XAConn{
222227
Conn: &Conn{
223228
targetConn: newDriverConn,
229+
res: db,
224230
},
231+
xaBranchXid: XaIdBuild(xaXid.GetGlobalXid(), xaXid.GetBranchId()),
232+
xaResource: xaResource,
225233
}
226234
return xaConn, nil
227235
}

Diff for: pkg/datasource/sql/driver.go

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"strings"
2929

3030
"github.com/go-sql-driver/mysql"
31+
3132
"github.com/seata/seata-go/pkg/datasource/sql/datasource"
3233
mysql2 "github.com/seata/seata-go/pkg/datasource/sql/datasource/mysql"
3334
"github.com/seata/seata-go/pkg/datasource/sql/types"

Diff for: pkg/datasource/sql/exec/at/multi_delete_executor.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ type multiDelete struct {
7070
clear bool
7171
}
7272

73-
//NewMultiDeleteExecutor get multiDelete executor
73+
// NewMultiDeleteExecutor get multiDelete executor
7474
func NewMultiDeleteExecutor(parserCtx *types.ParseContext, execContent *types.ExecContext, hooks []exec.SQLHook) *multiDeleteExecutor {
7575
return &multiDeleteExecutor{parserCtx: parserCtx, execContext: execContent, baseExecutor: baseExecutor{hooks: hooks}}
7676
}

Diff for: pkg/datasource/sql/xa/mysql_xa_connection.go

+27
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"io"
2626
"strings"
2727
"time"
28+
29+
"github.com/seata/seata-go/pkg/util/log"
2830
)
2931

3032
type MysqlXAConn struct {
@@ -36,6 +38,8 @@ func NewMysqlXaConn(conn driver.Conn) *MysqlXAConn {
3638
}
3739

3840
func (c *MysqlXAConn) Commit(ctx context.Context, xid string, onePhase bool) error {
41+
log.Infof("xa branch commit, xid %s", xid)
42+
3943
var sb strings.Builder
4044
sb.WriteString("XA COMMIT ")
4145
sb.WriteString("'")
@@ -47,10 +51,15 @@ func (c *MysqlXAConn) Commit(ctx context.Context, xid string, onePhase bool) err
4751

4852
conn, _ := c.Conn.(driver.ExecerContext)
4953
_, err := conn.ExecContext(ctx, sb.String(), nil)
54+
if err != nil {
55+
log.Errorf("xa branch commit failed, xid %s, err %v", xid, err)
56+
}
5057
return err
5158
}
5259

5360
func (c *MysqlXAConn) End(ctx context.Context, xid string, flags int) error {
61+
log.Infof("xa branch end, xid %s", xid)
62+
5463
var sb strings.Builder
5564
sb.WriteString("XA END ")
5665
sb.WriteString("'")
@@ -71,6 +80,9 @@ func (c *MysqlXAConn) End(ctx context.Context, xid string, flags int) error {
7180

7281
conn, _ := c.Conn.(driver.ExecerContext)
7382
_, err := conn.ExecContext(ctx, sb.String(), nil)
83+
if err != nil {
84+
log.Errorf("xa branch end failed, xid %s, err %v", xid, err)
85+
}
7486
return err
7587
}
7688

@@ -91,6 +103,8 @@ func (c *MysqlXAConn) IsSameRM(ctx context.Context, xares XAResource) bool {
91103
}
92104

93105
func (c *MysqlXAConn) XAPrepare(ctx context.Context, xid string) error {
106+
log.Infof("xa branch prepare, xid %s", xid)
107+
94108
var sb strings.Builder
95109
sb.WriteString("XA PREPARE ")
96110
sb.WriteString("'")
@@ -99,6 +113,9 @@ func (c *MysqlXAConn) XAPrepare(ctx context.Context, xid string) error {
99113

100114
conn, _ := c.Conn.(driver.ExecerContext)
101115
_, err := conn.ExecContext(ctx, sb.String(), nil)
116+
if err != nil {
117+
log.Errorf("xa branch prepare failed, xid %s, err %v", xid, err)
118+
}
102119
return err
103120
}
104121

@@ -143,6 +160,8 @@ func (c *MysqlXAConn) Recover(ctx context.Context, flag int) (xids []string, err
143160
}
144161

145162
func (c *MysqlXAConn) Rollback(ctx context.Context, xid string) error {
163+
log.Infof("xa branch rollback, xid %s", xid)
164+
146165
var sb strings.Builder
147166
sb.WriteString("XA ROLLBACK ")
148167
sb.WriteString("'")
@@ -151,6 +170,9 @@ func (c *MysqlXAConn) Rollback(ctx context.Context, xid string) error {
151170

152171
conn, _ := c.Conn.(driver.ExecerContext)
153172
_, err := conn.ExecContext(ctx, sb.String(), nil)
173+
if err != nil {
174+
log.Errorf("xa branch rollback failed, xid %s, err %v", xid, err)
175+
}
154176
return err
155177
}
156178

@@ -159,6 +181,8 @@ func (c *MysqlXAConn) SetTransactionTimeout(duration time.Duration) bool {
159181
}
160182

161183
func (c *MysqlXAConn) Start(ctx context.Context, xid string, flags int) error {
184+
log.Infof("xa branch start, xid %s", xid)
185+
162186
var sb strings.Builder
163187
sb.WriteString("XA START ")
164188
sb.WriteString("'")
@@ -180,5 +204,8 @@ func (c *MysqlXAConn) Start(ctx context.Context, xid string, flags int) error {
180204

181205
conn, _ := c.Conn.(driver.ExecerContext)
182206
_, err := conn.ExecContext(ctx, sb.String(), nil)
207+
if err != nil {
208+
log.Errorf("xa branch start failed, xid %s, err %v", xid, err)
209+
}
183210
return err
184211
}

0 commit comments

Comments
 (0)