Реферат: Блокировки в MS SQL Server 2000
return 0;
}
int main(int argc, char* argv[])
{
// Началосессии
_beginthreadex(0,0,thread_proc,0,0,0);
// Эмулируемработу
Sleep(100);
CProxy& fake = CObject::GetObject(CObject::READ_COMMITTED);
// Созданиемассива
int* pAr = new int[fake.get_Value()];
// Эмулируемработу
Sleep(1000);
// Инициализациямассива
for(int i = 0;i < fake.value;i++)
pAr[i] = 0;
if (pAr) delete[] pAr;
fake.Commit();
return 0;
}
Если запустить этот пример, он, как и предыдущий, приведет к ошибке доступа к памяти. Дело в том, что изначально создается массив размером в 20 элементов, а в цикле инициализации используется значение 40, и на 21 элементе мы получим ошибку доступа.
Проблема повторного чтения состоит в том, что между операциями чтения в одной транзакции другие транзакции могут беспрепятственно вносить любые изменения, так что повторное чтение тех же данные приведет к другому результату.
Для поддержки третьего уровня изоляции в код изменений вносить не надо! :) Необходимо лишь не снимать разделяемые блокировки до конца транзакции. Так как метод, приведенный ниже, снимает блокировку только на уровне READ_COMMITTED:
void RemoveShared(int level) { if (level == READ_COMMITTED){ RemoveSharedLock(); } } |