Dlaczego wpisywanie zapytań pojedynczo daje poprawne wyniki, a hurtem — błędne?

0

MySQL.

W kodzie zakładającym bazę mam między innymi:

CREATE TABLE elostart
(
  wartość INT PRIMARY KEY
)//

INSERT INTO elostart (wartość) VALUES (1500)//

CREATE TABLE userzy
(
  nick VARCHAR(30) PRIMARY KEY,
  hasło VARCHAR(30),
  elo INT
)//

CREATE FUNCTION rejestrujUsera (nickArg VARCHAR(30), hasłoArg VARCHAR(30))
RETURNS BOOLEAN NOT DETERMINISTIC
BEGIN
  DECLARE istnieje INT;
  DECLARE wynik BOOLEAN;
  SELECT COUNT(nick) INTO istnieje FROM userzy WHERE nick = nickArg;
  IF istnieje <> 0
  THEN
    SET wynik = FALSE;
  ELSE
    INSERT INTO userzy (nick, hasło, elo)
    SELECT nickArg, hasłoArg, elostart.wartość FROM elostart;
    SET wynik = TRUE;
  END IF;
  RETURN wynik;
END//

Testuję w phpmyadmin.

Jak pojedynczo wpisuję:

SELECT rejestrujUsera('user1', 'hasło1');
SELECT rejestrujUsera('user2', 'hasło2');
 # … itd 

To otrzymuję poprawne wyniki: 1 jeśli dany nick nie był jeszcze zarejestrowany (i w bazie pojawiają się wtedy dane nowego usera), '0' jeśli już był zarejestrowany.

A teraz próbuję, dla wygody, zarejestrować od razu 50 userów. Co prawda, w tabeli userzy wpisy pojawiają się poprawne, ale funkcja zwraca błędne wyniki… Niepoprawnie funkcja mi zwraca 0 dla każdego usera oprócz pięćdziesiątego!

Te błędne wyniki pojawiają się po wpisaniu w phpmyadmin następującego zestawu komend na raz:

SELECT rejestrujUsera('user1', 'hasło1');
SELECT rejestrujUsera('user2', 'hasło2');
SELECT rejestrujUsera('user3', 'hasło3');
SELECT rejestrujUsera('user4', 'hasło4');
SELECT rejestrujUsera('user5', 'hasło5');
SELECT rejestrujUsera('user6', 'hasło6');
SELECT rejestrujUsera('user7', 'hasło7');
SELECT rejestrujUsera('user8', 'hasło8');
SELECT rejestrujUsera('user9', 'hasło9');
SELECT rejestrujUsera('user10', 'hasło10');
SELECT rejestrujUsera('user11', 'hasło11');
SELECT rejestrujUsera('user12', 'hasło12');
SELECT rejestrujUsera('user13', 'hasło13');
SELECT rejestrujUsera('user14', 'hasło14');
SELECT rejestrujUsera('user15', 'hasło15');
SELECT rejestrujUsera('user16', 'hasło16');
SELECT rejestrujUsera('user17', 'hasło17');
SELECT rejestrujUsera('user18', 'hasło18');
SELECT rejestrujUsera('user19', 'hasło19');
SELECT rejestrujUsera('user20', 'hasło20');
SELECT rejestrujUsera('user21', 'hasło21');
SELECT rejestrujUsera('user22', 'hasło22');
SELECT rejestrujUsera('user23', 'hasło23');
SELECT rejestrujUsera('user24', 'hasło24');
SELECT rejestrujUsera('user25', 'hasło25');
SELECT rejestrujUsera('user26', 'hasło26');
SELECT rejestrujUsera('user27', 'hasło27');
SELECT rejestrujUsera('user28', 'hasło28');
SELECT rejestrujUsera('user29', 'hasło29');
SELECT rejestrujUsera('user30', 'hasło30');
SELECT rejestrujUsera('user31', 'hasło31');
SELECT rejestrujUsera('user32', 'hasło32');
SELECT rejestrujUsera('user33', 'hasło33');
SELECT rejestrujUsera('user34', 'hasło34');
SELECT rejestrujUsera('user35', 'hasło35');
SELECT rejestrujUsera('user36', 'hasło36');
SELECT rejestrujUsera('user37', 'hasło37');
SELECT rejestrujUsera('user38', 'hasło38');
SELECT rejestrujUsera('user39', 'hasło39');
SELECT rejestrujUsera('user40', 'hasło40');
SELECT rejestrujUsera('user41', 'hasło41');
SELECT rejestrujUsera('user42', 'hasło42');
SELECT rejestrujUsera('user43', 'hasło43');
SELECT rejestrujUsera('user44', 'hasło44');
SELECT rejestrujUsera('user45', 'hasło45');
SELECT rejestrujUsera('user46', 'hasło46');
SELECT rejestrujUsera('user47', 'hasło47');
SELECT rejestrujUsera('user48', 'hasło48');
SELECT rejestrujUsera('user49', 'hasło49');
SELECT rejestrujUsera('user50', 'hasło50');

Skąd takie rezultaty??

0

a czasem nie zachodzi tutaj race condition? (nie wiem, pytam, bo to by w sumie jednynie mialo sens)

0

Ale w jaki sposób, skoro wynik jest zmienną lokalną?

1 użytkowników online, w tym zalogowanych: 0, gości: 1