Sekwencje w MySql

181 views
Skip to first unread message

Arkadiusz Burdach

unread,
May 17, 2012, 10:09:25 AM5/17/12
to warsza...@googlegroups.com
Chciałbym zasymulować Oracle'owe sekwencje w MySql. Dlatego utworzyłem funkcję jak poniżej i podpiąłem ją do tabelki.

Funkcja:

DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER DETERMINISTIC
MODIFIES SQL DATA
BEGIN
   UPDATE sequence
   SET          current_value = current_value + increment
   WHERE name = seq_name;
   RETURN currval(seq_name);
END$
DELIMITER ;

Tabelka:

CREATE TABLE sequence (
name              VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment       INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;

Teraz jak otwieram sobie dwie konsole, w obu startuje transakcje, a następnie w obu wywołuje select nextval('tmp'); to druga transakcja czeka na pierwszą. Chciałbym, żeby nie było tej blokady - może to działać tak, że po rollback'u wartość i tak będzie zmieniona, nie dozwolone natomiast jest, żeby ktoś dostał dwa takie same wyniki za pomocą nextval(). Nie możemy użyć autoinkrementacji z powodu http://bugs.mysql.com/bug.php?id=727

Wiem, że to grupa Jav'owa a nie MySql'owa, ale może ktoś już rozwiązywał podobny problem?


Adam Pierzchała

unread,
May 17, 2012, 10:26:08 AM5/17/12
to warsza...@googlegroups.com
Hej,
MySQL od jakiegoś czasu już nie jest rozwijany. Na Twoim miejscu spróbowałbym z MariaDB[1] - jest niemal 100% kompatybilna z MySQL o takim samym numerku, a ma wiele bugów MySQL-owych naprawionych + kilka nowych ficzerów (nie sprawdzałem czy akurat ten bug jest naprawiony)

[1] http://mariadb.org/

--
Pozdrawiam
Adam Pierzchała



2012/5/17 Arkadiusz Burdach <arek.b...@gmail.com>

--
Wiadomość z grupy Warszawa Java User Group (Warszawa JUG).
Więcej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zachęcamy do odwiedzenia naszej strony domowej http://warszawa.jug.pl
Oferty pracy dozwolone zgodnie z zasadami na http://sites.google.com/site/warszawajug/oferty-pracy-na-grupie

Arkadiusz Burdach

unread,
May 17, 2012, 10:27:53 AM5/17/12
to warsza...@googlegroups.com
Niestety serwer mamy narzucony przez klienta.

Arek

W dniu 17.05.2012 16:26, Adam Pierzcha�a pisze:
Hej,
MySQL od jakiego� czasu ju� nie jest rozwijany. Na Twoim miejscu spr�bowa�bym z MariaDB[1] - jest niemal 100% kompatybilna z MySQL o takim samym numerku, a ma wiele bug�w MySQL-owych naprawionych + kilka nowych ficzer�w (nie sprawdza�em czy akurat ten bug jest naprawiony)

[1]�http://mariadb.org/

--
Pozdrawiam
Adam Pierzcha�a



2012/5/17 Arkadiusz Burdach <arek.b...@gmail.com>
Chcia�bym zasymulowa� Oracle'owe sekwencje w MySql. Dlatego utworzy�em funkcj� jak poni�ej i podpi��em j� do tabelki.


Funkcja:

DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER DETERMINISTIC
MODIFIES SQL DATA
BEGIN
�� UPDATE sequence
�� SET��������� current_value = current_value + increment
�� WHERE name = seq_name;
�� RETURN currval(seq_name);

END$
DELIMITER ;

Tabelka:

CREATE TABLE sequence (
name������������� VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment������ INT NOT NULL DEFAULT 1,

PRIMARY KEY (name)
) ENGINE=InnoDB;

Teraz jak otwieram sobie dwie konsole, w obu startuje transakcje, a nast�pnie w obu wywo�uje select nextval('tmp'); to druga transakcja czeka na pierwsz�. Chcia�bym, �eby nie by�o tej blokady - mo�e to dzia�a� tak, �e po rollback'u warto�� i tak b�dzie zmieniona, nie dozwolone natomiast jest, �eby kto� dosta� dwa takie same wyniki za pomoc� nextval(). Nie mo�emy u�y� autoinkrementacji z powodu http://bugs.mysql.com/bug.php?id=727

Wiem, �e to grupa Jav'owa a nie MySql'owa, ale mo�e kto� ju� rozwi�zywa� podobny problem?


--
Wiadomo�� z grupy Warszawa Java User Group (Warszawa JUG).
Wi�cej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zach�camy do odwiedzenia naszej strony domowej http://warszawa.jug.pl

Oferty pracy dozwolone zgodnie z zasadami na http://sites.google.com/site/warszawajug/oferty-pracy-na-grupie

--
Wiadomo�� z grupy Warszawa Java User Group (Warszawa JUG).
Wi�cej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zach�camy do odwiedzenia naszej strony domowej http://warszawa.jug.pl

Adam Lider

unread,
May 17, 2012, 3:08:24 PM5/17/12
to warsza...@googlegroups.com
Zastrzegam, ze sugeruje bez sprawdzenia.

Update w drugiej transakcji czeka na comit calej pierwszej transakcji poniewaz tak dziala silnik InnoDB zastosowany dla tej tabeli (lockowane sa wszystkie dotykane wiersze do czasu commitu transakcji). Zastosowanie silnika MyISAM dla tej tabeli spowoduje ze modyfikacja jej wierszy odbedzie sie bez uwzglednienia transakcji. Trzeba tylko sprawdzic jak domyslny lock calej tabeli bedzie dzialal w tym przypadku i ewentualnie pomyslec o jakims mutexie w postaci get_lock('my_lock') w funkcji modyfikujacej.

Ewentualnie UUID_SHORT, ale tutaj raczej nie osiagniemy docelowego efektu.

Adam. 

--
Wiadomość z grupy Warszawa Java User Group (Warszawa JUG).
Więcej informacji na stronie http://groups.google.com/group/warszawa-jug?hl=pl
Zachęcamy do odwiedzenia naszej strony domowej http://warszawa.jug.pl
Reply all
Reply to author
Forward
0 new messages