函数 TestTransferTx(ttesting.T) { store := NewStore(testDB) account1 := createRandomAccount(t) account2 := createRandomAccount(t) fmt.Println(">> before:", account1.Balance, account2.Balance) // run n concurrent transfer transactions // 运输n个并发传输事务 n := 5 amount := int64(10) errs := make(chan error) results := make(chan TransferTxResult) for i := 0; 我 < n; i++ { go func() { ctx := context.Background() 结果,err := store.TransferTx(ctx, TransferTxParams{ FromAccountID: account1.ID, ToAccountID: account2.ID, Amount: amount, }) errs <- err results <- result }() } //检查结果 existed := make(map[int]bool) for i := 0; 我 < n; i++ { err := <-errs require.NoError(t, err) result := <-results require.NotEmpty(t, result) //检查传输检查传输 transfer := result.金额,2金额,3金额,......n*金额 k := int(diff1 / amount) require.True(t, k >= 1 && k <= n) require.NotContains(t, existed, k) existed[k] = true } //检查最终更新的余额 updatedAccount1, err := testQueries.GetAccount(context.Background(), account1.ID) require.NoError(t, err) updatedAccount2, err := testQueries. GetAccount(context.Background(), account2.ID) require.NoError(t, err) fmt.Println(">> 之后:", updatedAccount1.Balance, updatedAccount2.Balance) require.Equal(t, account1.Balance-int64 (n)*金额,updatedAccount1.Balance) require.Equal(t, account2.Balance+int64(n)*amount, updatedAccount2.Balance) }
时间: 2024-04-03 14:37:05 浏览: 53
SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法
这段代码是一个 Go 语言函数,用于测试一个行账户转账的并发事务处理。函数中创建了两个随机账户,并在并发的情况下进行 n 次金额为 amount 的转账操作。中使用了 Go 语言的并发编程机制,通过 goroutine 来并发执行转账事务,并将执行结果和错误分别通过结果通道和错误通道返回。在所有并发操作执行完毕后,函数会检查每次转账的结果,检查每次转账是否成功,并检查最终更新的账户余额是否正确。
阅读全文