Стратегии атомарного приращения и блокировки SQL - это безопасно?

У меня есть вопрос о SQL и стратегиях блокировки. В качестве примера предположим, что у меня есть счетчик просмотров изображений на моем веб-сайте. Если у меня есть sproc или аналогичный для выполнения следующих операторов:

START TRANSACTION;
UPDATE images SET counter=counter+1 WHERE image_id=some_parameter;
COMMIT;

Предположим, что счетчик для определенного image_id имеет значение '0' в момент времени t0. Если два сеанса обновляют один и тот же счетчик изображений, s1 и s2, Возможен также следующий сценарий, приводящий к такому же поведению. Я предполагаю, что мы находимся на уровне изоляции READ_COMMITED или выше, так что s2 получает значение с начала транзакции, хотя s1 уже записал в счетчик «1».

s1: begin
s1: begin
s1: read counter for image_id=15, get 0, store in temp1
s1: write counter for image_id=15 to (temp1+1), which is 1 
s2: read counter for image_id=15, get 0 (since another tx), store in temp2
s2: write counter for image_id=15 to (temp2+1), which is also 1
s1: commit, ok
s2: commit, ok
43
задан Alexander Torstling 29 September 2010 в 12:44
поделиться