[MySQL4.1] jak =?ISO-8859-2?Q?przypilnowa=E6_warto=B6ci_UNSI?==?ISO-8859-2?Q?GNED=3F?=
sendzia - 15-06-2006 00:34
[MySQL4.1] jak =?ISO-8859-2?Q?przypilnowa=E6_warto=B6ci_UNSI?==?ISO-8859-2?Q?GNED=3F?=
Witam!
W tabeli mam kolumnę typu BIGINT UNSIGNED. Aplikacja php dokonuje zmian wartości w tej kolumnie w wyniku akcji użytkownika. Przed każdym zmniejszeniem/zwiększeniem wartości aplikacja sprawdza, czy wartość nie jest za mała/duża.
Przykład: - Wartość w kolumnie = 50 - User1 sprawdza czy wartość >= 30 - User1 zmniejsza wartość o 30 - Wartość w kolumnie = 20 - User2 sprawdza czy wartość >= 25 - User2 dostaje odmowę zmniejszenia wartości o 25
Problem w tym, że istnieje ryzyko zejścia się w czasie akcji wykonanych przez 2 lub więcej userów.
Przykład: - Wartość w kolumnie = 50 - User1 sprawdza czy wartość >= 30 - User2 sprawdza czy wartość >= 25 - User1 zmniejsza wartość o 30 - Wartość w kolumnie = 20 - User2 zmniejsza wartość o 25
Co oczywiście kończy się w MySQL "przekręceniem licznika", a ja w tym momencie dostaję w zęby.
Da się przed tym zabezpieczyć na poziomie MySQL?
-- The real problem is not whether machines think but whether men do. B. F. Skinner
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 15-06-2006 00:34
sendzia wrote: > Witam! > > W tabeli mam kolumnę typu BIGINT UNSIGNED. Aplikacja php dokonuje zmian > wartości w tej kolumnie w wyniku akcji użytkownika. Przed każdym > zmniejszeniem/zwiększeniem wartości aplikacja sprawdza, czy wartość nie > jest za mała/duża. > > Przykład: > - Wartość w kolumnie = 50 > - User1 sprawdza czy wartość >= 30 > - User1 zmniejsza wartość o 30 > - Wartość w kolumnie = 20 > - User2 sprawdza czy wartość >= 25 > - User2 dostaje odmowę zmniejszenia wartości o 25 > > Problem w tym, że istnieje ryzyko zejścia się w czasie akcji wykonanych > przez 2 lub więcej userów. > > Przykład: > - Wartość w kolumnie = 50 > - User1 sprawdza czy wartość >= 30 > - User2 sprawdza czy wartość >= 25 > - User1 zmniejsza wartość o 30 > - Wartość w kolumnie = 20 > - User2 zmniejsza wartość o 25 > > Co oczywiście kończy się w MySQL "przekręceniem licznika", a ja w tym > momencie dostaję w zęby. > > Da się przed tym zabezpieczyć na poziomie MySQL?
Tak, trzeba używać transakcji i select for update, albo lockować wiersz.
-- P.M.
sendzia - 16-06-2006 00:54
Paweł Matejski napisał(a): > sendzia wrote: >> Witam! >> >> W tabeli mam kolumnę typu BIGINT UNSIGNED. Aplikacja php dokonuje zmian >> wartości w tej kolumnie w wyniku akcji użytkownika. Przed każdym >> zmniejszeniem/zwiększeniem wartości aplikacja sprawdza, czy wartość nie >> jest za mała/duża. >> >> Przykład: >> - Wartość w kolumnie = 50 >> - User1 sprawdza czy wartość >= 30 >> - User1 zmniejsza wartość o 30 >> - Wartość w kolumnie = 20 >> - User2 sprawdza czy wartość >= 25 >> - User2 dostaje odmowę zmniejszenia wartości o 25 >> >> Problem w tym, że istnieje ryzyko zejścia się w czasie akcji wykonanych >> przez 2 lub więcej userów. >> >> Przykład: >> - Wartość w kolumnie = 50 >> - User1 sprawdza czy wartość >= 30 >> - User2 sprawdza czy wartość >= 25 >> - User1 zmniejsza wartość o 30 >> - Wartość w kolumnie = 20 >> - User2 zmniejsza wartość o 25 >> >> Co oczywiście kończy się w MySQL "przekręceniem licznika", a ja w tym >> momencie dostaję w zęby. >> >> Da się przed tym zabezpieczyć na poziomie MySQL? > > Tak, trzeba używać transakcji i select for update, albo lockować wiersz. >
Ok. Dokształciłem się już. Ale martwi mnie taki problem: Używam w php stałych połączeń z bazą. Czy przypadkiem wszystkie zapytania, które wysyla php do bazy nie są widziane jako zapytania jednego klienta? Inaczej mówiąc czy user2 wykonując akcję (która zaczyna nową transakcję) może spowodować COMMIT transakcji zaczętej przez usera1? (Sorry, że tu o php pytam.)
-- The real problem is not whether machines think but whether men do. B. F. Skinner
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 16-06-2006 00:55
sendzia wrote:
> Ok. Dokształciłem się już. Ale martwi mnie taki problem: Używam w php > stałych połączeń z bazą. Czy przypadkiem wszystkie zapytania, które > wysyla php do bazy nie są widziane jako zapytania jednego klienta? > Inaczej mówiąc czy user2 wykonując akcję (która zaczyna nową transakcję) > może spowodować COMMIT transakcji zaczętej przez usera1? (Sorry, że tu o > php pytam.)
Dla transakcji nie ma znaczenia user, a połączenie. Musisz tylko na początku skryptu założyć, że nie wiadomo w jakim stanie odtrzymujesz połączenie do bazy (mogą być nie zatwierdzone transakcje).
-- P.M.
Rafal sxat - 16-06-2006 00:56
=?iso-8859-2?Q?Re:_=5BMySQL4.1=5D_jak_przypilnowa=E6_warto=B6 ci_UNSIGNE?= =?iso-8859-2?Q?D=3F?=
> >> Co oczywiście kończy się w MySQL "przekręceniem licznika", a ja w tym > >> momencie dostaję w zęby. > >>
update xxx set xx=xxa where <costam> and xx-xxa>0 and ....costam... i sprawdzamy tylko ilosc rekordow przetworzonych i po krzyku... moze byc tak?
-- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MS SQL 2005] =?windows-1250?Q?Ilo=9C=E6_wiersz=F3w_w_zbiorze_wynikowym?=
InterSystems =?windows-1250?Q?Cach=E9_-_uzywal_ktos=3F?=
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
SELECT MAX(nazwaPola) FROM tabela WHERE .... i ORA-01405: pobran? warto?ci? kolumny jest NULL
do czego uzywac perl-a? czy warto poznac ten jezyk
ksiazka 'Skanowanie i poltony' - czy warto kupic?
zanotowane.pldoc.pisz.plpdf.pisz.pllatwa-kasiora.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|