Tips & Tricks 02: Deadlock na SPItemEventReceiver
Wyobraźcie sobie sytuacje, gdy za każdym razem gdy zostanie dodany nowy element do listy lub jego pole Assigned To zmieni się, musicie zmienić uprawnienia do elementu na podstawie własnie tego pola.
Bardzo prosty przykład w jaki sposób można spowodować deadlock. Kiedy użytkownik doda element wywoła on u was triger na ItemAdded, który w swym kodzie zaktualizuje uprawnienia na elemencie. Aktualizacja ta wymaga wywołania IteamUpdated. Gdzie z nów będziecie próbować zmienić uprawnienie.
Typowy błąd występujący w tej okoliczności to:
Save Conflict Your changes conflict with those made concurrently by another user. If you want your changes to be applied, click Back in your Web browser, refresh the page, and resubmit your changes.
Jednak można go się pozbyć :)
Wystarczy, że w metodzie ItemAdded i ItemUpdated wywołacie następujący kod na początku metody (lub w momencie kiedy wykonujecie aktualizację elementu):
this.DisableEventFiring();
Oraz na końcu metody (lub po skończeniu aktualizacji elementu):
this.EnableEventFiring();
Ta mała zmiana zablokuje wywoływanie eventów w danym obszarze kodu. Także zablokuje wywołanie eventów na innych listach. To znaczy, że jeżeli wywołacie DisableEventFiring a następnie zaktualizujecie element na innej liście do której jest podpięty SPItemEventReceiver to ten event receiver też nie zostanie wywołany.
Ma to swoje zalety jak i wady. Sami zdecydujcie. Mi osobiście DisableEventFiring i równoważna metoda EnableEvnetFiring bardzo pomagają, a przy rozsądnym ich wykorzystaniu nie przeszkadzają :)