2009-03-30 9 views
8

Mam formularz, który obejmuje wiele stron. Sposób, w jaki jest teraz skonfigurowany, nie jest idealny, ponieważ zapisuje (do bazy danych) każdą stronę, gdy jest przesyłana. Jeśli więc użytkownik nie wypełni formularza na wszystkich stronach, w bazie danych zostanie zapisana niekompletna rejestracja użytkownika.Czy jest możliwe, aby transakcje bazy danych obejmowały wiele żądań w szynach?

Chciałbym "wycofać" zapisy, jeśli użytkownik nie wypełni formularza w całości.

Czy istnieje sposób na skonfigurowanie transakcji, która rozpocznie się, gdy użytkownik wypełni pierwszy formularz i zakończy, gdy użytkownik zakończy pracę na ostatniej stronie?

Odpowiedz

1

Nie znam odpowiedzi na swoje pytanie, ale tak czy inaczej oryginalnym ...

Zamiast oszczędności na każdej stronie, dlaczego nie zapisać wszystkie dane w zmiennej sesji? Na koniec możesz mieć jedną stronę, która zapisuje dane w sesji do bazy danych? W ten sposób nigdy nie zapisałeś niczego w DB.

1

Sądzę, że oszczędzanie każdej strony jest wartością, ponieważ jeśli jest to proces długotrwały, a użytkownik jest przerywany w środku, może chcieć zapisać swoje pośrednie, niezatwierdzone wyniki i odnieść do miejsca, w którym przerwała później.

Jeśli uważasz, że to również dobry pomysł, twój projekt będzie przechowywać flagę, aby wskazać, czy dany element był częścią długotrwałej transakcji, która jeszcze nie została ukończona. Ustaw flagę po zakończeniu ostatniego elementu i wciśnięciu przycisku zapisu. Podaj wartość limitu czasu, która wskazywałaby, że pośrednie elementy otrzymały zatwierdzenie "ostatecznego zapisu" po pewnym czasie, w którym zostaną usunięte.

1

Otwarcie transakcji bazy danych, która obejmowałaby wiele żądań, jest złym pomysłem. Rozważ sytuację, w której użytkownik zamyka przeglądarkę, zanim transakcja zostanie zatwierdzona. Pozostaje ci osierocona transakcja, która nie jest wycofana ani nie została zatwierdzona.

Po prostu umieść flagę w bazie danych podobnie jak REG_COMPLETE, która jest ustawiana tylko na ostatniej stronie procesu rejestracji. Następnie możesz filtrować/szorować/cokolwiek chcesz z tym niekompletnym rekordem ... może wysłać im e-mail z prośbą o zakończenie?

2

Aby odpowiedzieć na konkretne pytanie, nie sądzę, że istnieje sposób, aby skonfigurować transakcję w sensie bazy danych, która zrobi to, co chcesz. Pomyśl o tym, a zobaczysz, dlaczego: nie ma gwarancji, że różne części twojej wielostronicowej operacji będą obsługiwane przez ten sam proces. Lub całkiem prawdopodobny nawet ten sam serwer. Jeśli żądanie obejmuje połączenia z bazą danych, tak jak w tej sytuacji, niezatwierdzone części z jednego połączenia będą niewidoczne dla innych połączeń.

Oprócz wspomnianych pomysłów rozważałbym użycie jednej lub więcej tabel "staging" do przechowywania niekompletnych danych już wprowadzonych. Następnie, gdy użytkownik jest gotowy, pojedyncza transakcja może zastosować dane do stałych tabel i usunąć dane pomostowe. Niekompletne dane mogą zostać usunięte na podstawie kryterium wieku przez proces w tle po upewnieniu się, że sesja została zakończona lub przetrzymywana do momentu powrotu użytkownika, jeśli to lepiej spełni Twoje wymagania.

Byłbym skłonny do takiego podejścia, szczególnie gdybym spodziewał się regularnych niekompletnych transakcji, ponieważ w ten sposób nie muszę zajmować się niepełnymi danymi w moich głównych modelach.