fix: 兼容钱包元数据无变化更新
This commit is contained in:
parent
7d011ce3d9
commit
a2e6e5f84d
@ -119,7 +119,10 @@ func (r *Repository) updateTransactionMetadata(ctx context.Context, tx *sql.Tx,
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if affected != 1 {
|
||||
// go-sql-driver/mysql 默认返回 changed rows,不返回 matched rows。当最终 metadata
|
||||
// 与插入时的预测值完全一致时,这条 UPDATE 合法命中主键但 affected=0;交易行已在
|
||||
// 同一事务中由 insertTransaction 成功插入,因此只能把多行更新视为不变量破坏。
|
||||
if affected > 1 {
|
||||
return xerr.New(xerr.Internal, "wallet transaction metadata update lost its transaction")
|
||||
}
|
||||
return nil
|
||||
|
||||
@ -0,0 +1,39 @@
|
||||
package mysql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"regexp"
|
||||
"testing"
|
||||
|
||||
"github.com/DATA-DOG/go-sqlmock"
|
||||
|
||||
"hyapp/pkg/appcode"
|
||||
)
|
||||
|
||||
func TestUpdateTransactionMetadataAcceptsMatchedButUnchangedRow(t *testing.T) {
|
||||
db, mock, err := sqlmock.New()
|
||||
if err != nil {
|
||||
t.Fatalf("create sqlmock: %v", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
mock.ExpectBegin()
|
||||
tx, err := db.Begin()
|
||||
if err != nil {
|
||||
t.Fatalf("begin transaction: %v", err)
|
||||
}
|
||||
mock.ExpectExec(regexp.QuoteMeta(`UPDATE wallet_transactions
|
||||
SET metadata_json = ?, updated_at_ms = ?
|
||||
WHERE app_code = ? AND transaction_id = ?`)).
|
||||
WithArgs(`{"balance_version":9}`, int64(1234), "lalu", "tx-1").
|
||||
WillReturnResult(sqlmock.NewResult(0, 0))
|
||||
|
||||
repo := &Repository{}
|
||||
ctx := appcode.WithContext(context.Background(), "lalu")
|
||||
if err := repo.updateTransactionMetadata(ctx, tx, "tx-1", map[string]int64{"balance_version": 9}, 1234); err != nil {
|
||||
t.Fatalf("unchanged matched row must not fail: %v", err)
|
||||
}
|
||||
if err := mock.ExpectationsWereMet(); err != nil {
|
||||
t.Fatalf("unmet SQL expectations: %v", err)
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user