From 5403f11f41251b9219d788cf6e7d2197cf78c6f1 Mon Sep 17 00:00:00 2001 From: Yves Reynhout Date: Thu, 12 Apr 2018 16:55:26 +0200 Subject: [PATCH 1/4] Replaced query for latest stream position by SCOPE_IDENTITY. Replaced query for latest stream version by computation based on new stream messages. Simplified metadata stream query (now uses index seek instead of scan). --- .../AppendStreamExpectedVersion.sql | 102 ++++++++---------- 1 file changed, 44 insertions(+), 58 deletions(-) diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql index 60963f798..94f69c7e5 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql @@ -1,67 +1,53 @@ BEGIN TRANSACTION AppendStream; - DECLARE @streamIdInternal AS INT; - DECLARE @latestStreamVersion AS INT; - DECLARE @latestStreamPosition AS BIGINT; - - SELECT @streamIdInternal = dbo.Streams.IdInternal, - @latestStreamVersion = dbo.Streams.[Version] - FROM dbo.Streams - WHERE dbo.Streams.Id = @streamId; - - IF @streamIdInternal IS NULL - BEGIN - ROLLBACK TRANSACTION AppendStream; - RAISERROR('WrongExpectedVersion', 16, 1); - RETURN; - END - - IF @latestStreamVersion != @expectedStreamVersion - BEGIN - ROLLBACK TRANSACTION AppendStream; - RAISERROR('WrongExpectedVersion', 16, 2); - RETURN; - END - -INSERT INTO dbo.Messages (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) - SELECT @streamIdInternal, - StreamVersion + @latestStreamVersion + 1, - Id, - Created, - [Type], - JsonData, - JsonMetadata - FROM @newMessages - ORDER BY StreamVersion; - - SELECT TOP(1) - @latestStreamVersion = dbo.Messages.StreamVersion, - @latestStreamPosition = dbo.Messages.Position - FROM dbo.Messages - WHERE dbo.Messages.StreamIDInternal = @streamIdInternal - ORDER BY dbo.Messages.Position DESC - - UPDATE dbo.Streams - SET dbo.Streams.[Version] = @latestStreamVersion, - dbo.Streams.[Position] = @latestStreamPosition - WHERE dbo.Streams.IdInternal = @streamIdInternal +DECLARE @streamIdInternal AS INT; +DECLARE @latestStreamVersion AS INT; +DECLARE @latestStreamPosition AS BIGINT; + +SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version] +FROM dbo.Streams +WHERE dbo.Streams.Id = @streamId; + +IF @streamIdInternal IS NULL + BEGIN + ROLLBACK TRANSACTION AppendStream; + RAISERROR('WrongExpectedVersion', 16, 1); + RETURN; + END +IF @latestStreamVersion != @expectedStreamVersion + BEGIN + ROLLBACK TRANSACTION AppendStream; + RAISERROR('WrongExpectedVersion', 16, 2); + RETURN; + END + +INSERT INTO dbo.Messages + (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) + SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata + FROM @newMessages + ORDER BY StreamVersion; + +SET @latestStreamPosition = SCOPE_IDENTITY() + +SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 +FROM @newMessages + +UPDATE dbo.Streams + SET dbo.Streams.[Version] = @latestStreamVersion, + dbo.Streams.[Position] = @latestStreamPosition + WHERE dbo.Streams.IdInternal = @streamIdInternal COMMIT TRANSACTION AppendStream; /* Select CurrentVersion, CurrentPosition */ - SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition +SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition /* Select Metadata */ - DECLARE @metadataStreamId as NVARCHAR(42) - DECLARE @metadataStreamIdInternal as INT - SET @metadataStreamId = '$$' + @streamId - - SELECT @metadataStreamIdInternal = dbo.Streams.IdInternal - FROM dbo.Streams - WHERE dbo.Streams.Id = @metadataStreamId; - SELECT TOP(1) - dbo.Messages.JsonData - FROM dbo.Messages - WHERE dbo.Messages.StreamIdInternal = @metadataStreamIdInternal - ORDER BY dbo.Messages.Position DESC; +SELECT dbo.Messages.JsonData +FROM dbo.Messages +WHERE dbo.Messages.Position = ( + SELECT dbo.Streams.Position + FROM dbo.Streams + WHERE dbo.Streams.Id = '$$' + @streamId +) From 0ac04cc4637528b629473625311bae64f1a96614 Mon Sep 17 00:00:00 2001 From: Yves Reynhout Date: Thu, 12 Apr 2018 18:45:28 +0200 Subject: [PATCH 2/4] Applied similar changes to ExpectedAny and ExpectedNoStream sql scripts. Applied locks to ExpectedVersion script. --- .../AppendStreamExpectedVersion.sql | 69 +++++++-------- .../AppendStreamExpectedVersionAny.sql | 78 ++++++++--------- .../AppendStreamExpectedVersionNoStream.sql | 84 +++++++++---------- 3 files changed, 108 insertions(+), 123 deletions(-) diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql index 94f69c7e5..b9c72b097 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql @@ -1,40 +1,41 @@ BEGIN TRANSACTION AppendStream; -DECLARE @streamIdInternal AS INT; -DECLARE @latestStreamVersion AS INT; -DECLARE @latestStreamPosition AS BIGINT; - -SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version] -FROM dbo.Streams -WHERE dbo.Streams.Id = @streamId; - -IF @streamIdInternal IS NULL - BEGIN - ROLLBACK TRANSACTION AppendStream; - RAISERROR('WrongExpectedVersion', 16, 1); - RETURN; - END -IF @latestStreamVersion != @expectedStreamVersion - BEGIN - ROLLBACK TRANSACTION AppendStream; - RAISERROR('WrongExpectedVersion', 16, 2); - RETURN; - END - -INSERT INTO dbo.Messages - (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) - SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata - FROM @newMessages - ORDER BY StreamVersion; - -SET @latestStreamPosition = SCOPE_IDENTITY() -SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 -FROM @newMessages + DECLARE @streamIdInternal AS INT; + DECLARE @latestStreamVersion AS INT; + DECLARE @latestStreamPosition AS BIGINT; + + SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version] + FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) + WHERE dbo.Streams.Id = @streamId; + + IF @streamIdInternal IS NULL + BEGIN + ROLLBACK TRANSACTION AppendStream; + RAISERROR('WrongExpectedVersion', 16, 1); + RETURN; + END + IF @latestStreamVersion != @expectedStreamVersion + BEGIN + ROLLBACK TRANSACTION AppendStream; + RAISERROR('WrongExpectedVersion', 16, 2); + RETURN; + END + + INSERT INTO dbo.Messages + (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) + SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata + FROM @newMessages + ORDER BY StreamVersion; + + SET @latestStreamPosition = SCOPE_IDENTITY() + + SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 + FROM @newMessages -UPDATE dbo.Streams - SET dbo.Streams.[Version] = @latestStreamVersion, - dbo.Streams.[Position] = @latestStreamPosition - WHERE dbo.Streams.IdInternal = @streamIdInternal + UPDATE dbo.Streams + SET dbo.Streams.[Version] = @latestStreamVersion, + dbo.Streams.[Position] = @latestStreamPosition + WHERE dbo.Streams.IdInternal = @streamIdInternal COMMIT TRANSACTION AppendStream; diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql index 21f21bff8..83bbb68b8 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql @@ -1,64 +1,56 @@ DECLARE @streamIdInternal AS INT; BEGIN TRANSACTION CreateStreamIfNotExists; - IF NOT EXISTS (SELECT * FROM dbo.Streams WITH (UPDLOCK, ROWLOCK, HOLDLOCK) - WHERE dbo.Streams.Id = @streamId) - INSERT INTO dbo.Streams (Id, IdOriginal) VALUES (@streamId, @streamIdOriginal); + + IF NOT EXISTS ( + SELECT * + FROM dbo.Streams WITH (UPDLOCK, ROWLOCK, HOLDLOCK) + WHERE dbo.Streams.Id = @streamId + ) + INSERT INTO dbo.Streams (Id, IdOriginal) + VALUES (@streamId, @streamIdOriginal); COMMIT TRANSACTION CreateStreamIfNotExists; BEGIN TRANSACTION AppendStream; + DECLARE @latestStreamVersion AS INT; - DECLARE @latestStreamPosition AS BIGINT; - - SELECT @streamIdInternal = dbo.Streams.IdInternal, - @latestStreamVersion = dbo.Streams.[Version] - FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) - WHERE dbo.Streams.Id = @streamId; - -INSERT INTO dbo.Messages (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) - SELECT @streamIdInternal, - StreamVersion + @latestStreamVersion + 1, - Id, - Created, - [Type], - JsonData, - JsonMetadata + DECLARE @latestStreamPosition AS BIGINT; + + SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version] + FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) + WHERE dbo.Streams.Id = @streamId; + + INSERT INTO dbo.Messages + (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) + SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata FROM @newMessages - ORDER BY StreamVersion + ORDER BY StreamVersion + + SET @latestStreamPosition = ISNULL(SCOPE_IDENTITY(), -1) - SELECT TOP(1) - @latestStreamVersion = dbo.Messages.StreamVersion, - @latestStreamPosition = dbo.Messages.Position - FROM dbo.Messages - WHERE dbo.Messages.StreamIDInternal = @streamIdInternal - ORDER BY dbo.Messages.Position DESC + SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 + FROM @newMessages - IF @latestStreamPosition IS NULL - SET @latestStreamPosition = -1 + SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) - UPDATE dbo.Streams + UPDATE dbo.Streams SET dbo.Streams.[Version] = @latestStreamVersion, dbo.Streams.[Position] = @latestStreamPosition - WHERE dbo.Streams.IdInternal = @streamIdInternal + WHERE dbo.Streams.IdInternal = @streamIdInternal COMMIT TRANSACTION AppendStream; /* Select CurrentVersion, CurrentPosition */ - SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition +SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition /* Select Metadata */ - DECLARE @metadataStreamId as NVARCHAR(42) - DECLARE @metadataStreamIdInternal as INT - SET @metadataStreamId = '$$' + @streamId - - SELECT @metadataStreamIdInternal = dbo.Streams.IdInternal - FROM dbo.Streams - WHERE dbo.Streams.Id = @metadataStreamId; - - SELECT TOP(1) - dbo.Messages.JsonData - FROM dbo.Messages - WHERE dbo.Messages.StreamIdInternal = @metadataStreamIdInternal - ORDER BY dbo.Messages.Position DESC; + +SELECT dbo.Messages.JsonData +FROM dbo.Messages +WHERE dbo.Messages.Position = ( + SELECT dbo.Streams.Position + FROM dbo.Streams + WHERE dbo.Streams.Id = '$$' + @streamId +) \ No newline at end of file diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql index eedd73581..071891cc0 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql @@ -1,58 +1,50 @@ BEGIN TRANSACTION CreateStream; + DECLARE @streamIdInternal AS INT; DECLARE @latestStreamVersion AS INT; - DECLARE @latestStreamPosition AS BIGINT; + DECLARE @latestStreamPosition AS BIGINT; BEGIN - INSERT INTO dbo.Streams (Id, IdOriginal) VALUES (@streamId, @streamIdOriginal); - SELECT @streamIdInternal = SCOPE_IDENTITY(); - - INSERT INTO dbo.Messages (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) - SELECT @streamIdInternal, - StreamVersion, - Id, - Created, - [Type], - JsonData, - JsonMetadata - FROM @newMessages - ORDER BY StreamVersion; - - SELECT TOP(1) - @latestStreamVersion = dbo.Messages.StreamVersion, - @latestStreamPosition = dbo.Messages.Position - FROM dbo.Messages - WHERE dbo.Messages.StreamIDInternal = @streamIdInternal - ORDER BY dbo.Messages.Position DESC - - IF @latestStreamVersion IS NULL - SET @latestStreamVersion = -1 - - IF @latestStreamPosition IS NULL - SET @latestStreamPosition = -1 - - UPDATE dbo.Streams - SET dbo.Streams.[Version] = @latestStreamVersion, - dbo.Streams.[Position] = @latestStreamPosition - WHERE dbo.Streams.IdInternal = @streamIdInternal + + INSERT INTO dbo.Streams + (Id, IdOriginal) + VALUES + (@streamId, @streamIdOriginal); + + SET @streamIdInternal = SCOPE_IDENTITY(); + + INSERT INTO dbo.Messages + (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) + SELECT @streamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata + FROM @newMessages + ORDER BY StreamVersion; + + SET @latestStreamPosition = ISNULL(SCOPE_IDENTITY(), -1) + + SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 + FROM @newMessages + + SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) + + UPDATE dbo.Streams + SET dbo.Streams.[Version] = @latestStreamVersion, + dbo.Streams.[Position] = @latestStreamPosition + WHERE dbo.Streams.IdInternal = @streamIdInternal + END; + COMMIT TRANSACTION CreateStream; /* Select CurrentVersion, CurrentPosition */ - SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition +SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition /* Select Metadata */ - DECLARE @metadataStreamId as NVARCHAR(42) - DECLARE @metadataStreamIdInternal as INT - SET @metadataStreamId = '$$' + @streamId - - SELECT @metadataStreamIdInternal = dbo.Streams.IdInternal - FROM dbo.Streams - WHERE dbo.Streams.Id = @metadataStreamId; - - SELECT TOP(1) - dbo.Messages.JsonData - FROM dbo.Messages - WHERE dbo.Messages.StreamIdInternal = @metadataStreamIdInternal - ORDER BY dbo.Messages.Position DESC; + +SELECT dbo.Messages.JsonData +FROM dbo.Messages +WHERE dbo.Messages.Position = ( + SELECT dbo.Streams.Position + FROM dbo.Streams + WHERE dbo.Streams.Id = '$$' + @streamId +) \ No newline at end of file From d7399b71f6d9a3a68275f57a72cc2b939349a64c Mon Sep 17 00:00:00 2001 From: Yves Reynhout Date: Thu, 12 Apr 2018 18:47:25 +0200 Subject: [PATCH 3/4] Fixed an oversight while copy / pasting: when no stream the latest stream version logic can be simplified. --- .../MsSqlScripts/AppendStreamExpectedVersionNoStream.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql index 071891cc0..0f4dc4f1a 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql @@ -21,7 +21,7 @@ BEGIN TRANSACTION CreateStream; SET @latestStreamPosition = ISNULL(SCOPE_IDENTITY(), -1) - SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 + SELECT @latestStreamVersion = MAX(StreamVersion) FROM @newMessages SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) From 048efb24240fbe13b45bb26abd36583632cbd68e Mon Sep 17 00:00:00 2001 From: Yves Reynhout Date: Sat, 28 Apr 2018 14:31:29 +0200 Subject: [PATCH 4/4] Injected the fact there are messages or not as a parameter and made the rest of the logic conditional based on that fact (applies to ExpectedVersion.Any/NoStream only). --- .../AppendStreamExpectedVersionAny.sql | 43 +++++++++++-------- .../AppendStreamExpectedVersionNoStream.sql | 40 +++++++++-------- .../MsSqlStreamStore.AppendStream.cs | 4 ++ 3 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql index 83bbb68b8..9972cc31f 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql @@ -17,27 +17,34 @@ BEGIN TRANSACTION AppendStream; DECLARE @latestStreamVersion AS INT; DECLARE @latestStreamPosition AS BIGINT; - SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version] + SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version], @latestStreamPosition = dbo.Streams.[Position] FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) WHERE dbo.Streams.Id = @streamId; - INSERT INTO dbo.Messages - (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) - SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata - FROM @newMessages - ORDER BY StreamVersion - - SET @latestStreamPosition = ISNULL(SCOPE_IDENTITY(), -1) - - SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 - FROM @newMessages - - SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) - - UPDATE dbo.Streams - SET dbo.Streams.[Version] = @latestStreamVersion, - dbo.Streams.[Position] = @latestStreamPosition - WHERE dbo.Streams.IdInternal = @streamIdInternal + IF @hasMessages = 1 + BEGIN + INSERT INTO dbo.Messages + (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) + SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata + FROM @newMessages + ORDER BY StreamVersion + + SET @latestStreamPosition = SCOPE_IDENTITY() + + SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 + FROM @newMessages + SET @latestStreamVersion = @latestStreamVersion + + UPDATE dbo.Streams + SET dbo.Streams.[Version] = @latestStreamVersion, + dbo.Streams.[Position] = @latestStreamPosition + WHERE dbo.Streams.IdInternal = @streamIdInternal + END + ELSE + BEGIN + SET @latestStreamPosition = ISNULL(@latestStreamPosition, -1) + SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) + END COMMIT TRANSACTION AppendStream; diff --git a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql index 0f4dc4f1a..577e2aa86 100644 --- a/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql +++ b/src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql @@ -13,23 +13,29 @@ BEGIN TRANSACTION CreateStream; SET @streamIdInternal = SCOPE_IDENTITY(); - INSERT INTO dbo.Messages - (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) - SELECT @streamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata - FROM @newMessages - ORDER BY StreamVersion; - - SET @latestStreamPosition = ISNULL(SCOPE_IDENTITY(), -1) - - SELECT @latestStreamVersion = MAX(StreamVersion) - FROM @newMessages - - SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) - - UPDATE dbo.Streams - SET dbo.Streams.[Version] = @latestStreamVersion, - dbo.Streams.[Position] = @latestStreamPosition - WHERE dbo.Streams.IdInternal = @streamIdInternal + IF @hasMessages = 1 + BEGIN + INSERT INTO dbo.Messages + (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) + SELECT @streamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata + FROM @newMessages + ORDER BY StreamVersion; + + SET @latestStreamPosition = SCOPE_IDENTITY() + + SELECT @latestStreamVersion = MAX(StreamVersion) + FROM @newMessages + + UPDATE dbo.Streams + SET dbo.Streams.[Version] = @latestStreamVersion, + dbo.Streams.[Position] = @latestStreamPosition + WHERE dbo.Streams.IdInternal = @streamIdInternal + END + ELSE + BEGIN + SET @latestStreamPosition = -1 + SET @latestStreamVersion = -1 + END END; diff --git a/src/SqlStreamStore.MsSql/MsSqlStreamStore.AppendStream.cs b/src/SqlStreamStore.MsSql/MsSqlStreamStore.AppendStream.cs index d389d00cd..0c47dd7cb 100644 --- a/src/SqlStreamStore.MsSql/MsSqlStreamStore.AppendStream.cs +++ b/src/SqlStreamStore.MsSql/MsSqlStreamStore.AppendStream.cs @@ -139,12 +139,14 @@ private async Task AppendToStreamExpectedVersionAny( var sqlDataRecords = CreateSqlDataRecords(messages); var eventsParam = CreateNewMessagesSqlParameter(sqlDataRecords); command.Parameters.Add(eventsParam); + command.Parameters.AddWithValue("hasMessages", true); } else { // Must use a null value for the table-valued param if there are no records var eventsParam = CreateNewMessagesSqlParameter(null); command.Parameters.Add(eventsParam); + command.Parameters.AddWithValue("hasMessages", false); } try @@ -241,12 +243,14 @@ private async Task AppendToStreamExpectedVersionNoStream( var sqlDataRecords = CreateSqlDataRecords(messages); var eventsParam = CreateNewMessagesSqlParameter(sqlDataRecords); command.Parameters.Add(eventsParam); + command.Parameters.AddWithValue("hasMessages", true); } else { // Must use a null value for the table-valued param if there are no records var eventsParam = CreateNewMessagesSqlParameter(null); command.Parameters.Add(eventsParam); + command.Parameters.AddWithValue("hasMessages", false); } try