diff --git a/CHANGELOG b/CHANGELOG
index a1161a7a5270e7b949f225399ce5dc0a74e8c21a..2c8df909441c5f631f4da65322d685f9e67d96af 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ v 8.2.0 (unreleased)
   - Highlight comment based on anchor in URL
 
 v 8.1.0 (unreleased)
+  - Fix nonatomic database update potentially causing project star counts to go negative (Stan Hu)
   - Fix error preventing displaying of commit data for a directory with a leading dot (Stan Hu)
   - Speed up load times of issue detail pages by roughly 1.5x
   - Add a system note and update relevant merge requests when a branch is deleted or re-added (Stan Hu)
diff --git a/app/models/user.rb b/app/models/user.rb
index 17ccb3b87882b318b786b7c118beb5e3904f1c9a..3b346c55edbf39d27752ee94088f341b8cd4a3fe 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -706,12 +706,15 @@ class User < ActiveRecord::Base
   end
 
   def toggle_star(project)
-    user_star_project = users_star_projects.
-      where(project: project, user: self).take
-    if user_star_project
-      user_star_project.destroy
-    else
-      UsersStarProject.create!(project: project, user: self)
+    UsersStarProject.transaction do
+      user_star_project = users_star_projects.
+          where(project: project, user: self).lock(true).first
+
+      if user_star_project
+        user_star_project.destroy
+      else
+        UsersStarProject.create!(project: project, user: self)
+      end
     end
   end