parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Возвращаясь к проблеме транзакций

virusav 10.10.2006 16:35

Начало темы тут http://www.parser.ru/forum/?id=56043

Излагаю проблему более подробно с примером.

Есть два пользователя которые одновременно вызывают 2 метода, которые работают с InnoDB таблицами tab1 и tab2.
Первый пользователь пытается зарезервировать за собой запись в таблице tab1 методом ^work_user1[1], а второй в это же время методом ^work_user2[2] пытается считать запись из таблицы занятую им.

При записи в лог иногда пишется:
test1 GOOD
test2 BAD!!!
В итоге 1-й пользователь не может застолбить за собой запись в таблице, т.е. получает скорее всего некий откат, после того как идет INSERT в другую таблицу tab2.
При обращении к другой таблице завершается первая транзакция? - и в этот момент случается откат?
Вопрос: почему это может происходить???
@work_user1[id_owner]

$T1[^table::sql{SELECT id, id_owner
	FROM tab1
	WHERE id_owner='0'
	LIMIT 0,1}]

^if(def $T1 && $T1.id_owner == 0){
# Пока эта строчка не используется, но это скорее всего ситуацию не изменит
#^void:sql{UPDATE `tab1` SET id_owner='0' where `id_owner`='$id_owner'}
		
^void:sql{UPDATE `tab1` SET `id_owner`='$id_owner' where id='$T1.id' and id_owner='0'}
		
$test[^table::sql{SELECT id FROM tab1 WHERE id_owner='$id_owner'}]
^if(def $test){^writeLog[test1 GOOD]}{^writeLog[test1 BAD!!!]}
		
^void:sql{INSERT INTO `tab2` SET `dt_autosave`=now()}
		
$test[^table::sql{SELECT id FROM tab1 WHERE id_owner='$id_owner'}]
^if(def $test){^writeLog[test2 GOOD]}{^writeLog[test2 BAD!!!]}

}


###############################################
@work_user2[id_owner]

$result[^table::sql{SELECT id, id_owner
	FROM tab1
	WHERE id_owner='$id_owner'
	LIMIT 0,1}]