1
0
mirror of https://github.com/bitwarden/server synced 2026-02-15 07:55:18 +00:00

Explicit transaction for mssql

This commit is contained in:
Thomas Rittson
2025-12-31 14:25:14 +10:00
parent 53bc10015f
commit 36aad90cb8
3 changed files with 133 additions and 107 deletions

View File

@@ -28,59 +28,72 @@ BEGIN
FROM
OPENJSON(@OrganizationUserIdsJson);
-- Insert semaphore entries first to obtain the "lock"
INSERT INTO [dbo].[DefaultCollectionSemaphore]
(
[OrganizationId],
[OrganizationUserId],
[CreationDate]
)
SELECT
@OrganizationId,
ou.[OrganizationUserId],
GETUTCDATE()
FROM
@OrganizationUserIds ou;
BEGIN TRANSACTION;
-- Insert collections for users who obtained semaphore entries
INSERT INTO [dbo].[Collection]
(
[Id],
[OrganizationId],
[Name],
[CreationDate],
[RevisionDate],
[Type],
[ExternalId],
[DefaultUserCollectionEmail]
)
SELECT
ou.[CollectionId],
@OrganizationId,
@DefaultCollectionName,
GETUTCDATE(),
GETUTCDATE(),
1, -- CollectionType.DefaultUserCollection
NULL,
NULL
FROM
@OrganizationUserIds ou;
BEGIN TRY
-- Insert semaphore entries first to obtain the "lock"
-- If this fails due to duplicate key, the entire transaction will be rolled back
INSERT INTO [dbo].[DefaultCollectionSemaphore]
(
[OrganizationId],
[OrganizationUserId],
[CreationDate]
)
SELECT
@OrganizationId,
ou.[OrganizationUserId],
GETUTCDATE()
FROM
@OrganizationUserIds ou;
-- Insert collection user mappings
INSERT INTO [dbo].[CollectionUser]
(
[CollectionId],
[OrganizationUserId],
[ReadOnly],
[HidePasswords],
[Manage]
)
SELECT
ou.[CollectionId],
ou.[OrganizationUserId],
0, -- ReadOnly = false
0, -- HidePasswords = false
1 -- Manage = true
FROM
@OrganizationUserIds ou;
-- Insert collections for users who obtained semaphore entries
INSERT INTO [dbo].[Collection]
(
[Id],
[OrganizationId],
[Name],
[CreationDate],
[RevisionDate],
[Type],
[ExternalId],
[DefaultUserCollectionEmail]
)
SELECT
ou.[CollectionId],
@OrganizationId,
@DefaultCollectionName,
GETUTCDATE(),
GETUTCDATE(),
1, -- CollectionType.DefaultUserCollection
NULL,
NULL
FROM
@OrganizationUserIds ou;
-- Insert collection user mappings
INSERT INTO [dbo].[CollectionUser]
(
[CollectionId],
[OrganizationUserId],
[ReadOnly],
[HidePasswords],
[Manage]
)
SELECT
ou.[CollectionId],
ou.[OrganizationUserId],
0, -- ReadOnly = false
0, -- HidePasswords = false
1 -- Manage = true
FROM
@OrganizationUserIds ou;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
THROW;
END CATCH
END

View File

@@ -92,7 +92,7 @@ public class CreateDefaultCollectionsTests
collectionRepository.CreateDefaultCollectionsAsync(
organization.Id,
[orgUser.Id],
"My Items"));
"My Items Duplicate"));
// Assert - Only one collection should exist
var collections = await collectionRepository.GetManyByOrganizationIdAsync(organization.Id);

View File

@@ -24,60 +24,73 @@ BEGIN
FROM
OPENJSON(@OrganizationUserIdsJson);
-- Insert semaphore entries first to obtain the "lock"
INSERT INTO [dbo].[DefaultCollectionSemaphore]
(
[OrganizationId],
[OrganizationUserId],
[CreationDate]
)
SELECT
@OrganizationId,
ou.[OrganizationUserId],
GETUTCDATE()
FROM
@OrganizationUserIds ou;
BEGIN TRANSACTION;
-- Insert collections for users who obtained semaphore entries
INSERT INTO [dbo].[Collection]
(
[Id],
[OrganizationId],
[Name],
[CreationDate],
[RevisionDate],
[Type],
[ExternalId],
[DefaultUserCollectionEmail]
)
SELECT
ou.[CollectionId],
@OrganizationId,
@DefaultCollectionName,
GETUTCDATE(),
GETUTCDATE(),
1, -- CollectionType.DefaultUserCollection
NULL,
NULL
FROM
@OrganizationUserIds ou;
BEGIN TRY
-- Insert semaphore entries first to obtain the "lock"
-- If this fails due to duplicate key, the entire transaction will be rolled back
INSERT INTO [dbo].[DefaultCollectionSemaphore]
(
[OrganizationId],
[OrganizationUserId],
[CreationDate]
)
SELECT
@OrganizationId,
ou.[OrganizationUserId],
GETUTCDATE()
FROM
@OrganizationUserIds ou;
-- Insert collection user mappings
INSERT INTO [dbo].[CollectionUser]
(
[CollectionId],
[OrganizationUserId],
[ReadOnly],
[HidePasswords],
[Manage]
)
SELECT
ou.[CollectionId],
ou.[OrganizationUserId],
0, -- ReadOnly = false
0, -- HidePasswords = false
1 -- Manage = true
FROM
@OrganizationUserIds ou;
-- Insert collections for users who obtained semaphore entries
INSERT INTO [dbo].[Collection]
(
[Id],
[OrganizationId],
[Name],
[CreationDate],
[RevisionDate],
[Type],
[ExternalId],
[DefaultUserCollectionEmail]
)
SELECT
ou.[CollectionId],
@OrganizationId,
@DefaultCollectionName,
GETUTCDATE(),
GETUTCDATE(),
1, -- CollectionType.DefaultUserCollection
NULL,
NULL
FROM
@OrganizationUserIds ou;
-- Insert collection user mappings
INSERT INTO [dbo].[CollectionUser]
(
[CollectionId],
[OrganizationUserId],
[ReadOnly],
[HidePasswords],
[Manage]
)
SELECT
ou.[CollectionId],
ou.[OrganizationUserId],
0, -- ReadOnly = false
0, -- HidePasswords = false
1 -- Manage = true
FROM
@OrganizationUserIds ou;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
THROW;
END CATCH
END
GO