Транзакциялар терендигинде: изоляция денгээлдери жана бекитуулер
Эки транзакция бир эле саптарды бир убакта тийгенде чын эле эмне болот
START TRANSACTION ... COMMIT ичине ороону билесиз. Продакшенде эн кыйыны - бул конкуренттуулук: коп транзакция бир убакта иштейт. Изоляция денгээли - бир транзакцияга башка транзакциянын коммит болбогон же азыр иштеп жаткан ишинин канчасын коруого уруксат берерин чечкен жондоочу, ал эми ББС муну бекитуулор жана сап версиялары менен ишке ашырат. Денгээлди жана бекитуу стратегиясын атайын танданыз, болбосо иш жузунде кир маалымат, жоголгон жанылоолор жана deadlock кутот.
- уч окуу феноменин атай аласыз: кир окуу, кайталанбас окуу, фантом окуу;
- READ COMMITTED, REPEATABLE READ жана SERIALIZABLE ортосунан тандап, MySQL демейкисин билесиз;
- бирге колдонулуучу жана монополдук сап бекитуулорун тушундуруп,
SELECT ... FOR UPDATEкадимки окуудан эмнеси менен айырмаланарын билесиз; - deadlock (взаимоблокировка) тааныйсыз жана аны болтурбоонун стандарттык ыкмаларын колдоносуз;
- оптимисттик жана пессимисттик конкуренттуулук жонундо ойлонуп, бирин тандай аласыз.
0. Биздин жумушчу схема
Томондогу ар бир мисал эки кичине InnoDB таблицасы менен иштейт: ортосунда акча которо турган банктык accounts жана stock санын азайта турган дукондук products. version тилкеси оптимисттик бекитуу болуму учун керек.
CREATE TABLE accounts (
account_id INT PRIMARY KEY,
owner VARCHAR(50) NOT NULL,
balance DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB;
INSERT INTO accounts VALUES
(1, 'Alice', 500.00),
(2, 'Bob', 300.00),
(3, 'Carol', 0.00);
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
price DECIMAL(8,2) NOT NULL,
stock INT NOT NULL,
version INT NOT NULL DEFAULT 0
) ENGINE=InnoDB;
INSERT INTO products (product_id, name, price, stock) VALUES
(1, 'Keyboard', 45.00, 10),
(2, 'Mouse', 25.00, 0),
(3, 'Monitor', 220.00, 4);
| account_id | owner | balance |
|---|---|---|
| 1 | Alice | 500.00 |
| 2 | Bob | 300.00 |
| 3 | Carol | 0.00 |
| product_id | name | price | stock | version |
|---|---|---|---|---|
| 1 | Keyboard | 45.00 | 10 | 0 |
| 2 | Mouse | 25.00 | 0 | 0 |
| 3 | Monitor | 220.00 | 4 | 0 |
Эмне учун InnoDB? Изоляция денгээлдери жана сап боюнча бекитуу - бул сактоо кыймылдаткычынын мумкунчулуктору. InnoDB (MySQL демейки кыймылдаткычы) транзакцияларды, сап денгээлиндеги бекитуулорду жана MVCC колдойт; эски MyISAM кыймылдаткычы колдобойт, ошондуктан булардын баары ага тиешелуу эмес.