Здесь во второй сессии (выполняемой в отдельном
потоке) мы просто читаем данные и выводим их на консоль. Так как значение
переменной value мы изменили перед стартом второй сессии, совершенно очевидно, что на экран будет выведено
in
second session: 10
in
primary session: 10
Однако при использовании версионной модели мы должны
получить
in
second session: 0
in
primary session: 10
Причина в том, что для каждой транзакции хранится своя
копия данных (snap-shot), которая синхронизируется с основными данными только в
момент фиксирования транзакции.
ПРИМЕЧАНИЕ
Oracle хранит эти копии данных в
специальном хранилище, который называется rollback segment.
Версионная модель характеризуется тем, что в ней
отсутствует нулевой уровень изоляции транзакций (READ UNCOMMITTED), и вместо
него вводится новый уровень, который в приведенном далее коде я назвал
SNAP_SHOT. Он отличается от стандартного тем, что позволяет читать
действительные зафиксированные данные, даже при наличии незавершенных транзакций
обновления.
Вот конечный вариант классов CProxy и CObject, который
реализует обе модели и, вдобавок к этому, поддерживает два «хинта»: UPDLOCK и
XLOCK. Они предназначены для изменения уровня изоляции непосредственно при
работе со значением переменной, а их смысл я поясню в следующих разделах.
#define MSSQL
// #define ORACLE
class CObject;
class CProxy
{
friend class CObject;
public:
__declspec(property(get=get_Value,put=put_Value))
int value;
int get_Value(int level = -1)
const;
void put_Value(int i);
void Commit();
void Rollback();
private:
int _level;
Рекомендуем скачать другие рефераты по теме: решебник по физике, украинские рефераты.