diff --git a/modules/cabana/backend_users_admin.go b/modules/cabana/backend_users_admin.go index 9b31014f..e3181c74 100644 --- a/modules/cabana/backend_users_admin.go +++ b/modules/cabana/backend_users_admin.go @@ -296,13 +296,16 @@ func (c usersAdmin) lifecycles() []usersLifecycle { } } -// actionDB is the action's write transaction as a fresh, unscoped session. +// actionDB is the action's write transaction as a fresh, unscoped session +// that every query starts from anew. The final Session matters: Unscoped +// returns an instance whose conditions accumulate, so a bulk action's +// second "id = ?" update would otherwise match no row. func actionDB(ctx context.Context) (*gorm.DB, error) { tx, ok := TxFromContext(ctx) if !ok { return nil, errors.New("cabana: administrators: an action needs its transaction") } - return tx.Session(&gorm.Session{NewDB: true}).WithContext(ctx).Unscoped(), nil + return tx.Session(&gorm.Session{NewDB: true}).WithContext(ctx).Unscoped().Session(&gorm.Session{}), nil } // AdminRecordActions are Activate, Deactivate and Restore on the preview