СУБД. Параллелизм

СУБД
Навроцкий Артем
Параллелизм

Параллелизм

The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
© By Herb Sutter, March 2005

Какая проблема решается?

Нет разделяемого состояния - нет проблем

1: SELECT * FROM account WHERE id = 42;
1: ...
1: UPDATE account SET money = 1234 WHERE id = 42;

Проблема не специфична для СУБД

Java

class Foo {
    private Helper helper = null;

    public Helper getHelper() {
        if (helper == null)
            helper = new Helper();
        return helper;
    }
}

Правила игры

Java Memory Model (JSR 133)

Модель памяти Java стала первой попыткой разработать исчерпывающую модель межпоточного взаимодействия для крупного языка программирования.

ACID

Требования к транзакционной системе, обеспечивающие наиболее надёжную и предсказуемую её работу.

Пессимистичные блокировки

SQL

SELECT * FROM account WHERE id = 42 FOR UPDATE;
...
UPDATE account SET money = 1234 WHERE id = 42;

Пессимистичные блокировки

Когды вы оперируете lock’ами могут случиться четыре типа проблем:

Пессимистичные блокировки

DEADLOCK

LOCK A LOCK B
... ...
LOCK B LOCK A
... ...
UNLOCK B UNLOCK A
UNLOCK B UNLOCK A

Оптимистичные блокировки

SQL

SELECT * FROM account WHERE id = 42;
...
UPDATE account SET
  version = 8,
  money = 1234
WHERE id = 42
  AND version = 7;

Оптимистичные VS Пессимистичные

Lock-free очередь (сильно упрощенно)

void stack_push(stack* s, node* n) {
  node* head;
  do {
    head = s->head;
    n->next = head;
  } while (!atomic_compare_exchange(s->head, head, n));
}

node *stack_pop(stack* s) {
  node* head, next;
  do {
    head = s->head;
    next = head->next;
  } while (!atomic_compare_exchange(s->head, head, next));
  return head;
}
Навроцкий Артем
E-mail: bozaro@yandex.ru
Спасибо за внимание!