Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 2 BAZY NARAZ
Forum PHP.pl > Forum > PHP
kw95s
Witam, czy jest możliwość wstawiania rekordów do 2 BAZ DANYCH równocześnie na różnych serwerach?
aras785
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
wNogachSpisz
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.
kw95s
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
LSM
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
sowiq
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.
Helid
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.
kw95s
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.
aras785
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
pyro
@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.
aras785
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
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.