Реферат: Блокировки в MS SQL Server 2000

Однако встает вопрос: где ее инициализировать? Можно в конструкторе глобального объекта, но если у нас будет такой же глобальный клиент, мы не сможем гарантировать, что инициализация критической секции произойдет раньше вызова функции GetObject. Нам нужно что-то, что создается, инициализируется и захватывает ресурс непосредственно в функции GetObject. В качестве этого «чего-то» я выбрал объект исполнительной системы «Мьютекс». Его использование вы и можете наблюдать в первоначальном коде.

Теперь рассмотрим пример с использованием этих классов, который сразу вскрывает первую проблему.

unsigned __stdcall thread_proc(void*)

{

// Началотранзакции

CProxy& prx = CObject::GetObject();

prx.value = 20;

prx.Commit();

return 0;

}

int main(int argc, char* argv[])

{

// Началотранзакции

CProxy& prx = CObject::GetObject();

prx.value = 10;

// Началоновойсессии

_beginthreadex(0,0,thread_proc,0,0,0);

// Эмулируемработу

// Sleep(1000);

printf("%d\n",prx.value);

prx.Commit();

return 0;

}

Здесь я в двух параллельных потоках изменяю значение переменной value объекта CObject: в одном – на 10, во втором – на 20. Что выведется на консоль? Определенно сказать нельзя: если раскомментировать строчку Sleep(1000), выведется 20. С закомментированной строчкой выводится 10. Эта проблема носит название «проблема потери последнего изменения» (lost update problem) или проблема «грязной» записи. Она заключается в том, что при одновременном выполнении транзакций, в которых производится изменение данных, невозможно сказать заранее, какое конечное значение примут данные после фиксирования обеих транзакций. В случае «грязной» записи только одна из всех параллельно выполняющихся транзакций будет работать с действительными данными, остальные – нет. Другими словами, хотя данные и будут находиться в согласованном состоянии, логическая их целостность будет нарушена.

Для того чтобы наш объект удовлетворял первому уровню изоляции транзакций, на котором запрещается «загрязнение» данных, перепишем его следующим образом (изменения касаются только класса CObject):

class CObject

{

friend class CProxy;

public:

К-во Просмотров: 974
Бесплатно скачать Реферат: Блокировки в MS SQL Server 2000