Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Doctrine. Transakcje w zapisie danych
Forum PHP.pl > Forum > PHP > Frameworki
blackroger
Mam problem odnośnie transakcji. Jak zrobić aby poniższy kod wykonał się w całości i jeżeli ktoś inny w czasie wykonywania kodu będzie również próbował zmienic coś w obiektach to mu to uniemożliwić ew. wyświetlić mu komunikat o zachodzących zmianach?

  1. if(!empty($uppmenu_objs))
  2. {
  3. foreach($uppmenu_objs as $record_obj)
  4. {
  5. foreach($submenu_objs as $record_obj2)
  6. {
  7. $relation_obj = Doctrine_Query::create()
  8. ->from('CmsMenuRelation cmr')
  9. ->where('cmr.f_cms_menu = ?', $record_obj->t_id)
  10. ->addWhere('cmr.f_cms_menu2 = ?', $record_obj2->t_id)
  11. ->execute();
  12.  
  13. $depth = $relation_obj[0]->t_depth;
  14. $relation_obj[0]->set('t_depth', $depth - 1);
  15. $relation_obj[0]->save();
  16. }
  17.  
  18. }
  19. }
  20.  


destroyerr
Czyli Tobie chodzi o blokowanie tabeli a nie o transakcje.

Zastanów się czy na pewno nie ma możliwości załatwienia tego zapytaniem update bez pobierania w pętli.
Co do zapytań w pętli to zauważ, że za każdym razem Twoje zapytanie musi być parsowane. Lepiej chyba będzie zapytanie tworzyć poza pętlą, a wykonywać tylko w zapytaniach.
blackroger
hmm.....pokazany kod usuwa relacje i przenosi potomstwo (relacje) danego elementu na jego ojca. O ile z dodaniem elementu jakos sobie poradzilem za pomoca jednego zapytania insert select o tyle tu jest problem bo potrzebowalbym update select a takiego czegos o ile mi wiadomo nie ma. Można by stworzyc taki obiekt zeby nie wykonywac tego dodatkowego zapytania w środku tylko działać na już stworzonych tylko nie wiem czy to nie byłoby jeszcze obszerniejsze bo musiałbym użyć kupę łączeń.

A jak sie ma sprawa z tym blokowaniem tabeli? Bo na pewno przyda mi się....

Zigi
Konstrukcja z update i select jak najbardziej jest w MySQL w każdym razie w wersji 5.1.41 np.
  1. UPDATE tabela AS k2, tabela AS k3
  2. SET k2.wartosc_max = ( SELECT max(k3.podatek) )

Warto takiego czegoś użyć, bo masz od ręki załatwioną atomowość transakcji.
blackroger
nie do konca o taki update mi chodziło. Dam przykład dla inserta:

  1. INSERT INTO `cms_menu_relation` (`f_cms_menu`, `f_cms_menu2`,`t_depth`)
  2. SELECT `f_cms_menu`, 32, `t_depth` + 1 FROM `cms_menu_relation` WHERE
  3. `f_cms_menu2` = 31;
  4.  


załatwiam tym insertem około 30 wpisów za jednym razem. Tą konstrukcję co podałeś to wiem że działa z selectem bo to jest podzapytanie. Moim problemem jest to że nie mogę za bardzo korzystać z jednego takiego zapytania nawet jakby udało się sformułować konstrukcję podobną do tej z insertem bo zależałaby ona od kupy rzeczy które zależałby od siebie nawzajem. Można rozwiązać problem, koncepcją którą po części podsunął mi destroyerr, tworząc większą sieć relacji na obiektach wyłączając wtedy środkowe zapytanie.
Innym rozwiązaniem może być użycie jakiejś procedury składowej w sql, ale chciałem tych rzeczy uniknąć.

Ale pytam dalej ...jak wygląda sprawa z tym blokowaniem tabeli w symfony?
destroyerr
W symfony nie ma tabel więc nie można ich blokować.

Blokowanie tabel to mechanizm po stronie MySQL, więc raczej pod tym kątem powinieneś szukać informacji. Dodatkowo: Propel wspiera blokowanie tabel, Doctrine nie. Doctrine natomiast ma swój mechanizm blokowania rekordów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.