Skip to content

Commit 3ef285a

Browse files
authored
refactor: optimize some code (#7)
* refactor: support manipulating the same data in different transaction branches * refactor: optimize code
1 parent 39dbb93 commit 3ef285a

File tree

5 files changed

+40
-21
lines changed

5 files changed

+40
-21
lines changed

executor.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ func (executor *deleteExecutor) getTableMeta() (schema.TableMeta, error) {
317317
return tableMetaCache.GetTableMeta(executor.mc, executor.GetTableName())
318318
}
319319

320-
func (executor *selectForUpdateExecutor) Execute(lockRetryInterval time.Duration, lockRetryTimes int) (driver.Rows, error) {
320+
func (executor *selectForUpdateExecutor) Execute(xid string, lockRetryInterval time.Duration, lockRetryTimes int) (driver.Rows, error) {
321321
tableMeta, err := executor.getTableMeta()
322322
if err != nil {
323323
return nil, err
@@ -336,7 +336,7 @@ func (executor *selectForUpdateExecutor) Execute(lockRetryInterval time.Duration
336336
var err error
337337
for i := 0; i < lockRetryTimes; i++ {
338338
lockable, err = core.GetDistributedTransactionManager().
339-
IsLockable(context.Background(), executor.mc.cfg.DBName, lockKeys)
339+
IsLockableWithXID(context.Background(), xid, executor.mc.cfg.DBName, lockKeys)
340340
if lockable && err == nil {
341341
break
342342
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ module github.com/cectc/mysql
33
go 1.13
44

55
require (
6-
github.com/cectc/dbpack v0.1.1
7-
github.com/cectc/hptx v1.0.0
6+
github.com/cectc/dbpack v0.2.0
7+
github.com/cectc/hptx v1.0.2
88
github.com/google/go-cmp v0.5.7
99
github.com/patrickmn/go-cache v2.1.0+incompatible
1010
github.com/pingcap/parser v0.0.0-20210831085004-b5390aa83f65

go.sum

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2
119119
github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5/go.mod h1:jtAfVaU/2cu1+wdSRPWE2c1N2qeAA3K4RH9pYgqwets=
120120
github.com/carlmjohnson/flagext v0.21.0/go.mod h1:Eenv0epIUAr4NuedNmkzI8WmBmjIxZC239XcKxYS2ac=
121121
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
122-
github.com/cectc/dbpack v0.1.1 h1:mFBD8U4RGS5F/ttffCXdTGwvlR+2Xh6mrfQY/iAZh4o=
123-
github.com/cectc/dbpack v0.1.1/go.mod h1:eaXGsVNNsCVFFvnOZs7e8xDV2Uymj2QWpMyWAOCFLdA=
124-
github.com/cectc/hptx v1.0.0 h1:lW19jGlROTNHL454dZ0/BiaskbhQ9xavtPFxoB4JND0=
125-
github.com/cectc/hptx v1.0.0/go.mod h1:93Jduwm0XguQsX6Bjn12Mm4MrOwXy3ma4VgFGtfvHnM=
122+
github.com/cectc/dbpack v0.2.0 h1:QXsw/fb/gG4XeJ/6Sq8hRks31K0zTkqX97eJ4NjQtQk=
123+
github.com/cectc/dbpack v0.2.0/go.mod h1:RMyR8SV2EfzqxA3yjbCU7Hy9bKAG9kJ6LWW/+tdYics=
124+
github.com/cectc/hptx v1.0.2 h1:gWY+U34D74rUP/O/gtIBYmjRpYqucoBee97ccdQQTE4=
125+
github.com/cectc/hptx v1.0.2/go.mod h1:KcXq8gLwHtUDuVz58ts9GSlwE8tL24sa556g5AJHGWc=
126126
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
127127
github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
128128
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -185,6 +185,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
185185
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
186186
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
187187
github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=
188+
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso=
188189
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
189190
github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM=
190191
github.com/cznic/parser v0.0.0-20181122101858-d773202d5b1f/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM=
@@ -208,7 +209,7 @@ github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwu
208209
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
209210
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
210211
github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
211-
github.com/dop251/goja v0.0.0-20220501172647-e1eca0b61fa9/go.mod h1:TQJQ+ZNyFVvUtUEtCZxBhfWiH7RJqR3EivNmvD6Waik=
212+
github.com/dop251/goja v0.0.0-20220516123900-4418d4575a41/go.mod h1:TQJQ+ZNyFVvUtUEtCZxBhfWiH7RJqR3EivNmvD6Waik=
212213
github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y=
213214
github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM=
214215
github.com/dubbogo/go-zookeeper v1.0.4-0.20211212162352-f9d2183d89d5/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c=
@@ -283,8 +284,10 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
283284
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
284285
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
285286
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
287+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
286288
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
287289
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
290+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
288291
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
289292
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
290293
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
@@ -783,6 +786,7 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
783786
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
784787
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
785788
github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
789+
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
786790
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
787791
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
788792
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
@@ -959,6 +963,10 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
959963
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
960964
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
961965
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
966+
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
967+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0/go.mod h1:K4GDXPY6TjUiwbOh+DkKaEdCF8y+lvMoM6SeAPyfCCM=
968+
go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
969+
go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
962970
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
963971
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
964972
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -1219,6 +1227,7 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
12191227
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
12201228
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
12211229
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1230+
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
12221231
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12231232
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12241233
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

statement.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
159159
stmt: selectForUpdateStmt,
160160
args: args,
161161
}
162-
return executor.Execute(config.GetATConfig().LockRetryInterval, config.GetATConfig().LockRetryTimes)
162+
return executor.Execute(stmt.mc.ctx.xid, config.GetATConfig().LockRetryInterval, config.GetATConfig().LockRetryTimes)
163163
}
164164
}
165165

undo_executor.go

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ func DeleteBuildUndoSql(undoLog sqlUndoLog) string {
4040
var sbCols, sbVals strings.Builder
4141
var size = len(fields)
4242
for i, field := range fields {
43-
fmt.Fprintf(&sbCols, "`%s`", field.Name)
44-
fmt.Fprint(&sbVals, "?")
43+
sbCols.WriteString(fmt.Sprintf("`%s`", field.Name))
44+
sbVals.WriteByte('?')
4545
if i < size-1 {
46-
fmt.Fprint(&sbCols, ", ")
47-
fmt.Fprint(&sbVals, ", ")
46+
sbCols.WriteString(", ")
47+
sbVals.WriteString(", ")
4848
}
4949
}
5050
insertColumns := sbCols.String()
@@ -79,9 +79,9 @@ func UpdateBuildUndoSql(undoLog sqlUndoLog) string {
7979
var sb strings.Builder
8080
var size = len(nonPkFields)
8181
for i, field := range nonPkFields {
82-
fmt.Fprintf(&sb, "`%s` = ?", field.Name)
82+
sb.WriteString(fmt.Sprintf("`%s` = ?", field.Name))
8383
if i < size-1 {
84-
fmt.Fprint(&sb, ", ")
84+
sb.WriteString(", ")
8585
}
8686
}
8787
updateColumns := sb.String()
@@ -178,8 +178,18 @@ func (executor UndoExecutor) dataValidationAndGoOn(conn *mysqlConn) (bool, error
178178
log.Info("Stop rollback because there is no data change between the before data snapshot and the after data snapshot.")
179179
return false, nil
180180
} else {
181-
oldRows, _ := json.Marshal(executor.sqlUndoLog.AfterImage.Rows)
182-
newRows, _ := json.Marshal(currentRecords.Rows)
181+
var (
182+
oldRows, newRows []byte
183+
err error
184+
)
185+
if oldRows, err = json.Marshal(executor.sqlUndoLog.AfterImage.Rows); err != nil {
186+
return false, err
187+
}
188+
if currentRecords != nil {
189+
if newRows, err = json.Marshal(currentRecords.Rows); err != nil {
190+
return false, err
191+
}
192+
}
183193
log.Errorf("check dirty datas failed, old and new data are not equal, tableName:[%s], oldRows:[%s], newRows:[%s].",
184194
executor.sqlUndoLog.TableName, string(oldRows), string(newRows))
185195
return false, errors.New("Has dirty records when undo.")
@@ -207,12 +217,12 @@ func (executor UndoExecutor) queryCurrentRecords(conn *mysqlConn) (*schema.Table
207217
var i = 0
208218
columnCount := len(tableMeta.Columns)
209219
for _, columnName := range tableMeta.Columns {
210-
fmt.Fprint(&b, misc.CheckAndReplace(columnName))
220+
b.WriteString(misc.CheckAndReplace(columnName))
211221
i = i + 1
212222
if i < columnCount {
213-
fmt.Fprint(&b, ",")
223+
b.WriteByte(',')
214224
} else {
215-
fmt.Fprint(&b, " ")
225+
b.WriteByte(' ')
216226
}
217227
}
218228

0 commit comments

Comments
 (0)