Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] Doctrine. Transakcje w zapisie danych
blackroger
post
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


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.  


Go to the top of the page
+Quote Post
destroyerr
post
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
blackroger
post
Post #3





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


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ę....

Go to the top of the page
+Quote Post
Zigi
post
Post #4





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
blackroger
post
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
destroyerr
post
Post #6





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 13:10