Показать сообщение отдельно
Старый 08.05.2008, 15:37   #1  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
Параллельная обработка данных
Всем привет!
Такой вопрос есть батч(пакет)-джоба, которая выполняет апдейт таблици.
PHP код:
run()
{
    
Trans trans;
    
Trans buffer;
    try
    {
        while 
select trans where trans.open == true
        
{
            
ttsbegin;
            
buffer Trans::find(trans.recidtrue);
            
buffer.open false;
            
buffer.update()
            
ttscommit;
        }
    }
    catch (
Exception::Deadlock)
    {
        
retry;
    }
    catch (
Exception::UpdateConflict)
    {
        
retry;
    }

Если запустить два батча, то что произойдет?

1) Первый батч выбирает из базы например 20 записей
2) Второй батч выбирает из базы теже 20 записей
3) Первы батч апдейтит первую запись - все ок
4) Второй батч апедйтит первую запись - конфликт апдейта
5) Второй батч зановов выбирает с базы, но уже 19 записей
6) Первый бачт апдейтит вторую линию
7) Второй батч апдейтит свою первую линию - кофликт апдейта ....

Получается что второй батч мешает всевремя первому. Можно ли сделать чтобы от двух был выигрышь?

Или я не правлиьно понимаю.
Спасибо!