Index: ChapterX.Application/Abstractions/IApplicationDbContext.cs
===================================================================
--- ChapterX.Application/Abstractions/IApplicationDbContext.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ ChapterX.Application/Abstractions/IApplicationDbContext.cs	(revision d300631ac3354730c3b03cb7b160974af50e7894)
@@ -1,3 +1,4 @@
 using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Storage;
 using UserEntity = ChapterX.Domain.Entities.User;
 using StoryEntity = ChapterX.Domain.Entities.Story;
@@ -40,4 +41,5 @@
         DbSet<NeedApprovalEntity> NeedApprovals { get; }
         Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
+        Task<IDbContextTransaction> BeginTransactionAsync(CancellationToken cancellationToken = default);
     }
 }
Index: ChapterX.Application/Auth/RegisterHandler.cs
===================================================================
--- ChapterX.Application/Auth/RegisterHandler.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ ChapterX.Application/Auth/RegisterHandler.cs	(revision d300631ac3354730c3b03cb7b160974af50e7894)
@@ -1,2 +1,3 @@
+using ChapterX.Application.Abstractions;
 using ChapterX.Domain.Repositories;
 using MediatR;
@@ -8,9 +9,11 @@
         private readonly IUserRepository _userRepository;
         private readonly IWriterRepository _writerRepository;
+        private readonly IApplicationDbContext _context;
 
-        public RegisterHandler(IUserRepository userRepository, IWriterRepository writerRepository)
+        public RegisterHandler(IUserRepository userRepository, IWriterRepository writerRepository, IApplicationDbContext context)
         {
             _userRepository = userRepository;
             _writerRepository = writerRepository;
+            _context = context;
         }
 
@@ -21,21 +24,31 @@
                 throw new InvalidOperationException("Email already in use.");
 
-            var user = new Domain.Entities.User
+            await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
+            try
             {
-                Username = request.Username,
-                Email = request.Email,
-                Name = request.Name,
-                Surname = request.Surname,
-                Password = BCrypt.Net.BCrypt.HashPassword(request.Password),
-                CreatedAt = DateTime.UtcNow,
-                UpdatedAt = DateTime.UtcNow
-            };
+                var user = new Domain.Entities.User
+                {
+                    Username = request.Username,
+                    Email = request.Email,
+                    Name = request.Name,
+                    Surname = request.Surname,
+                    Password = BCrypt.Net.BCrypt.HashPassword(request.Password),
+                    CreatedAt = DateTime.UtcNow,
+                    UpdatedAt = DateTime.UtcNow
+                };
 
-            await _userRepository.AddAsync(user, cancellationToken);
+                await _userRepository.AddAsync(user, cancellationToken);
 
-            var writer = new Domain.Entities.Writer { Id = user.Id };
-            await _writerRepository.AddAsync(writer, cancellationToken);
+                var writer = new Domain.Entities.Writer { Id = user.Id };
+                await _writerRepository.AddAsync(writer, cancellationToken);
 
-            return new RegisterResponse(user.Id, user.Username, user.Email);
+                await transaction.CommitAsync(cancellationToken);
+                return new RegisterResponse(user.Id, user.Username, user.Email);
+            }
+            catch
+            {
+                await transaction.RollbackAsync(cancellationToken);
+                throw;
+            }
         }
     }
Index: ChapterX.Application/Story/Commands/AddHandler.cs
===================================================================
--- ChapterX.Application/Story/Commands/AddHandler.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ ChapterX.Application/Story/Commands/AddHandler.cs	(revision d300631ac3354730c3b03cb7b160974af50e7894)
@@ -1,2 +1,3 @@
+using ChapterX.Application.Abstractions;
 using ChapterX.Domain.Repositories;
 using MediatR;
@@ -10,11 +11,13 @@
         private readonly IGenreRepository _genreRepository;
         private readonly IHasGenreRepository _hasGenreRepository;
+        private readonly IApplicationDbContext _context;
         private readonly ILogger<AddHandler> _logger;
 
-        public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, ILogger<AddHandler> logger)
+        public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, IApplicationDbContext context, ILogger<AddHandler> logger)
         {
             _storyRepository = storyRepository;
             _genreRepository = genreRepository;
             _hasGenreRepository = hasGenreRepository;
+            _context = context;
             _logger = logger;
         }
@@ -22,25 +25,35 @@
         public async Task<AddResponse> Handle(AddRequest request, CancellationToken cancellationToken)
         {
-            var story = new Domain.Entities.Story
+            await using var transaction = await _context.BeginTransactionAsync(cancellationToken);
+            try
             {
-                MatureContent = request.MatureContent,
-                ShortDescription = request.ShortDescription,
-                Image = request.Image,
-                Content = request.Content,
-                UserId = request.UserId,
-                CreatedAt = DateTime.UtcNow,
-                UpdatedAt = DateTime.UtcNow
-            };
+                var story = new Domain.Entities.Story
+                {
+                    MatureContent = request.MatureContent,
+                    ShortDescription = request.ShortDescription,
+                    Image = request.Image,
+                    Content = request.Content,
+                    UserId = request.UserId,
+                    CreatedAt = DateTime.UtcNow,
+                    UpdatedAt = DateTime.UtcNow
+                };
 
-            await _storyRepository.AddAsync(story, cancellationToken);
+                await _storyRepository.AddAsync(story, cancellationToken);
 
-            foreach (var genreName in request.Genres ?? [])
+                foreach (var genreName in request.Genres ?? [])
+                {
+                    var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
+                    if (genre == null) continue;
+                    await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
+                }
+
+                await transaction.CommitAsync(cancellationToken);
+                return new AddResponse(story.Id);
+            }
+            catch
             {
-                var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
-                if (genre == null) continue;
-                await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
+                await transaction.RollbackAsync(cancellationToken);
+                throw;
             }
-
-            return new AddResponse(story.Id);
         }
     }
