Skip to content

Commit 18060cd

Browse files
committed
BulkUpsert: forbid usage inside transaction, add test
1 parent 4af5c80 commit 18060cd

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/Ydb.Sdk/src/Ado/YdbConnection.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public async Task BulkUpsertAsync(
6262
IReadOnlyList<IReadOnlyList<object?>> rows,
6363
CancellationToken cancellationToken = default)
6464
{
65+
if (CurrentTransaction is { Completed: false })
66+
throw new InvalidOperationException("BulkUpsert cannot be used inside an active transaction.");
67+
6568
if (columns == null || columns.Count == 0)
6669
throw new ArgumentException("Columns must not be empty", nameof(columns));
6770
if (rows == null || rows.Count == 0)

src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/YdbConnectionTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,4 +460,52 @@ PRIMARY KEY (Id)
460460
await dropCmd.ExecuteNonQueryAsync();
461461
}
462462
}
463+
464+
[Fact]
465+
public async Task BulkUpsert_Throws_WhenTransactionIsOpen()
466+
{
467+
var tableName = $"BulkTest_{Guid.NewGuid():N}";
468+
var database = new YdbConnectionStringBuilder(_connectionStringTls).Database.TrimEnd('/');
469+
var absTablePath = string.IsNullOrEmpty(database) ? tableName : $"{database}/{tableName}";
470+
471+
await using var conn = new YdbConnection(_connectionStringTls);
472+
await conn.OpenAsync();
473+
474+
await using (var createCmd = conn.CreateCommand())
475+
{
476+
createCmd.CommandText = $@"
477+
CREATE TABLE {tableName} (
478+
Id Int32,
479+
Name Utf8,
480+
PRIMARY KEY (Id)
481+
)";
482+
await createCmd.ExecuteNonQueryAsync();
483+
}
484+
485+
await Task.Delay(500);
486+
487+
var columns = new[] { "Id", "Name" };
488+
var rows = new List<IReadOnlyList<object?>>
489+
{
490+
new object?[] { 1, "Alice" },
491+
new object?[] { 2, "Bob" }
492+
};
493+
494+
await conn.BeginTransactionAsync();
495+
496+
var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
497+
{
498+
await conn.BulkUpsertAsync(absTablePath, columns, rows);
499+
});
500+
501+
Assert.Contains("BulkUpsert cannot be used inside an active transaction", ex.Message);
502+
503+
await conn.CurrentTransaction.RollbackAsync();
504+
505+
await using (var dropCmd = conn.CreateCommand())
506+
{
507+
dropCmd.CommandText = $"DROP TABLE {tableName}";
508+
await dropCmd.ExecuteNonQueryAsync();
509+
}
510+
}
463511
}

0 commit comments

Comments
 (0)