Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 Версионные субд  [new]
ovle
Member

Откуда:
Сообщений: 4
День добрый. Возник такой вопрос.
В версионной субд происходит так:
- Чел1 читает остаток из версии1
- Чел2 читает остаток из версии1
- Чел1 записывает остаток
- Чел2 записывает остаток

Блокировочник бы не дал прочитать данные чел2 пока не закончит транзакцию чел1.
Как в версионнике контролируется недопустимость отрицательного остатка.
9 июл 15, 10:21    [17870606]     Ответить | Цитировать Сообщить модератору
 Re: Версионные субд  [new]
Yo.!
Guest
ovle
День добрый. Возник такой вопрос.
В версионной субд происходит так:
- Чел1 читает остаток из версии1
- Чел2 читает остаток из версии1
- Чел1 записывает остаток
- Чел2 записывает остаток

Блокировочник бы не дал прочитать данные чел2 пока не закончит транзакцию чел1.
Как в версионнике контролируется недопустимость отрицательного остатка.


как и в блокировочнике все зависит от уровня изолированности.
на уровне RC предполагается, что оба читать будут с помощью SELECT FOR UPDATE, который сериализует транзакции
на уровне SERIALIZABLE даже без SELECT FOR UPDATE один из них получит exception can't serialize access for this transaction

блокировочник не даст "прочитать данные чел2" только на уровне Repeateble Read и выше, на дефолтном RC вы получите классический lost update.
9 июл 15, 10:34    [17870655]     Ответить | Цитировать Сообщить модератору
 Re: Версионные субд  [new]
roden
Member

Откуда:
Сообщений: 741
Везде по-разному, с Linter Multiversion была приблизительно такая ситуация: Многоверсионность в k-press.ru
10 июл 15, 15:13    [17877270]     Ответить | Цитировать Сообщить модератору
 Re: Версионные субд  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67454
Блог
ovle
Блокировочник бы не дал прочитать данные чел2 пока не закончит транзакцию чел1

Это не совсем так. В целом, Вам нужно глубже погрузиться в детали реализации разных уровней изоляции в конкретных разных СУБД.

ovle
Как в версионнике контролируется недопустимость отрицательного остатка.

Ну, самый простой вариант -

create table goods(id integer, qnt integer check (qnt >= 0));

create procedure consume(p_id integer, p_qnt integer) is
begin
  update goods 
    set qnt = qnt - p_qnt
    where id = p_id;
end;
10 июл 15, 15:31    [17877389]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить