Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> 2 BAZY NARAZ
kw95s
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 3
Dołączył: 10.07.2011

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


Witam, czy jest możliwość wstawiania rekordów do 2 BAZ DANYCH równocześnie na różnych serwerach?
Go to the top of the page
+Quote Post
aras785
post
Post #2





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


Tak ale pod warunkiem, że możesz łaczyć zdalne ew. zrobić to inaczej biggrin.gif

1.

  1. <?php
  2. $baza1 = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
  3. $baza2 = new PDO('mysql:host=domena.pl;dbname=test2', 'root2', 'root');
  4.  
  5. $zapytanie = "INSERT INTO tabela VALUES('1','imie')";
  6. $baza1->exec($zapytanie);
  7. $baza2->exec($zapytanie);


2. Jeśli nie możesz łaczyć sie zdalnie to wtedy napiszę jedno rozwiązanie

Ten post edytował aras785 25.07.2013, 21:51:37
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #3





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(aras785 @ 25.07.2013, 22:44:06 ) *
Tak ale pod warunkiem, że możesz łaczyć zdalne ew. zrobić to inaczej biggrin.gif

1.

  1. <?php
  2. $baza1 = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
  3. $baza2 = new PDO('mysql:host=domena.pl;dbname=test2', 'root2', 'root');
  4.  
  5. $zapytanie = "INSERT INTO tabela VALUES('1','imie')";
  6. $baza1->exec($zapytanie);
  7. $baza2->exec($zapytanie);


2. Jeśli nie możesz łaczyć sie zdalnie to wtedy napiszę jedno rozwiązanie

A co jeśli między jednym a drugim exec w serwer uderzy meteoryt? Jedno zapytanie się wykona a drugie nie, wystąpi tzw. utrata spójności danych. Aby zrobić to porządniej musisz poszukać informacji o replikacji i syncrhonizacji baz danych.
Go to the top of the page
+Quote Post
kw95s
post
Post #4





Grupa: Zarejestrowani
Postów: 36
Pomógł: 3
Dołączył: 10.07.2011

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


Cytat(wNogachSpisz @ 26.07.2013, 17:08:16 ) *
A co jeśli między jednym a drugim exec w serwer uderzy meteoryt? Jedno zapytanie się wykona a drugie nie, wystąpi tzw. utrata spójności danych. Aby zrobić to porządniej musisz poszukać informacji o replikacji i syncrhonizacji baz danych.

Może dodasz coś wiecej
Go to the top of the page
+Quote Post
LSM
post
Post #5





Grupa: Zarejestrowani
Postów: 64
Pomógł: 6
Dołączył: 20.03.2011
Skąd: Świdnica

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


Pytanie czy zależy mu bardzo na synchronizacji. Włączenie trybu zwykłych transakcji na obu połączeniach dałoby radę, nie?

A obok zwykłych transakcji doszukałem coś takiego:
http://dev.mysql.com/doc/refman/5.5/en/xa.html
http://mysqlha.blogspot.com/2008/07/do-you...with-mysql.html


--------------------
"I see" - said the blind man.
Go to the top of the page
+Quote Post
sowiq
post
Post #6





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Cytat(LSM @ 29.07.2013, 10:41:21 ) *
Włączenie trybu zwykłych transakcji na obu połączeniach dałoby radę, nie?

Nie. Commity do baz danych również będziesz wysyłał sekwencyjnie (jeden po drugim). Więc teoretycznie może zajść sytuacja, że serwer padnie po wysłaniu commita do pierwszej bazy, ale przed wysłaniem do kolejnej.

Ten post edytował sowiq 29.07.2013, 10:16:34
Go to the top of the page
+Quote Post
Helid
post
Post #7





Grupa: Zarejestrowani
Postów: 280
Pomógł: 20
Dołączył: 12.12.2007
Skąd: 127.0.0.1

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


Cytat(kw95s @ 28.07.2013, 18:18:30 ) *
Może dodasz coś wiecej

Miał na myśli że uderzenie metorytu to np. wystąpienie błędu PHP pomiędzy jednym a drugim zapytaniem albo awaria serwera. Wówczas jedno się wykona a drugie nie.


--------------------
Go to the top of the page
+Quote Post
kw95s
post
Post #8





Grupa: Zarejestrowani
Postów: 36
Pomógł: 3
Dołączył: 10.07.2011

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


Cytat(Helid @ 1.08.2013, 18:40:00 ) *
Miał na myśli że uderzenie metorytu to np. wystąpienie błędu PHP pomiędzy jednym a drugim zapytaniem albo awaria serwera. Wówczas jedno się wykona a drugie nie.

chodziło mi raczej aby powiedział jakie są sposoby na uniknięcie tego, synchronizacja itp.
Go to the top of the page
+Quote Post
aras785
post
Post #9





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


Może tak:

  1. <?php
  2. $baza1 = new PDO('mysql:host=localhost;dbname=test', 'root', 'vertrigo');
  3. $baza2 = new PDO('mysql:host=domena.pl;dbname=test2', 'root', 'vertrigo');
  4.  
  5. $zapytanie = "INSERT INTO tabela VALUES('','imie')";
  6.  
  7. if($baza1->exec($zapytanie)) {
  8. if($baza2->exec($zapytanie)) {
  9. echo 'Udało się!';
  10. }else {
  11. $lastId = $baza1->lastInsertId();
  12. $del = $baza1->prepare('DELETE FROM tabela WHERE id=:id');
  13. $del->bindParam(':id',$lastId,PDO::PARAM_INT);
  14. $del->execute();
  15. echo('Błąd');
  16. }
  17. }else echo('Błąd');
  18.  



Lub zamiast lastID można użyć jakiegoś klucza np:

  1. <?php
  2. $baza1 = new PDO('mysql:host=localhost;dbname=test', 'root', 'test');
  3. $baza2 = new PDO('mysql:host=domena.pl;dbname=test2', 'root', 'tesso');
  4.  
  5. $key_query = time().rand(1,10000);
  6. $zapytanie = "INSERT INTO tabela VALUES('','imie','"..$key_query"')"; //można stworzyć 2 zapytanie, prepare itd.
  7. if($baza1->exec($zapytanie)) {
  8. if($baza2->exec($zapytanie)) {
  9. echo 'Udało się!';
  10. }else {
  11. $del = $baza1->prepare('DELETE FROM tabela WHERE key_query=:key_query');
  12. $del->bindParam(':key_query',$key_query);
  13. $del->execute();
  14. echo('Błąd');
  15. }
  16. }else echo('Błąd');


Nie sprawdzałem w/w skryptów smile.gif

Ten post edytował aras785 1.08.2013, 20:41:09
Go to the top of the page
+Quote Post
pyro
post
Post #10





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


@aras785, a co to ma zmienić? Przecież i tak zapytania są wykonywane jedno po drugim:

  1. if($baza1->exec($zapytanie)) {
  2. // tu pada serwer
  3. if($baza2->exec($zapytanie)) { // nie wykona się

Jeżeli to ma być jakaś kopia to wystarczy ustawić replikację. Tobie chyba chodzi o replikację. Master wtedy automatycznie jest replikowany do niewolnika. Wystarczy wtedy zapytanie do jednej bazy.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
aras785
post
Post #11





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


No jeśli padnie serwer i drugie zapytanie się nie wykona to wtedy usuwa rekord z pierwszej bazy.

//padnie serwer wykonujący skrypt. Już kumam:D No to moje rozwiązanie do kosza biggrin.gif

Ten post edytował aras785 1.08.2013, 20:55:47
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 15:06