Кто знает, как пользоваться функциями обработки транзакций? Ведь есть же какой-то общий стиль их использования.
При ближайшем рассмотрении функции BeginConcurrentTransaction, выяснилось, что при чтении записей она не блокирует их (эти самые записи).
В хелпе по Vip'у есть описание:
function BeginConcurrentTransaction (iMode : word):integer;, где iMode - режим транзакции. А каким бывает этот режим (кроме 0) не описано нигде.
А функция BeginTransaction блокирует всю таблицу, содержащую эти несколько записей (и, вообще, она "устаревшая. Вместо нее рекомендуется использовать функцию BeginConcurrentTransaction.").
Так что же делать?
			
			
									
						
										
						Использование транзакций
Модераторы: m0p3e, edward_K, Модераторы
- 
				Алексей
- Местный житель
- Сообщения: 2898
- Зарегистрирован: 24 июн 2005, 12:12
- Откуда: Иркутская область
Re: Использование транзакций
Есть у кого-нибудь опыт по транзакциям?  Написан свой функционал, но блокируется таблица lastnumd, вот думаю через транзакции доступ к ней оформить.
			
			
									
						
										
						- 
				edward_K
- Заслуженный деятель интернет-сообщества
- Сообщения: 5189
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Использование транзакций
Сие пашет, да. Но надо быть крайне аккуратным.
1. Транзакция должна быть короткая
2. Никаких сообщений внутри быть не должно, а то кто то уйдет на обед и никто работать не сможет
3. Еще можно посмотреть в сторону семафоров.
Вот пример
			
			
									
						
										
						1. Транзакция должна быть короткая
2. Никаких сообщений внутри быть не должно, а то кто то уйдет на обед и никто работать не сможет
3. Еще можно посмотреть в сторону семафоров.
Вот пример
Код: Выделить всё
  var TransactionResult: integer;  TransactionResult := BeginConcurrentTransaction(0);
  if (TransactionResult <> tsOk) and (TransactionResult <> tsTransactionIsActive)
  {
    sLastError := 'Ошибка открытия транзакции...'+#var(Result);
    Message(sLastError, OkButton + Warning);
    Exit;
  }
....
  if (TransactionResult <> tsTransactionIsActive)
  {
    if (Result = tsOk)
    {
      Result := EndTransaction;
      if (Result <> tsOk)
      {
        sLastError := 'Ошибка завершения транзакции...'+#var(Result);
        Message(sLastError, OkButton + Warning);
      }
    }
    else
    {
      Result := AbortTransaction;
      if (Result <> tsOk)
      {
        sLastError := sLastError + ''#13'Ошибка отката транзакции...'+#var(Result);
        Message(sLastError, OkButton + Warning);
      }
    }
  }
- 
				Friendlyman
- Постоянный гость
- Сообщения: 74
- Зарегистрирован: 23 июн 2007, 23:07
- Откуда: ТопСофт, Минск
Re: Использование транзакций
Есть аналогичный опыт использования транзакций. В LastnumD блокировалась не вся таблица, а конкретная запись. В итоге вынес присвоение номера за пределы транзакции, т.е. сразу в транзакции выполняется вся работа которую можно откататить, а потом трпнзакция закрывается и обрабатываются узкие места.
Использование транзакций в Атлантисе мне представляется достаточно сырым и неудобным, не хватает автномных транзакций, нетрнзакцинных нумераторов, ошибки встречаются (недавно регистрил в пир проблему, когда запись, которая.была откачена транзакцией, продолжала сидеть в атлантическом кеше таблицы. В общем с транзакциями в Атлантисе чувчтвуешь себя первопроходцем.
			
			
									
						
										
						Использование транзакций в Атлантисе мне представляется достаточно сырым и неудобным, не хватает автномных транзакций, нетрнзакцинных нумераторов, ошибки встречаются (недавно регистрил в пир проблему, когда запись, которая.была откачена транзакцией, продолжала сидеть в атлантическом кеше таблицы. В общем с транзакциями в Атлантисе чувчтвуешь себя первопроходцем.