# PHP PDO 事务与自动提交
现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的。
事务支持四大特性(ACID):
* 原子性(Atomicity)
* 一致性(Consistency)
* 隔离性(Isolation)
* 持久性(Durability)
通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。
事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。
事务通常是通过把一批更改"积蓄"起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。
换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。
不幸的是,并非每种数据库都支持事务,因此当第一次打开连接时,PDO 需要在所谓的"自动提交"模式下运行。
自动提交模式意味着,如果数据库支持,运行的每个查询都有它自己的隐式事务,如果数据库不支持事务,则没有。
如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。
一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。
**注意:** PDO 仅在驱动层检查是否具有事务处理能力。如果某些运行时条件意味着事务不可用,且数据库服务接受请求去启动一个事务,PDO::beginTransaction() 将仍然返回 TRUE 而且没有错误。 试着在 MySQL 数据库的 MyISAM 数据表中使用事务就是一个很好的例子。
当脚本结束或连接即将被关闭时,如果尚有一个未完成的事务,那么 PDO 将自动回滚该事务。这种安全措施有助于在脚本意外终止时避免出现不一致的情况——如果没有显式地提交事务,那么假设是某个地方出错了,所以执行回滚来保证数据安全。
**注意:** 只有通过 PDO::beginTransaction() 启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚。
在事务中执行批处理:
在下面例子中,假设为新员工创建一组条目,分配一个为23的ID。除了登记此人的基本数据之外,还需要记录他的工资。
两个更新分别完成起来很简单,但通过封闭在 PDO::beginTransaction() 和PDO::commit() 调用中,可以保证在更改完成之前,其他人无法看到这些更改。
如果发生了错误,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();
}
?>
```
并不局限于在事务中更改,也可以发出复杂的查询来提取数据,还可以使用那些信息来构建更多的更改和查询;当事务激活时,可以保证其他人在操作进行当中无法作出更改。
- PHP Array 函数
- PHP array()
- PHP array_change_key_case() 函数
- PHP array_chunk() 函数
- PHP array_combine() 函数
- PHP array_count_values() 函数
- PHP array_diff() 函数
- PHP array_diff_assoc() 函数
- PHP array_diff_key() 函数
- PHP array_diff_uassoc() 函数
- PHP array_diff_ukey() 函数
- PHP array_fill() 函数
- PHP array_filter() 函数
- PHP array_flip() 函数
- PHP array_intersect() 函数
- PHP array_intersect_assoc() 函数
- PHP array_intersect_key() 函数
- PHP array_intersect_uassoc() 函数
- PHP array_intersect_ukey() 函数
- PHP array_key_exists() 函数
- PHP array_keys() 函数
- PHP array_map() 函数
- PHP array_merge() 函数
- PHP array_merge_recursive() 函数
- PHP array_multisort() 函数
- PHP array_pad() 函数
- PHP array_pop() 函数
- PHP array_product() 函数
- PHP array_push() 函数
- PHP array_rand() 函数
- PHP array_reduce() 函数
- PHP array_reverse() 函数
- PHP array_search() 函数
- PHP array_shift() 函数
- PHP array_slice() 函数
- PHP array_splice() 函数
- PHP array_sum() 函数
- PHP array_udiff() 函数
- PHP array_udiff_assoc() 函数
- PHP array_udiff_uassoc() 函数
- PHP array_uintersect() 函数
- PHP array_uintersect_assoc() 函数
- PHP array_uintersect_uassoc() 函数
- PHP array_unique() 函数
- PHP array_unshift() 函数
- PHP array_values() 函数
- PHP array_walk() 函数
- PHP array_walk_recursive() 函数
- PHP arsort() 函数
- PHP asort() 函数
- PHP compact() 函数
- PHP count() 函数
- PHP current() 函数
- PHP each() 函数
- PHP extract() 函数
- PHP in_array() 函数
- PHP key() 函数
- PHP krsort() 函数
- PHP ksort() 函数
- PHP list() 函数
- PHP natcasesort() 函数
- PHP natsort() 函数
- PHP next() 函数
- PHP pos() 函数
- PHP prev() 函数
- PHP range() 函数
- PHP reset() 函数
- PHP rsort() 函数
- PHP shuffle() 函数
- PHP sizeof() 函数
- PHP sort() 函数
- PHP uasort() 函数
- PHP uksort() 函数
- PHP usort() 函数
- PHP Calendar 函数
- PHP cal_days_in_month() 函数
- PHP cal_from_jd() 函数
- PHP cal_info() 函数
- PHP cal_to_jd() 函数
- PHP easter_date() 函数
- PHP easter_days() 函数
- PHP FrenchToJD() 函数
- PHP GregorianToJD() 函数
- PHP JDDayOfWeek() 函数
- PHP JDMonthName() 函数
- PHP JDToFrench() 函数
- PHP JDToGregorian() 函数
- PHP JDToJewish() 函数
- PHP JDToJulian() 函数
- PHP JDToUnix() 函数
- PHP JewishToJD() 函数
- PHP JulianToJD() 函数
- PHP UnixToJD() 函数
- PHP cURL 函数
- PHP curl_close函数
- PHP curl_copy_handle函数
- PHP curl_errno函数
- PHP curl_error函数
- PHP curl_escape函数
- PHP curl_exec函数
- PHP curl_file_create函数
- PHP curl_getinfo函数
- PHP curl_init函数
- PHP curl_multi_add_handle函数
- PHP curl_multi_close函数
- PHP curl_multi_exec函数
- PHP curl_multi_getcontent函数
- PHP curl_multi_info_read函数
- PHP curl_multi_init函数
- PHP curl_multi_remove_handle函数
- PHP curl_multi_select函数
- PHP curl_multi_setopt函数
- PHP curl_multi_strerror函数
- PHP curl_pause函数
- PHP curl_reset函数
- PHP curl_setopt_array函数
- PHP curl_setopt函数
- PHP curl_share_close函数
- PHP curl_share_init函数
- PHP curl_share_setopt函数
- PHP curl_strerror函数
- PHP curl_unescape函数
- PHP curl_version函数
- PHP Date / Time 函数
- PHP checkdate() 函数
- PHP date_default_timezone_get() 函数
- PHP date_default_timezone_set() 函数
- PHP date_sunrise() 函数
- PHP date_sunset() 函数
- PHP date() 函数
- PHP getdate() 函数
- PHP gettimeofday() 函数
- PHP gmdate() 函数
- PHP gmmktime() 函数
- PHP gmstrftime() 函数
- PHP idate() 函数
- PHP localtime() 函数
- PHP microtime() 函数
- PHP mktime() 函数
- PHP strftime() 函数
- PHP strptime() 函数
- PHP strtotime() 函数
- PHP time() 函数
- PHP Directory 函数
- PHP chdir() 函数
- PHP chroot() 函数
- PHP dir() 函数
- PHP closedir() 函数
- PHP getcwd() 函数
- PHP opendir() 函数
- PHP readdir() 函数
- PHP rewinddir() 函数
- PHP scandir() 函数
- PHP Error 和 Logging 函数
- PHP debug_backtrace() 函数
- PHP debug_print_backtrace() 函数
- PHP error_get_last() 函数
- PHP error_log() 函数
- PHP error_reporting() 函数
- PHP restore_error_handler() 函数
- PHP restore_exception_handler() 函数
- PHP set_error_handler() 函数
- PHP set_exception_handler() 函数
- PHP trigger_error() 函数
- PHP Filesystem 函数
- PHP basename() 函数
- PHP chgrp() 函数
- PHP chmod() 函数
- PHP chown() 函数
- PHP clearstatcache() 函数
- PHP copy() 函数
- PHP dirname() 函数
- PHP disk_free_space() 函数
- PHP disk_total_space() 函数
- PHP diskfreespace() 函数
- PHP fclose() 函数
- PHP feof() 函数
- PHP fflush() 函数
- PHP fgetc() 函数
- PHP fgetcsv() 函数
- PHP fgets() 函数
- PHP fgetss() 函数
- PHP file() 函数
- PHP file_exists() 函数
- PHP file_get_contents() 函数
- PHP file_put_contents() 函数
- PHP fileatime() 函数
- PHP filectime() 函数
- PHP filegroup() 函数
- PHP fileinode() 函数
- PHP filemtime() 函数
- PHP fileowner() 函数
- PHP fileperms() 函数
- PHP filesize() 函数
- PHP filetype() 函数
- PHP flock() 函数
- PHP fnmatch() 函数
- PHP fopen() 函数
- PHP fpassthru() 函数
- PHP fputcsv() 函数
- PHP fputs() 函数
- PHP fread() 函数
- PHP fscanf() 函数
- PHP fseek() 函数
- PHP fstat() 函数
- PHP ftell() 函数
- PHP ftruncate() 函数
- PHP fwrite() 函数
- PHP glob() 函数
- PHP is_dir() 函数
- PHP is_executable() 函数
- PHP is_file() 函数
- PHP is_link() 函数
- PHP is_readable() 函数
- PHP is_uploaded_file() 函数
- PHP is_writable() 函数
- PHP is_writeable() 函数
- PHP link() 函数
- PHP linkinfo() 函数
- PHP lstat() 函数
- PHP mkdir() 函数
- PHP move_uploaded_file() 函数
- PHP parse_ini_file() 函数
- PHP pathinfo() 函数
- PHP pclose() 函数
- PHP popen() 函数
- PHP readfile() 函数
- PHP readlink() 函数
- PHP realpath() 函数
- PHP rename() 函数
- PHP rewind() 函数
- PHP rmdir() 函数
- PHP set_file_buffer() 函数
- PHP stat() 函数
- PHP symlink() 函数
- PHP tempnam() 函数
- PHP tmpfile() 函数
- PHP touch() 函数
- PHP umask() 函数
- PHP unlink() 函数
- PHP Filter 函数
- PHP filter_has_var() 函数
- PHP filter_id() 函数
- PHP filter_input() 函数
- PHP filter_input_array() 函数
- PHP filter_list() 函数
- PHP filter_var_array() 函数
- PHP filter_var() 函数
- PHP FTP 函数
- PHP ftp_alloc() 函数
- PHP ftp_cdup() 函数
- PHP ftp_chdir() 函数
- PHP ftp_chmod() 函数
- PHP ftp_close() 函数
- PHP ftp_connect() 函数
- PHP ftp_delete() 函数
- PHP ftp_exec() 函数
- PHP ftp_fget() 函数
- PHP ftp_fput() 函数
- PHP ftp_get_option() 函数
- PHP ftp_get() 函数
- PHP ftp_login() 函数
- PHP ftp_mdtm() 函数
- PHP ftp_mkdir() 函数
- PHP ftp_nb_continue() 函数
- PHP ftp_nb_fget() 函数
- PHP ftp_nb_put() 函数
- PHP ftp_nlist() 函数
- PHP ftp_pasv() 函数
- PHP ftp_put() 函数
- PHP ftp_pwd() 函数
- PHP ftp_quit() 函数
- PHP ftp_raw() 函数
- PHP ftp_rawlist() 函数
- PHP ftp_rename() 函数
- PHP ftp_rmdir() 函数
- PHP ftp_set_option() 函数
- PHP ftp_site() 函数
- PHP ftp_size() 函数
- PHP ftp_ssl_connect() 函数
- PHP ftp_systype() 函数
- PHP HTTP 函数
- PHP header() 函数
- PHP headers_list() 函数
- PHP headers_sent() 函数
- PHP setcookie() 函数
- PHP setrawcookie() 函数
- PHP libxml 函数
- PHP libxml_clear_errors() 函数
- PHP libxml_get_errors() 函数
- PHP libxml_get_last_error() 函数
- PHP libxml_use_internal_errors() 函数
- PHP Mail 函数
- PHP mail() 函数
- PHP Math 函数
- PHP abs() 函数
- PHP acos() 函数
- PHP acosh() 函数
- PHP asin() 函数
- PHP asinh() 函数
- PHP atan() 和 atan2() 函数
- PHP atanh() 函数
- PHP base_convert() 函数
- PHP bindec() 函数
- PHP ceil() 函数
- PHP cos() 函数
- PHP cosh() 函数
- PHP decbin() 函数
- PHP dechex() 函数
- PHP decoct() 函数
- PHP deg2rad() 函数
- PHP exp() 函数
- PHP expm1() 函数
- PHP floor() 函数
- PHP fmod() 函数
- PHP hexdec() 函数
- PHP hypot() 函数
- PHP is_finite() 函数
- PHP is_infinite() 函数
- PHP is_nan() 函数
- PHP lcg_value() 函数
- PHP log() 函数
- PHP log10() 函数
- PHP log1p() 函数
- PHP max() 函数
- PHP min() 函数
- PHP mt_getrandmax() 函数
- PHP mt_rand() 函数
- PHP mt_srand() 函数
- PHP octdec() 函数
- PHP pi() 函数
- PHP pow() 函数
- PHP rad2deg() 函数
- PHP rand() 函数
- PHP round() 函数
- PHP sin() 函数
- PHP sinh() 函数
- PHP sqrt() 函数
- PHP srand() 函数
- PHP tan() 函数
- PHP tanh() 函数
- PHP 5 MySQLi 函数
- PHP mysqli_affected_rows() 函数
- PHP mysqli_autocommit() 函数
- PHP mysqli_change_user() 函数
- PHP mysqli_character_set_name() 函数
- PHP mysqli_close() 函数
- PHP mysqli_commit() 函数
- PHP mysqli_connect_errno() 函数
- PHP mysqli_connect_error() 函数
- PHP mysqli_connect() 函数
- PHP mysqli_data_seek() 函数
- PHP mysqli_debug() 函数
- PHP mysqli_dump_debug_info() 函数
- PHP mysqli_errno() 函数
- PHP mysqli_error_list() 函数
- PHP mysqli_error() 函数
- PHP mysqli_fetch_all() 函数
- PHP mysqli_fetch_array() 函数
- PHP mysqli_fetch_assoc() 函数
- PHP mysqli_fetch_field_direct() 函数
- PHP mysqli_fetch_field() 函数
- PHP mysqli_fetch_fields() 函数
- PHP mysqli_fetch_lengths() 函数
- PHP mysqli_fetch_object() 函数
- PHP mysqli_fetch_row() 函数
- PHP mysqli_field_count() 函数
- PHP mysqli_field_seek() 函数
- PHP mysqli_field_tell() 函数
- PHP mysqli_free_result() 函数
- PHP mysqli_get_charset() 函数
- PHP mysqli_get_client_info() 函数
- PHP mysqli_get_client_stats() 函数
- PHP mysqli_get_client_version() 函数
- PHP mysqli_get_connection_stats() 函数
- PHP mysqli_get_connection_stats() 函数
- PHP mysqli_get_host_info() 函数
- PHP mysqli_get_proto_info() 函数
- PHP mysqli_get_server_info() 函数
- PHP mysqli_get_server_version() 函数
- PHP mysqli_info() 函数
- PHP mysqli_init() 函数
- PHP mysqli_insert_id() 函数
- PHP mysqli_kill() 函数
- PHP mysqli_more_results() 函数
- PHP mysqli_multi_query() 函数
- PHP mysqli_next_result() 函数
- PHP mysqli_num_fields() 函数
- PHP mysqli_num_rows() 函数
- PHP mysqli_options() 函数
- PHP mysqli_ping() 函数
- PHP mysqli_query() 函数
- PHP mysqli_real_connect() 函数
- PHP mysqli_real_escape_string() 函数
- PHP mysqli_refresh() 函数
- PHP mysqli_rollback() 函数
- PHP mysqli_select_db() 函数
- PHP mysqli_set_charset() 函数
- PHP mysqli_sqlstate() 函数
- PHP mysqli_ssl_set() 函数
- PHP mysqli_stat() 函数
- PHP mysqli_stmt_init() 函数
- PHP mysqli_thread_id() 函数
- PHP mysqli_thread_safe() 函数
- PHP PDO
- PHP PDO预定义常量
- PHP PDO连接
- PHP PDO 事务与自动提交
- PHP PDO 预处理语句与存储过程
- PHP PDO 错误与错误处理
- PHP PDO 大对象 (LOBs)
- PDO::beginTransaction
- PDO::commit
- PDO::__construct
- PDO::errorCode
- PDO::errorInfo
- PDO::exec
- PDO::getAttribute
- PDO::getAvailableDrivers
- PDO::inTransaction
- PDO::lastInsertId
- PDO::prepare
- PDO::query
- PDO::quote
- PDO::rollBack
- PDO::setAttribute
- PDOStatement::bindColumn
- PDOStatement::bindParam
- PDOStatement::bindValue
- PDOStatement::closeCursor
- PDOStatement::columnCount
- PDOStatement::debugDumpParams
- PDOStatement::errorCode
- PDOStatement::errorInfo
- PDOStatement::execute
- PDOStatement::fetch
- PDOStatement::fetchAll
- PDOStatement::fetchColumn
- PDOStatement::fetchObject
- PDOStatement::getAttribute
- PDOStatement::getColumnMeta
- PDOStatement::nextRowset
- PDOStatement::rowCount
- PDOStatement::setAttribute
- PDOStatement::setFetchMode
- PHP SimpleXML 函数
- PHP __construct() 函数
- PHP addAttribute() 函数
- PHP addChild() 函数
- PHP asXML() 函数
- PHP attributes() 函数
- PHP children() 函数
- PHP getDocNamespaces() 函数
- PHP getName() 函数
- PHP getNamespace() 函数
- PHP registerXPathNamespace() 函数
- PHP simplexml_import_dom() 函数
- PHP simplexml_load_file() 函数
- PHP simplexml_load_string() 函数
- PHP xpath() 函数
- PHP String 函数
- PHP addcslashes() 函数
- PHP addslashes() 函数
- PHP bin2hex() 函数
- PHP chop() 函数
- PHP chr() 函数
- PHP chunk_split() 函数
- PHP convert_cyr_string() 函数
- PHP convert_uudecode() 函数
- PHP convert_uuencode() 函数
- PHP count_chars() 函数
- PHP crc32() 函数
- PHP crypt() 函数
- PHP echo() 函数
- PHP explode() 函数
- PHP fprintf() 函数
- PHP get_html_translation_table() 函数
- PHP hebrev() 函数
- PHP hebrevc() 函数
- PHP html_entity_decode() 函数
- PHP htmlentities() 函数
- PHP htmlspecialchars_decode() 函数
- PHP htmlspecialchars() 函数
- PHP implode() 函数
- PHP join() 函数
- PHP levenshtein() 函数
- PHP localeconv() 函数
- PHP ltrim() 函数
- PHP md5() 函数
- PHP md5_file() 函数
- PHP money_format() 函数
- PHP nl_langinfo() 函数
- PHP nl2br() 函数
- PHP number_format() 函数
- PHP ord() 函数
- PHP parse_str() 函数
- PHP print() 函数
- PHP printf() 函数
- PHP quoted_printable_decode() 函数
- PHP quotemeta() 函数
- PHP rtrim() 函数
- PHP setlocale() 函数
- PHP sha1() 函数
- PHP sha1_file() 函数
- PHP similar_text() 函数
- PHP soundex() 函数
- PHP sprintf() 函数
- PHP sscanf() 函数
- PHP str_ireplace() 函数
- PHP str_pad() 函数
- PHP str_repeat() 函数
- PHP str_replace() 函数
- PHP str_rot13() 函数
- PHP str_shuffle() 函数
- PHP str_split() 函数
- PHP str_word_count() 函数
- PHP strcasecmp() 函数
- PHP strchr() 函数
- PHP strcmp() 函数
- PHP strcoll() 函数
- PHP strcspn() 函数
- PHP strip_tags() 函数
- PHP stripcslashes() 函数
- PHP stripslashes() 函数
- PHP stripos() 函数
- PHP stristr() 函数
- PHP strlen() 函数
- PHP strnatcasecmp() 函数
- PHP strnatcmp() 函数
- PHP strncasecmp() 函数
- PHP strncmp() 函数
- PHP strpbrk() 函数
- PHP strpos() 函数
- PHP strrchr() 函数
- PHP strrev() 函数
- PHP strripos() 函数
- PHP strrpos() 函数
- PHP strspn() 函数
- PHP strstr() 函数
- PHP strtok() 函数
- PHP strtolower() 函数
- PHP strtoupper() 函数
- PHP strtr() 函数
- PHP substr() 函数
- PHP substr_compare() 函数
- PHP substr_count() 函数
- PHP substr_replace() 函数
- PHP trim() 函数
- PHP ucfirst() 函数
- PHP ucwords() 函数
- PHP vfprintf() 函数
- PHP vprintf() 函数
- PHP vsprintf() 函数
- PHP wordwrap() 函数
- PHP XML Parser 函数
- PHP utf8_decode() 函数
- PHP utf8_encode() 函数
- PHP xml_error_string() 函数
- PHP xml_get_current_byte_index() 函数
- PHP xml_get_current_line_number() 函数
- PHP xml_get_error_code() 函数
- PHP xml_parse() 函数
- PHP xml_parse_into_struct() 函数
- PHP xml_parser_create_ns() 函数
- PHP xml_parser_create() 函数
- PHP xml_parser_free() 函数
- PHP xml_parser_get_option() 函数
- PHP xml_parser_set_option() 函数
- PHP xml_set_character_data_handler() 函数
- PHP xml_set_default_handler() 函数
- PHP xml_set_element_handler() 函数
- PHP xml_set_external_entity_ref_handler() 函数
- PHP xml_set_notation_decl_handler() 函数
- PHP xml_set_object() 函数
- PHP xml_set_processing_instruction_handler() 函数
- PHP xml_set_unparsed_entity_decl_handler() 函数
- PHP Zip File 函数
- PHP zip_close() 函数
- PHP zip_entry_close() 函数
- PHP zip_entry_compressedsize() 函数
- PHP zip_entry_compressionmethod() 函数
- PHP zip_entry_filesize() 函数
- PHP zip_entry_name() 函数
- PHP zip_entry_open() 函数
- PHP zip_entry_read() 函数
- PHP zip_open() 函数
- PHP zip_read() 函数
- PHP 杂项函数
- PHP connection_aborted() 函数
- PHP connection_status() 函数
- PHP constant() 函数
- PHP define() 函数
- PHP defined() 函数
- PHP die() 函数
- PHP eval() 函数
- PHP exit() 函数
- PHP get_browser() 函数
- PHP highlight_file() 函数
- PHP highlight_string() 函数
- PHP ignore_user_abort() 函数
- PHP pack() 函数
- PHP strip_whitespace() 函数
- PHP show_source() 函数
- PHP sleep() 函数
- PHP time_nanosleep() 函数
- PHP time_sleep_until() 函数
- PHP uniqid() 函数
- PHP unpack() 函数
- PHP usleep() 函数
- PHP 5 时区
- 免责声明