PHP.mk документација

Конекции и управување со конекции

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

pdo.transactions.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека pdo.transactions.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Конекции и управување со конекции

Референца за `pdo.transactions.php` со подобрена типографија и навигација.

pdo.transactions.php

Конекции и управување со конекции

Now that you're connected via PDO, you must understand how PDO manages transactions before you start issuing queries. If you've never encountered transactions before, they offer 4 major features: Atomicity, Consistency, Isolation and Durability (ACID). In layman's terms, any work carried out in a transaction, even if it is carried out in stages, is guaranteed to be applied to the database safely, and without interference from other connections, when it is committed. Transactional work can also be automatically undone at your request (provided you haven't already committed it), which makes error handling in your scripts easier.

Сега кога сте поврзани преку PDO, мора да разберете како PDO управува со трансакциите пред да започнете со прашања. Ако никогаш не сте се сретнале со трансакции, тие нудат 4 главни карактеристики: Атомичност, Конзистентност, Изолација и Трајност (ACID). Со едноставни зборови, секоја работа извршена во трансакција, дури и ако се извршува во фази, е загарантирано дека ќе биде безбедно применета на базата на податоци, и без мешање од други врски, кога ќе биде потврдена. Трансакциската работа исто така може автоматски да се поништи на ваше барање (под услов да не сте ја потврдиле веќе), што го олеснува ракувањето со грешки во вашите скрипти.

Трансакциите обично се имплементираат со „зачувување“ на вашата серија промени за да се применат одеднаш; ова има пријатен страничен ефект на драстично подобрување на ефикасноста на тие ажурирања. Со други зборови, трансакциите можат да ги направат вашите скрипти побрзи и потенцијално поотпорни (сè уште треба да ги користите правилно за да ја искористите таа придобивка). За жал, не секоја база на податоци поддржува трансакции, така што PDO мора да работи во таканаречен режим на „автоматско потврдување“ кога првпат ќе ја отворите врската. Режимот на автоматско потврдување значи дека секое прашање што го извршувате има своја имплицитна трансакција, ако базата на податоци го поддржува тоа, или без трансакција ако базата на податоци не поддржува трансакции. Ако ви треба трансакција, мора да го користите методот PDO::beginTransaction() за да започнете една. Ако основната драјвер не поддржува трансакции, ќе биде фрлен PDOException (без оглед на вашите поставки за ракување со грешки: ова е секогаш сериозна состојба на грешка). Откако сте во трансакција, можете да користите or PDO::commit() PDO::rollBack()

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

за да ја завршите, во зависност од успехот на кодот што го извршувате за време на трансакцијата. За жал, не секоја база на податоци поддржува трансакции, така што PDO мора да работи во таканаречен режим на „автоматско потврдување“ кога првпат ќе ја отворите врската. Режимот на автоматско потврдување значи дека секое прашање што го извршувате има своја имплицитна трансакција, ако базата на податоци го поддржува тоа, или без трансакција ако базата на податоци не поддржува трансакции. Ако ви треба трансакција, мора да го користите методот PDO проверува само за можности за трансакции на ниво на драјвер. Ако одредени услови во време на извршување значат дека трансакциите се недостапни, true сè уште ќе врати

без грешка ако серверот на базата на податоци ја прифати барањето за започнување трансакција.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Пример за ова би било обидот да се користат трансакции на MyISAM табели на MySQL база на податоци. Имплицитни потврди со DDL изрази: COMMIT Некои бази на податоци автоматски издаваат имплицитна DROP TABLE or CREATE TABLEкога се извршува израз за дефиниција на базата на податоци (DDL), како што е за време на трансакција. Ова значи дека сите претходни промени направени во истата трансакција ќе бидат автоматски потврдени

MySQL and Oracle и не може да се поништат.

се примерни бази на податоци кои покажуваат такво однесување.

<?php
$pdo
->beginTransaction();
$pdo->exec("INSERT INTO users (name) VALUES ('Rasmus')");
$pdo->exec("CREATE TABLE test (id INT PRIMARY KEY)"); // Implicit COMMIT occurs here
$pdo->rollBack(); // This will NOT undo the INSERT/CREATE for MySQL or Oracle
?>

Најдобра пракса: Избегнувајте извршување на DDL изјави во трансакции ако користите бази на податоци што го наметнуваат ова однесување. Ако е потребно, одделете ги DDL операциите од трансакциската логика.

Кога скриптата ќе заврши или кога врската ќе се затвори, ако имате активна трансакција, PDO автоматски ќе ја врати назад. Ова е мерка на безбедност за да се избегне недоследност во случаи кога скриптата неочекувано завршува - ако не сте ја потврдиле трансакцијата експлицитно, тогаш се претпоставува дека нешто тргнало наопаку, па враќањето се врши за безбедност на вашите податоци.

Пример #2 Извршување на серија во трансакција

Во следниот примерок, да претпоставиме дека креираме сет на записи за нов вработен, на кој му е доделен број на идентификација 23. Покрај внесувањето основни податоци за таа личност, треба да ја запишеме и неговата плата. Доста е едноставно да се направат две одделни ажурирања, но со нивно вклучување во рамките на За жал, не секоја база на податоци поддржува трансакции, така што PDO мора да работи во таканаречен режим на „автоматско потврдување“ кога првпат ќе ја отворите врската. Режимот на автоматско потврдување значи дека секое прашање што го извршувате има своја имплицитна трансакција, ако базата на податоци го поддржува тоа, или без трансакција ако базата на податоци не поддржува трансакции. Ако ви треба трансакција, мора да го користите методот and за да започнете една. Ако основната драјвер не поддржува трансакции, ќе биде фрлен PDOException (без оглед на вашите поставки за ракување со грешки: ова е секогаш сериозна состојба на грешка). Откако сте во трансакција, можете да користите повици, гарантираме дека никој друг нема да може да ги види тие промени додека не завршат. Ако нешто тргне наопаку, блокот catch ги враќа сите промени направени од почетокот на трансакцијата, а потоа печати порака за грешка.

<?php
try {
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
array(
PDO::ATTR_PERSISTENT => true));
echo
"Connected\n";
} catch (
Exception $e) {
die(
"Unable to connect: " . $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
"Failed: " . $e->getMessage();
}
?>

Не сте ограничени само на правење ажурирања во трансакција; можете исто така да издавате сложени барања за извлекување податоци, и можно е да ги користите тие информации за да изградите повеќе ажурирања и барања; додека трансакцијата е активна, ви е загарантирано дека никој друг не може да направи промени додека сте во средината на вашата работа. За понатамошно читање за трансакциите, погледнете ја документацијата обезбедена од вашиот сервер за бази на податоци.

Белешки од корисници 4 белешки

hooby404 на gmail точка com
3 години пред
> 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.
harl на gmail точка ком
пред 8 години
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
pasamio на gmail точка com
пред 13 години
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.
toyu на hotmail точка com
21 days ago
Last insert ID will not be rollbacked (MySQL InnoDB)
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.