Реферат: Блокировки в 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