Mam problem z dublowaniem wartości pola w rekordach. Jednak najlepiej przedstawię sprawę na przykładzie (proszę nie zwracać uwagi na składnie).
Kod
<?php
$pol = mysql_connect('localhost','*****','****');
mysql_select_db('db', $pol);
$x = 0;
while($x < 5000) {
mysql_query("START TRANSACTION",$pol);
$ksiega_rok = date('Y',time());
$r = mysql_query('SELECT max(ksiega_nr) AS ilosc FROM dane WHERE ksiega_rok = '.$ksiega_rok);
$row = mysql_fetch_row($r);
$ksiega_nr = $row[0]+1;
$r = mysql_query('INSERT INTO dane set ksiega_nr = '.$ksiega_nr.', ksiega_rok = '.$ksiega_rok);
if ($r!= 1) {
mysql_query('ROLLBACK',$pol);
}
mysql_query('COMMIT',$pol);
++$x;
}
?>
$pol = mysql_connect('localhost','*****','****');
mysql_select_db('db', $pol);
$x = 0;
while($x < 5000) {
mysql_query("START TRANSACTION",$pol);
$ksiega_rok = date('Y',time());
$r = mysql_query('SELECT max(ksiega_nr) AS ilosc FROM dane WHERE ksiega_rok = '.$ksiega_rok);
$row = mysql_fetch_row($r);
$ksiega_nr = $row[0]+1;
$r = mysql_query('INSERT INTO dane set ksiega_nr = '.$ksiega_nr.', ksiega_rok = '.$ksiega_rok);
if ($r!= 1) {
mysql_query('ROLLBACK',$pol);
}
mysql_query('COMMIT',$pol);
++$x;
}
?>
Skrypt chodzi na kilku komputerach jednocześnie. Po zakończeniu działania, wpisuje
SELECT * FROM dane GROUP BY ksiega_nr HAVING count(*) > 1
W konsekwencji pojawia się dużo krotek gdzie pole ksiega_nr ma taka sama wartość np.
id | ksiega_nr | ksiega_rok
3780 | 3780 | 2009
4182 | 4182 | 2009
5312 | 5312 | 2009
Zależy mi oczywiście, aby numery się nie pokrywały. Wiecie może jak to osiągnąć? Jakś dodatkowa konfiguracja? Może błędnie rozumiem idee transakcji?
Aaa wersja serwera: 5.1.32-community
z góry dzięki:)