Какво е безизходица и как да се бори

Kuzmenko Дмитрий, Epsylon Technologies



Нека започнем с факта, че буквален превод на застой означава "мъртъв заключване". Когато се работи с BDE (. Delphi, C ++ Builder) с страната на клиента и МЗ тригери и съхранени процедури, ние имаме два случая безизходица на съобщението - четене и актуализиране. Към наистина "мъртви" блок не се постигне, тъй като IB SQL Link започва всяка сделка с параметър чака повече (т.е.. Е. Не очаквам за разрешаване на конфликта).







Безизходица, когато модернизация

Две сделки не са завършени все още, но ние се опитваме да се актуализира един и същи запис се считат за конкурентен. Има два режима на работа - безизходица изчакаме и да не чакаме (с очакване и без очакване). Най-BDE за всеки режим IB транзакция се използва незабавно, както и с режим на очакване може да се настрои само в директната работа с IB API (например чрез FreeIBComponents).

"Unlucky", разбира се, той се счита за сделка, може да получи застой съобщение. Това означава, че едно от действията, извършени по сделката не може да бъде изпълнена. Ето защо, тази сделка трябва да бъде анулиран (намаление на цените). Избягвайте продължителни операции, които могат да попаднат в ситуация - единственият изход от нея ще се опита да започне операцията отново и повторете всички стъпки.

Намаляване на броя на потенциалните конфликти на обновяването може да се намали времето за изпълнение на сделката. Например, данни от потребителя на първо приемат, а ако се потвърждава информацията, въведена, приложението започва сделка, бързо предава данни към сървъра и цели. Колкото по-бързо се премине на сделката, толкова по-вероятно е приключило успешно. Ето защо в 3.x на BDE въведен режим на кеширане на актуализации (кеширана промени). Когато Кеширани Updates промени се натрупват върху клиента страна на заявлението, а след смяната на метод кол ApplyUpdates "уволнен" на сървъра. Във всеки случай, дори ако не можете да се отървете от сделката в дългосрочен подновяване, трябва да се помисли за логиката на приложението и не забравяйте да включите в процеса на прилагане на възникващите конфликти.

Застоя в четене

Внимание! Всичко описано по-долу проблеми са фиксирани в BDE 4.01. Флаговете параметър водач, който не е нужен.







Deadlock възниква, когато чете основно в SQL сървъри, които използват страница заключване при четене или промяна на данни (MS SQL и Sybase). Изглежда странно, че когато се работи с МЗ, в които съществува заключване (не се счита за заключването на актуализация конфликт - това не заключва, а именно конфликта), понякога все още се среща безизходица при четене на данни.

Причината е следната: за четене на сделката ниво на изолация, извършени на МЗ има два режима на работа - няма да отчита ВЕРСИЯ и RECORD ВЕРСИЯ (виж описанието на параметрите на сделката.). В първия случай, ако четенето на ядрото за запис IB открива наличието на непотвърдена (необвързан) версия на този запис, той се връща застоя на съобщението. Това е все едно на заявлението показва, че скоро този запис може да бъде актуализиран (всъщност в неподходящи ReadCommitted промени ще се вижда веднага, след като бъдат потвърдени (комит)). В режим RECORD ВЕРСИЯ, наличието на неодобрени версии на записи се игнорират, и винаги се връща версия на записа на стария.

Тя ще изглежда, така че защо да не работи в режим RECORD ВЕРСИЯ BDE подразбиране? За съжаление, тя е била първоначално положи - Прочетете Ангажиран сделка в BDE работи с опция за запис на версия - но до версия 2.0 Delphi на неудобство почти никой не забелязал. Но защо да не сте забелязали, четете нататък.

Нивото на изолация в AUTOCOMMIT в различни версии на BDE

В зависимост от версията на BDE променило стандартното ниво на изолация. Когато не се използва, изрично методите на сделки за управление (Database.StartTransaction, Ангажиране и намаление на цените), а след това за вас го прави BDE. Не ми ли вярвате? Погледнете в SQL Монитор. Най-важното е, че вида на сделката по подразбиране "зашити" в SQL връзка. И дори да постави на формата на компонент TDatabase, и да се промени неговата tiTransIsolation имот, той не влияе на BDE, докато ти се обадя метод Database.StartTransaction.

Така че това, което сме сделката започва BDE по подразбиране.
  • Delphi 1.0, BDE 2.52 - при повторно четене
  • Delphi 2.0, BDE 3.x - Прочетете Ангажиран
  • Delphi 3.0, 4.0 BDE - Прочетете Ангажиран
  • Delphi 3.01, BDE 4.01, 4.51 - Прочетете извършени с RECORD версия параметър - безизходица-и четене са изчезнали.

По този начин, безизходица-и четене забелязва едва Delphi 2.0 то е защото сделката е по подразбиране се промени, за да прочетете ангажименти. Между другото, в READLINK.TXT за Delphi 2.x и 3.0 казва, че ако искате да промените сделката по подразбиране за повторно четене, трябва да настроите ВОДАЧ ЗНАМЕНА настройките на драйвера = 512 д. Всъщност "осигури съвместимост" поведението на приложението, се прехвърлят 2 на Delphi Delphi 1.

Внимание! Не инсталирате драйвера знамена, преди да сте прочели READLINK.TXT.

Фактът, че, например, във версия 4.0 на броя на знамена се е увеличил:
  • 0 Read Ангажиран, незабавно потвърждение за всякакви промени (може да причини препрочитам TQuery курсори)
  • 512 при повторно четене, незабавно потвърждение за всякакви промени (може да причини препрочитам TQuery курсори)
  • 4096 Прочетете извършено, като потвърждение на промените, извършени COMMIT ЗАПАЗЕТЕ, запазвайки контекста на курсора TQuery
  • 4608 при повторно четене, потвърждение промяна се изпълнява като COMMIT ЗАПАЗЕТЕ, запазвайки контекста на курсора TQuery