Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions aborted_transactions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ func TestCommitAborted(t *testing.T) {
if err != nil {
t.Fatalf("begin failed: %v", err)
}
if _, err := tx.ExecContext(ctx, "set local transaction_tag = 'my_tx_tag'"); err != nil {
t.Fatalf("set local transaction tag failed: %v", err)
}
if _, err := tx.ExecContext(ctx, testutil.UpdateBarSetFoo); err != nil {
t.Fatal(err)
}
Expand All @@ -52,10 +55,30 @@ func TestCommitAborted(t *testing.T) {
t.Fatalf("commit failed: %v", err)
}
reqs := server.TestSpanner.DrainRequestsFromServer()
beginReqs := testutil.RequestsOfType(reqs, reflect.TypeOf(&sppb.BeginTransactionRequest{}))
if g, w := len(beginReqs), 1; g != w {
t.Fatalf("begin request count mismatch\n Got: %v\nWant: %v", g, w)
}
for i, req := range beginReqs {
if g, w := req.(*sppb.BeginTransactionRequest).RequestOptions.TransactionTag, "my_tx_tag"; g != w {
t.Fatalf("%d: begin request tag mismatch\n Got: %v\nWant: %v", i, g, w)
}
}
commitReqs := testutil.RequestsOfType(reqs, reflect.TypeOf(&sppb.CommitRequest{}))
if g, w := len(commitReqs), 2; g != w {
t.Fatalf("commit request count mismatch\n Got: %v\nWant: %v", g, w)
}
for i, req := range commitReqs {
if g, w := req.(*sppb.CommitRequest).RequestOptions.TransactionTag, "my_tx_tag"; g != w {
t.Fatalf("%d: commit request tag mismatch\n Got: %v\nWant: %v", i, g, w)
}
}
execReqs := testutil.RequestsOfType(reqs, reflect.TypeOf(&sppb.ExecuteSqlRequest{}))
for i, req := range execReqs {
if g, w := req.(*sppb.ExecuteSqlRequest).RequestOptions.TransactionTag, "my_tx_tag"; g != w {
t.Fatalf("%d: execute request tag mismatch\n Got: %v\nWant: %v", i, g, w)
}
}

// Verify that the db is still usable.
if _, err := db.ExecContext(ctx, testutil.UpdateSingersSetLastName); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ internal void AbortTransaction(string transactionId)
_abortedTransactions.TryAdd(ByteString.FromBase64(transactionId), true);
}

internal void AbortNextStatement()
public void AbortNextStatement()
{
lock (_lock)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,64 @@
Assert.That(request.Transaction?.Begin?.ReadWrite, Is.Not.Null);
}

[Test]
public void TestAbortedReadWriteTransaction([Values] LibType libType)
{
var updateSql = "update my_table set value=@value where id=@id";
Fixture.SpannerMock.AddOrUpdateStatementResult(updateSql, StatementResult.CreateUpdateCount(1));

using var pool = Pool.Create(SpannerLibDictionary[libType], ConnectionString);
using var connection = pool.CreateConnection();
connection.BeginTransaction(new TransactionOptions
{
IsolationLevel = TransactionOptions.Types.IsolationLevel.RepeatableRead,
});
using(connection.Execute(new ExecuteSqlRequest
{
Sql = "set local transaction_tag = 'my_tx_tag'",
}));

Check warning on line 105 in spannerlib/wrappers/spannerlib-dotnet/spannerlib-dotnet-tests/TransactionTests.cs

View workflow job for this annotation

GitHub Actions / dotnet-wrapper (1.25.x, windows-latest)

Possible mistaken empty statement

Check warning on line 105 in spannerlib/wrappers/spannerlib-dotnet/spannerlib-dotnet-tests/TransactionTests.cs

View workflow job for this annotation

GitHub Actions / dotnet-wrapper (1.25.x, windows-latest)

Possible mistaken empty statement

Check warning on line 105 in spannerlib/wrappers/spannerlib-dotnet/spannerlib-dotnet-tests/TransactionTests.cs

View workflow job for this annotation

GitHub Actions / dotnet-wrapper (1.25.x, macos-latest)

Possible mistaken empty statement

Check warning on line 105 in spannerlib/wrappers/spannerlib-dotnet/spannerlib-dotnet-tests/TransactionTests.cs

View workflow job for this annotation

GitHub Actions / dotnet-wrapper (1.25.x, macos-latest)

Possible mistaken empty statement

Check warning on line 105 in spannerlib/wrappers/spannerlib-dotnet/spannerlib-dotnet-tests/TransactionTests.cs

View workflow job for this annotation

GitHub Actions / dotnet-wrapper (1.25.x, ubuntu-latest)

Possible mistaken empty statement

Check warning on line 105 in spannerlib/wrappers/spannerlib-dotnet/spannerlib-dotnet-tests/TransactionTests.cs

View workflow job for this annotation

GitHub Actions / dotnet-wrapper (1.25.x, ubuntu-latest)

Possible mistaken empty statement

using var rows = connection.Execute(new ExecuteSqlRequest
{
Sql = updateSql,
Params = new Struct
{
Fields =
{
["value"] = Value.ForString("test-value"),
["id"] = Value.ForString("1")
},
}
});
Assert.That(rows.Next(), Is.Null);
Assert.That(rows.UpdateCount, Is.EqualTo(1));

Fixture.SpannerMock.AbortNextStatement();
var commitResponse = connection.Commit();
Assert.That(commitResponse, Is.Not.Null);
Assert.That(commitResponse.CommitTimestamp, Is.Not.Null);

Assert.That(Fixture.SpannerMock.Requests.OfType<BeginTransactionRequest>().Count(), Is.EqualTo(1));
Assert.That(Fixture.SpannerMock.Requests.OfType<ExecuteSqlRequest>().Count(), Is.EqualTo(2));
Assert.That(Fixture.SpannerMock.Requests.OfType<CommitRequest>().Count(), Is.EqualTo(2));

var requests = Fixture.SpannerMock.Requests.OfType<ExecuteSqlRequest>().ToList();
Assert.That(requests[0].Transaction?.Begin?.ReadWrite, Is.Not.Null);
Assert.That(requests[1].Transaction?.HasId ?? false, Is.True);
foreach (var request in requests)
{
Assert.That(request.RequestOptions.TransactionTag, Is.EqualTo("my_tx_tag"));
}
foreach (var request in Fixture.SpannerMock.Requests.OfType<CommitRequest>())
{
Assert.That(request.RequestOptions.TransactionTag, Is.EqualTo("my_tx_tag"));
}
foreach (var request in Fixture.SpannerMock.Requests.OfType<BeginTransactionRequest>())
{
Assert.That(request.RequestOptions.TransactionTag, Is.EqualTo("my_tx_tag"));
}
}

[Test]
public void TestReadOnlyTransaction([Values] LibType libType)
{
Expand Down
Loading