| @@ -16,7 +16,7 @@ | |||
| # | |||
| # format go imports style | |||
| go install -v golang.org/x/tools/cmd/goimports | |||
| go install golang.org/x/tools/cmd/goimports | |||
| goimports -local github.com/seata/seata-go -w . | |||
| # format licence style | |||
| @@ -18,7 +18,6 @@ | |||
| package client | |||
| import ( | |||
| "github.com/seata/seata-go/pkg/remoting/getty" | |||
| "sync" | |||
| "github.com/seata/seata-go/pkg/datasource" | |||
| @@ -26,6 +25,7 @@ import ( | |||
| "github.com/seata/seata-go/pkg/datasource/sql/exec/config" | |||
| "github.com/seata/seata-go/pkg/integration" | |||
| remoteConfig "github.com/seata/seata-go/pkg/remoting/config" | |||
| "github.com/seata/seata-go/pkg/remoting/getty" | |||
| "github.com/seata/seata-go/pkg/remoting/processor/client" | |||
| "github.com/seata/seata-go/pkg/rm" | |||
| "github.com/seata/seata-go/pkg/rm/tcc" | |||
| @@ -322,22 +322,22 @@ func (c *XAConn) Commit(ctx context.Context) error { | |||
| now := time.Now() | |||
| if c.end(ctx, xa.TMSuccess) != nil { | |||
| return c.commitErrorHandle() | |||
| return c.commitErrorHandle(ctx) | |||
| } | |||
| if c.checkTimeout(ctx, now) != nil { | |||
| return c.commitErrorHandle() | |||
| return c.commitErrorHandle(ctx) | |||
| } | |||
| if c.xaResource.XAPrepare(ctx, c.xaBranchXid.String()) != nil { | |||
| return c.commitErrorHandle() | |||
| return c.commitErrorHandle(ctx) | |||
| } | |||
| return nil | |||
| } | |||
| func (c *XAConn) commitErrorHandle() error { | |||
| func (c *XAConn) commitErrorHandle(ctx context.Context) error { | |||
| var err error | |||
| if err = c.tx.Rollback(); err != nil { | |||
| if err = c.XaRollback(ctx, c.xaBranchXid); err != nil { | |||
| err = fmt.Errorf("failed to report XA branch commit-failure xid:%s, err:%w", c.txCtx.XID, err) | |||
| } | |||
| c.cleanXABranchContext() | |||
| @@ -389,7 +389,7 @@ func (c *XAConn) XaRollbackByBranchId(ctx context.Context, xaXid XAXid) error { | |||
| } | |||
| func (c *XAConn) XaRollback(ctx context.Context, xaXid XAXid) error { | |||
| err := c.xaResource.Rollback(ctx, xaXid.GetGlobalXid()) | |||
| err := c.xaResource.Rollback(ctx, xaXid.String()) | |||
| c.releaseIfNecessary() | |||
| return err | |||
| } | |||
| @@ -22,14 +22,15 @@ import ( | |||
| "database/sql" | |||
| "database/sql/driver" | |||
| "fmt" | |||
| "github.com/seata/seata-go/pkg/util/log" | |||
| "sync" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/datasource" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/types" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/undo" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/util" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/xa" | |||
| "github.com/seata/seata-go/pkg/protocol/branch" | |||
| "github.com/seata/seata-go/pkg/util/log" | |||
| ) | |||
| type dbOption func(db *DBResource) | |||
| @@ -218,10 +219,17 @@ func (db *DBResource) ConnectionForXA(ctx context.Context, xaXid XAXid) (*XAConn | |||
| if err != nil { | |||
| return nil, fmt.Errorf("get xa new connection failure, xid:%s, err:%v", xaXid.String(), err) | |||
| } | |||
| xaResource, err := xa.CreateXAResource(newDriverConn, types.DBTypeMySQL) | |||
| if err != nil { | |||
| return nil, fmt.Errorf("create xa resoruce err:%w", err) | |||
| } | |||
| xaConn := &XAConn{ | |||
| Conn: &Conn{ | |||
| targetConn: newDriverConn, | |||
| res: db, | |||
| }, | |||
| xaBranchXid: XaIdBuild(xaXid.GetGlobalXid(), xaXid.GetBranchId()), | |||
| xaResource: xaResource, | |||
| } | |||
| return xaConn, nil | |||
| } | |||
| @@ -28,6 +28,7 @@ import ( | |||
| "strings" | |||
| "github.com/go-sql-driver/mysql" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/datasource" | |||
| mysql2 "github.com/seata/seata-go/pkg/datasource/sql/datasource/mysql" | |||
| "github.com/seata/seata-go/pkg/datasource/sql/types" | |||
| @@ -70,7 +70,7 @@ type multiDelete struct { | |||
| clear bool | |||
| } | |||
| //NewMultiDeleteExecutor get multiDelete executor | |||
| // NewMultiDeleteExecutor get multiDelete executor | |||
| func NewMultiDeleteExecutor(parserCtx *types.ParseContext, execContent *types.ExecContext, hooks []exec.SQLHook) *multiDeleteExecutor { | |||
| return &multiDeleteExecutor{parserCtx: parserCtx, execContext: execContent, baseExecutor: baseExecutor{hooks: hooks}} | |||
| } | |||
| @@ -25,6 +25,8 @@ import ( | |||
| "io" | |||
| "strings" | |||
| "time" | |||
| "github.com/seata/seata-go/pkg/util/log" | |||
| ) | |||
| type MysqlXAConn struct { | |||
| @@ -36,6 +38,8 @@ func NewMysqlXaConn(conn driver.Conn) *MysqlXAConn { | |||
| } | |||
| func (c *MysqlXAConn) Commit(ctx context.Context, xid string, onePhase bool) error { | |||
| log.Infof("xa branch commit, xid %s", xid) | |||
| var sb strings.Builder | |||
| sb.WriteString("XA COMMIT ") | |||
| sb.WriteString("'") | |||
| @@ -47,10 +51,15 @@ func (c *MysqlXAConn) Commit(ctx context.Context, xid string, onePhase bool) err | |||
| conn, _ := c.Conn.(driver.ExecerContext) | |||
| _, err := conn.ExecContext(ctx, sb.String(), nil) | |||
| if err != nil { | |||
| log.Errorf("xa branch commit failed, xid %s, err %v", xid, err) | |||
| } | |||
| return err | |||
| } | |||
| func (c *MysqlXAConn) End(ctx context.Context, xid string, flags int) error { | |||
| log.Infof("xa branch end, xid %s", xid) | |||
| var sb strings.Builder | |||
| sb.WriteString("XA END ") | |||
| sb.WriteString("'") | |||
| @@ -71,6 +80,9 @@ func (c *MysqlXAConn) End(ctx context.Context, xid string, flags int) error { | |||
| conn, _ := c.Conn.(driver.ExecerContext) | |||
| _, err := conn.ExecContext(ctx, sb.String(), nil) | |||
| if err != nil { | |||
| log.Errorf("xa branch end failed, xid %s, err %v", xid, err) | |||
| } | |||
| return err | |||
| } | |||
| @@ -91,6 +103,8 @@ func (c *MysqlXAConn) IsSameRM(ctx context.Context, xares XAResource) bool { | |||
| } | |||
| func (c *MysqlXAConn) XAPrepare(ctx context.Context, xid string) error { | |||
| log.Infof("xa branch prepare, xid %s", xid) | |||
| var sb strings.Builder | |||
| sb.WriteString("XA PREPARE ") | |||
| sb.WriteString("'") | |||
| @@ -99,6 +113,9 @@ func (c *MysqlXAConn) XAPrepare(ctx context.Context, xid string) error { | |||
| conn, _ := c.Conn.(driver.ExecerContext) | |||
| _, err := conn.ExecContext(ctx, sb.String(), nil) | |||
| if err != nil { | |||
| log.Errorf("xa branch prepare failed, xid %s, err %v", xid, err) | |||
| } | |||
| return err | |||
| } | |||
| @@ -143,6 +160,8 @@ func (c *MysqlXAConn) Recover(ctx context.Context, flag int) (xids []string, err | |||
| } | |||
| func (c *MysqlXAConn) Rollback(ctx context.Context, xid string) error { | |||
| log.Infof("xa branch rollback, xid %s", xid) | |||
| var sb strings.Builder | |||
| sb.WriteString("XA ROLLBACK ") | |||
| sb.WriteString("'") | |||
| @@ -151,6 +170,9 @@ func (c *MysqlXAConn) Rollback(ctx context.Context, xid string) error { | |||
| conn, _ := c.Conn.(driver.ExecerContext) | |||
| _, err := conn.ExecContext(ctx, sb.String(), nil) | |||
| if err != nil { | |||
| log.Errorf("xa branch rollback failed, xid %s, err %v", xid, err) | |||
| } | |||
| return err | |||
| } | |||
| @@ -159,6 +181,8 @@ func (c *MysqlXAConn) SetTransactionTimeout(duration time.Duration) bool { | |||
| } | |||
| func (c *MysqlXAConn) Start(ctx context.Context, xid string, flags int) error { | |||
| log.Infof("xa branch start, xid %s", xid) | |||
| var sb strings.Builder | |||
| sb.WriteString("XA START ") | |||
| sb.WriteString("'") | |||
| @@ -180,5 +204,8 @@ func (c *MysqlXAConn) Start(ctx context.Context, xid string, flags int) error { | |||
| conn, _ := c.Conn.(driver.ExecerContext) | |||
| _, err := conn.ExecContext(ctx, sb.String(), nil) | |||
| if err != nil { | |||
| log.Errorf("xa branch start failed, xid %s, err %v", xid, err) | |||
| } | |||
| return err | |||
| } | |||