Skip to content

Commit ea11a54

Browse files
committed
fix: more race condition handling
1 parent be1f11b commit ea11a54

3 files changed

Lines changed: 9 additions & 8 deletions

File tree

ApplicationData/Services/LinkProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ FROM app.links l
8181

8282
public async Task DeleteLinkById(int linkId)
8383
{
84-
await using var tx = await _db.CreateTransactionAsync();
84+
await using var tx = await _db.CreateTransactionAsync(System.Data.IsolationLevel.Serializable);
8585
var redditPostId = (string)await tx.ExecuteSqlScalarAsync(
8686
@"
8787
UPDATE app.links SET is_deleted = true WHERE link_id = @linkId AND is_deleted = false
@@ -108,7 +108,7 @@ public async Task<Result<int, CreateLinkError>> CreateLink(NewLink link)
108108
{
109109
try
110110
{
111-
await using var tx = await _db.CreateTransactionAsync();
111+
await using var tx = await _db.CreateTransactionAsync(System.Data.IsolationLevel.Serializable);
112112
var linkIdResult = (int?)await tx.ExecuteSqlScalarAsync("""
113113
INSERT INTO app.links (reddit_post_id, link_url, link_type, created_at, is_deleted, owner)
114114
VALUES (@redditPostId, @linkUrl, @linkType, NOW(), false, @userId)

BackgroundProcessor/Processors/LinkProcessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public async Task Process(CancellationToken cancellationToken)
5050
{
5151
var links = await _linkProvider.GetLinksByRedditPostId(item.RedditPostId, cancellationToken).ToArrayAsync(cancellationToken);
5252
var maybeExistingComment = await _commentProvider.FindCommentIdByPostId(item.RedditPostId);
53-
var tx = await _dbTxFactory.CreateTransaction();
53+
var tx = await _dbTxFactory.CreateTransaction(System.Data.IsolationLevel.Serializable);
5454

5555
if (!links.Any())
5656
{

Core/DbConnection.fs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ module private DbConnection_impl =
9999
return! cmd.ExecuteReaderAsync ()
100100
}
101101

102-
let createTransactionAsync (db : NpgsqlConnection) =
102+
let createTransactionAsync (db : NpgsqlConnection) (isolationLevel : IsolationLevel) =
103103
task {
104104
let! _ = db |> connectToDbIfNotConnectedAsync
105-
let! tx = db.BeginTransactionAsync ()
105+
let! tx = db.BeginTransactionAsync (isolationLevel)
106106
return new DbTransactionWrapper (tx)
107107
}
108108

@@ -130,8 +130,9 @@ type DbConnection (settings : DbSettings) =
130130
(sql, queryParams)
131131
||> DbConnection_impl.executeReaderAsync db
132132

133-
member _.CreateTransactionAsync () : DbTransactionWrapper Task =
134-
DbConnection_impl.createTransactionAsync db
133+
member _.CreateTransactionAsync (isolationLevel : IsolationLevel) : DbTransactionWrapper Task =
134+
isolationLevel
135+
|> DbConnection_impl.createTransactionAsync db
135136

136137
interface IDbConnection with
137138
member this.ExecuteSqlNonQuery sql queryParams = task { return! this.ExecuteSqlNonQueryAsync(sql, queryParams) }
@@ -143,4 +144,4 @@ type DbConnection (settings : DbSettings) =
143144
db.Dispose ()
144145

145146
type DbTransactionFactory (db : DbConnection) =
146-
member _.CreateTransaction () : DbTransactionWrapper Task = DbConnection_impl.createTransactionAsync db.__RawDb
147+
member _.CreateTransaction (isolationLevel : IsolationLevel) : DbTransactionWrapper Task = isolationLevel |> DbConnection_impl.createTransactionAsync db.__RawDb

0 commit comments

Comments
 (0)