Реферат: Блокировки в MS SQL Server 2000
int main(int argc, char* argv[])
{
// Открытиесессии
_beginthreadex(0,0,thread_proc,0,0,0);
// Эмулируемработу
Sleep(100);
CProxy& fake = CObject::GetObject(CObject::READ_UNCOMMITTED);
// В этой строчке происходит чтение «грязных данных»
// fake.get_Value() возвращает 20
int* pAr = new int[fake.get_Value()];
// Эмулируемработу
Sleep(1000);
// fake.value = 40
for(int i = 0;i < fake.value;i++)
pAr[i] = 0;
if (pAr) delete[] pAr;
fake.Commit();
return 0;
}
Если откомпилировать и запустить этот код, он гарантированно приведет к ошибке во время исполнения, так как будет осуществлен выход за границу массива в цикле. Почему? Потому что при создании массива используется значение незафиксированных данных, а в цикле – зафиксированных. Эта проблема известна как проблема «грязного чтения». Она возникает, когда одна транзакция пытается прочитать данные, с которыми работает другая параллельная транзакция. В таком случае временные, неподтвержденные данные могут не удовлетворять ограничениям целостности или правилам. И, хотя к моменту фиксации транзакции они могут быть приведены в «порядок», другая транзакция уже может воспользоваться этими неверными данными, что приведет к нарушению ее работы.
Для решения этой проблемы вводится новый уровень изоляции, на котором запрещается «грязное» чтение. Вот такие изменения нужно внести в реализацию классов CProxy и CObject для того, чтобы программа удовлетворяла второму уровню изоляции:
class CObject { friend class CProxy; public: enum {READ_UNCOMMITTED,READ_COMMITTED}; static CProxy& GetObject(int level = -1); ~CObject() { К-во Просмотров: 973
Бесплатно скачать Реферат: Блокировки в MS SQL Server 2000
|