Мазмунга өтүү

Transactions in Depth: Изоляция денгээлдери жана бекитуулер (locking)

Сабактын башталышы

Транзакциялар терендигинде: изоляция денгээлдери жана бекитуулер

Эки транзакция бир эле саптарды бир убакта тийгенде чын эле эмне болот

Негизги идея: Сиз командаларды 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_idownerbalance
1Alice500.00
2Bob300.00
3Carol0.00
product_idnamepricestockversion
1Keyboard45.00100
2Mouse25.0000
3Monitor220.0040

Эмне учун InnoDB? Изоляция денгээлдери жана сап боюнча бекитуу - бул сактоо кыймылдаткычынын мумкунчулуктору. InnoDB (MySQL демейки кыймылдаткычы) транзакцияларды, сап денгээлиндеги бекитуулорду жана MVCC колдойт; эски MyISAM кыймылдаткычы колдобойт, ошондуктан булардын баары ага тиешелуу эмес.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө