Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΈ автоматичСская фиксация ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

ПослС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… срСдствами модуля PDO потрСбуСтся ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ PDO управляСт транзакциями, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запросы. Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ ΠΏΡ€Π΅ΠΆΠ΄Π΅ Π½Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с транзакциями, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ 4 Π³Π»Π°Π²Π½Ρ‹Ρ… характСристики Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ: Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ, ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ, ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ Π΄ΠΎΠ»Π³ΠΎΠ²Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ (Π°Π½Π³Π». Atomicity, Consistency, Isolation and Durability, ΠΈΠ»ΠΈ ACID). Говоря простым языком, транзакция Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ каТдая опСрация с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… выполнится бСзопасно ΠΈ Π±Π΅Π· ΠΏΠΎΠΌΠ΅Ρ… со стороны Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π΄Π°ΠΆΠ΅ Ссли опСрация выполняСтся поэтапно. Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ автоматичСски ΠΎΡ‚ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ запросу, Ссли Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π΅Ρ‰Ρ‘ Π½Π΅ зафиксировали, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок Π² скриптах.

Π Π°Π±ΠΎΡ‚Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ часто состоит Π² Β«Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠΈΒ» ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅; приятный ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ состоит Π² Ρ€Π΅Π·ΠΊΠΎΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ эффСктивности этих ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ скрипты ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΠΈΡ… Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΡΡ‚ΡŒ, хотя для этого ΠΈ потрСбуСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с транзакциями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эти прСимущСства.

НС каТдая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, поэтому ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ PDO Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ «автоматичСской фиксации». Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ автофиксации ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½Π΅ΡΠ²Π½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Ссли Π‘Π£Π‘Π” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΈΠ»ΠΈ выполняСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы, Ссли Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Π―Π²Π½ΠΎΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° PDO::beginTransaction(). НСзависимо ΠΎΡ‚ настроСк ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΌΠΎΠ΄ΡƒΠ»ΡŒ выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ PDOException, Ссли Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° β€” ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Π°Ρ ошибка. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ измСнСния Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ PDO::commit(), Ссли ΠΊΠΎΠ΄ выполнился ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ PDO::rollBack(), Ссли ΠΏΡ€ΠΈ запускС ΠΊΠΎΠ΄Π° Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

ΠœΠΎΠ΄ΡƒΠ»ΡŒ PDO провСряСт Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ PDO::beginTransaction() Π²Π΅Ρ€Π½Ρ‘Ρ‚ true Π±Π΅Π· ошибок, Ссли сСрвСр Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ запрос Π½Π° запуск Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π΄Π°ΠΆΠ΅ Ссли Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… условиях ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса выяснится, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ нСдоступны.

К Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ относится ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° запуска Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… MyISAM Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… MySQL.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

НСявныС фиксации ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ DDL-запросов: ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… нСявно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ COMMIT ΠΈ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ измСнСния Π² ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ сСрии DDL-запросов (Π°Π½Π³Π». Database Definition Language) Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ DROP TABLE ΠΈΠ»ΠΈ CREATE TABLE. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ оказались Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, автоматичСски Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ измСнСния Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ относятся Π‘Π£Π‘Π” MySQL ΠΈ Oracle.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ нСявной фиксации

<?php

$pdo
->beginTransaction();
$pdo->exec("INSERT INTO users (name) VALUES ('Rasmus')");
$pdo->exec("CREATE TABLE test (id INT PRIMARY KEY)"); // НСявная фиксация ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ COMMIT выполняСтся Π² этом мСстС
$pdo->rollBack(); // НСвозмоТно ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠ΅Ρ€ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ INSERT/CREATE Π² Π‘Π” MySQL ΠΈΠ»ΠΈ Oracle

?>

Π›ΡƒΡ‡ΡˆΠ°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°: ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ выполнСния DDL-запросов Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. DDL-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° трСбуСтся.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ PDO автоматичСски ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ соСдинСния. ΠžΡ‚ΠΊΠ°Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ β€” ΠΌΠ΅Ρ€Π° бСзопасности, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° скрипт Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ взаимодСйствиС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°Ρ€ΡƒΡˆΠΈΠ»ΠΎΡΡŒ, Ρ€Π°Π· измСнСния Π½Π΅ зафиксировали явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ измСнСния для бСзопасности Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

ИзмСнСния откатятся автоматичСски, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ PDO::beginTransaction(). ΠŸΡ€ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ запроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, PDO Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΎΠ± этом, поэтому Π½Π΅ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈ сбоС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ записСй для Π½ΠΎΠ²ΠΎΠ³ΠΎ сотрудника с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ 23. ΠšΡ€ΠΎΠΌΠ΅ Π²Π²ΠΎΠ΄Π° Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ сотрудникС потрСбуСтся Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Ρƒ. ВмСсто Π΄Π²ΡƒΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΎΠ±Π΅Ρ€Π½Ρ‘ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ PDO::beginTransaction() ΠΈ PDO::commit(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΠΎΠΊΠ° вставка Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. ΠŸΡ€ΠΈ сбоС Π±Π»ΠΎΠΊ catch ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ внСсли с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π°Ρ‡Π°Π»Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС.

<?php

try {
$dbh = new PDO(
'odbc:SAMPLE',
'db2inst1',
'ibmdb2',
array(
PDO::ATTR_PERSISTENT => true)
);

echo
"ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈΡΡŒ\n";
} catch (
Exception $e) {
die(
"Π’ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: " . $e->getMessage());
}

try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbh->beginTransaction();
$dbh->exec("INSERT INTO staff (id, first, last) VALUES (23, 'Joe', 'Bloggs')");
$dbh->exec("INSERT INTO salarychange (id, amount, changedate) VALUES (23, 50000, NOW())");
$dbh->commit();
} catch (
Exception $e) {
$dbh->rollBack();
echo
"Ошибка: " . $e->getMessage();
}

?>

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…; Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π·Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ слоТныС запросы для извлСчСния Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΎΠ·Π΄Π°ΡŽΡ‚ большС запросов Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ запросы; активная транзакция Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠΊΠ° ΠΈΠ΄Ρ‘Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ транзакциях содСрТит докумСнтация ΠΊ сСрвСру Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ….

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
4
hooby404 at gmail dot com ΒΆ
3 years ago
> You're not limited to making updates in a transaction; you can also issue complex 
> queries to extract data, and possibly use that information to build up more updates 
> and queries; while the transaction is active, you are guaranteed that no one else can 
> make changes while you are in the middle of your work. For further reading on 
> transactions, refer to the documentation provided by your database server. 

This only holds true if you specifically do "SELECT .... FOR UPDATE". 

Without the "FOR UPDATE" part, when two transactions run at the same time, the second transaction could change a value AFTER the first transaction read it, but BEFORE the first transaction used it for updates.

Without the "FOR UPDATE" part you are absolutely NOT GUARANTEED that no one else can make changes while you are in the middle of your work.
up
3
harl at gmail dot com ΒΆ
8 years ago
Some DBMSs allow DDL (table creation/alteration) within transactions, some do not. Asking "Does my DBMS allow DDL within transactions without forcing a commit?" gives the following example answers:

CUBRID: Yes
DB2 UDB: Yes
Firebird: Yes
Informix: Yes
MySQL: No
Oracle: No (although schema upgrades can be rolled out using "edition-based redefinition")
PostgreSQL: Yes
SQLite: Yes
SQL Server: Sometimes, depending on isolation level, type of command, etc.
Sybase: Yes
up
3
pasamio at gmail dot com ΒΆ
13 years ago
Typically data definition language clauses (DDL) will trigger the database engine to automatically commit:
http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html

Many other databases (e.g. Oracle) will implicitly commit before and after running DDL statements.
up
-1
toyu at hotmail dot com ΒΆ
3 months ago
Last insert ID will not be rollbacked (MySQL InnoDB)