diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index 6a1607086..61229916c 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -2877,14 +2877,6 @@ void ZoneDatabase::UpdateAltCurrencyValue(uint32 char_id, uint32 currency_id, ui void ZoneDatabase::SaveBuffs(Client *client) { - CharacterBuffsRepository::DeleteWhere( - database, - fmt::format( - "`character_id` = {}", - client->CharacterID() - ) - ); - auto buffs = client->GetBuffs(); const int max_buff_slots = client->GetMaxBuffSlots(); @@ -2933,9 +2925,20 @@ void ZoneDatabase::SaveBuffs(Client *client) v.emplace_back(e); } + database.TransactionBegin(); + + CharacterBuffsRepository::DeleteWhere( + database, + fmt::format( + "`character_id` = {}", + client->CharacterID() + ) + ); + if (!v.empty()) { const auto saved_count = CharacterBuffsRepository::ReplaceMany(database, v); if (saved_count < static_cast(v.size())) { + database.TransactionRollback(); LogError( "Failed to save all buffs for character [{}] [{}]. Expected at least [{}] rows saved, got [{}]. Verify the `character_buffs` schema is up to date.", client->GetCleanName(), @@ -2943,8 +2946,20 @@ void ZoneDatabase::SaveBuffs(Client *client) v.size(), saved_count ); + return; } } + + const auto commit_result = database.TransactionCommit(); + if (!commit_result.Success()) { + database.TransactionRollback(); + LogError( + "Failed to commit buff save transaction for character [{}] [{}]: {}", + client->GetCleanName(), + client->CharacterID(), + commit_result.ErrorMessage() + ); + } } void ZoneDatabase::LoadBuffs(Client *client)