Сделките с MySQL и Oracle

Транзакция - един от основните понятия, които разграничават базата данни от редовното файловата система и от един прост набор от таблици.

Транзакция - група от последователно изпълнява SQL изявления, които са или да бъдат извършени всички или не трябва да се правят на всеки от тях. Основната цел на сделката - да се гарантира целостта на данните, когато множество SQL-се изпълнява оператор независими един от друг информационни промени. Класически пример цитира, най-вероятно, във всички учебници базите данни - прехвърляне на пари от една сметка в друга:

UPDATE сметки SET AccSum = AccSum - 1000 КЪДЕТО AccNumber = 12345;
UPDATE сметки SET AccSum = AccSum + 1000 КЪДЕТО AccNumber = 67890;

Какво се случва, ако първият конструкцията се изпълнява, а вторият по някаква причина - не (недостатъчност сървър, грешен номер на сметка, преливник. - Грешка може да бъде малък, ако има такива)? Пари от една сметка отписва, а другата не.

механизъм сделка е именно възможността за правилно да се измъкнем от подобни ситуации. Чрез комбиниране на тези две изявление UPDATE в една сделка, ние ще гарантира прилагането на (или неуспеха) и двете от тях като цяло.

SQL-92 стандарт предвижда, че сделка в текущата сесия започва имплицитно, когато първият от SQL-декларации, които променят данните и завършени може да бъде изрично - COMMIT оператори [РАБОТНИ] или ROLLBACK (COMMIT [РАБОТА] потвърждава сделката и записва промените, ROLLBACK ролки обратно на сделката и се връща на данните в базата данни за състоянието, в което те са били преди началото на операцията), или косвено - в края на текущата сесия или повреда в системата. За съжаление, на стандарта SQL-92 не определя какво трябва да се направи по подразбиране в края на текущата сесия - сделката за потвърждение или намаление на цените, както и в различни бази данни (и дори понякога в различни клиенти за една и съща СУБД) се осъществява по различен начин. Поради това, действието по подразбиране е по-добре да не се разчита винаги вършат / ROLLBACK ясно.

Сделки с Oracle

Говорейки за механизма на сделки с Oracle, един вероятно ще бъде ограничено до едно изречение: "Сделките в Oracle почти напълно отговарят на стандарта SQL-92 - виж предходната точка". Да добавя към това, може би, само на две точки.

Само за четене сделки

Тези, обаче, също осигурява стандартен SQL-92. Ако сделката е обявена като "само за четене" (SET СДЕЛКИ само за четене) - това ще гарантира, че всички Избор, направен като част от тази сделка, ще даде показания в същото състояние, в което са били в началото на сделката. В рамките на операцията "само за четене" забранена всяка промяна на данните. В този случай, сделката е "само за четене" места не заключване на данните и не пречи на промяна на тези данни на други сесии.

автономни транзакции

Въведена в механизъм Oracle за автономни операции за създаване на нова операция в рамките на ток. Потвърждение / отмените промените, направени в рамките на автономната сделката се извършва независимо от сделката родител. Автономните сделки могат да бъдат вложени, максималното ниво на вмъкване се определя настройките на сървъра.

Сделките в MySQL

Но в MySQL със сделка е много по-сложно.

Нека започнем с факта, че в MySQL, има няколко вида таблици: ИПМ, грамада MyISAM, InnoDB, BDB. От тези сделки може да поддържа само последните две: InnoDB и ББР. По този начин "роден", за да MySQL са таблици MyISAM тип, които не поддържат сделката. И за да бъде в състояние да създаде за сделка, видове трапезни InnoDB и BDB и работа с тях, MySQL сървър трябва да бъде конфигуриран правилно (което не винаги е в силата на разработчиците на приложения, особено на уеб приложения).

По подразбиране, MySQL работи в режим autocommit. Това означава, че резултатите от всеки тип SQL изявление, което променя данните ще бъдат незабавно фиксирани (записва на диск).

Режим autocommit да деактивирате SET AUTOCOMMIT = 0 команда. Ако забраните autocommit режим, всяка сделка трябва да е ясно пълен COMMIT / ROLLBACK отчети.

За еднократно преминаване в режим на транзакции можете да използвате START сделката (в MySQL от версия 4.0.11) или ЗАПОЧНЕТЕ [РАБОТА]:

СТАРТ сделка;
UPDATE сметки SET AccSum = AccSum - 1000 КЪДЕТО AccNumber = 12345;
UPDATE сметки SET AccSum = AccSum + 1000 КЪДЕТО AccNumber = 67890;
COMMIT;

Обърнете внимание на сериозен недостатък. Ако сделката включва маса от различни видове (за транзакции и несъдържащи транзакции), а след това те самите ще се държат по съвсем различен начин. Промени в несъдържащи транзакции маси ще бъдат направени незабавно, независимо от режима на инвалиди autocommit, и ще бъде невъзможно да се връщам използвате оператора ROLLBACK! И ако все още се прави ROLLBACK - промени, направени в таблицата сделка, намаление на цените и несъдържащи транзакции - ще остане. За това, което може да доведе - Мисля, че не е необходимо да се дъвче.