- 论坛徽章:
- 0
|
请注意:把相关编码设定为 utf8,PHP 文件也存为 utf-8 编码,否则示例中中文乱码。
我表结构,注意表类型用的是 InnoDB。
- mysql> show create table test.i_t\G
- *************************** 1. row ***************************
- Table: i_t
- Create Table: CREATE TABLE `i_t` (
- `id` int(10) unsigned NOT NULL auto_increment,
- `age` int(10) unsigned default NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 1 row in set (0.00 sec)
复制代码
- <?php
- function html_header() {
- $content = <<<HTML
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <html>
- <head>
- <title>数据库事务处理示例</title>
- <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
- </head>
- <body>
- HTML;
- echo $content;
- }
- function html_footer() {
- $content = <<<HTML
- </body>
- </html>
- HTML;
- echo $content;
- }
- function print_result(&$result, $caption) {
- echo '<table width="500" border="1">';
- echo '<caption>' . $caption . '</caption>';
- echo '<tr height="22"><td>ID</td><td>AGE</td></tr>';
- $rows = mysql_num_rows($result);
- switch($rows) {
- case 0:
- echo '<tr><td colspan=\'2\'>无记录</td></tr>';
- break;
- default :
- for($i = 0; $i< $rows; $i++) {
- $row = mysql_fetch_array($result);
- echo '<tr><td>' . $row['id'] . '</td><td>' . $row['age'] . '</td></tr>';
- }
- break;
- }
- echo '</table>';
- echo '<br>';
- }
- ?>
- <?php
- html_header();
- /* 参数定义 */
- define('HOST', 'localhost');
- define('USER', '');
- define('PASSWD', '');
- define('DB', 'test');
- define('TB', 'i_t');
- /* 示例 SQL 语句组 */
- $SQL[] = 'INSERT INTO ' . TB . ' (age) VALUES (23)';
- $SQL[] = 'INSERT INTO ' . TB . ' (age) VALUES (30)';
- $SQL[] = 'INSERT INTO ' . TB . ' (age) VALUES (18)';
- /* 连接 MySQL 服务器 */
- $link_id = @ mysql_connect(HOST, USER, PASSWD) or exit(mysql_error());
- mysql_select_db(DB, $link_id) or exit(mysql_error());
- /*********************
- * 例1
- * 数据回卷的情形
- *********************/
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '例1,初始状态');
- /* 创建事务 */
- mysql_query('START TRANSACTION', $link_id) or exit(mysql_error());
- /* 提交 SQL */
- for($i = 0; $i < count($SQL); $i++) {
- mysql_query($SQL[$i], $link_id); // 假设无错误发生
- }
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '此状态仅在该事务中可见');
- /* 回卷 -- 也意味着中止此次事务 */
- mysql_query('ROLLBACK', $link_id) or exit(mysql_error());
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '人为回卷事务,数据表最终状态');
- /*********************
- * 例2
- * 数据被正式提交的情形
- *********************/
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '例2,初始状态');
- /* 创建事务 */
- mysql_query('START TRANSACTION', $link_id) or exit(mysql_error());
- /* 提交 SQL */
- for($i = 0; $i < count($SQL); $i++) {
- mysql_query($SQL[$i], $link_id);
- }
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '此状态仅在该事务中可见');
- /* 提交事务 */
- mysql_query('COMMIT', $link_id) or exit(mysql_error());
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '提交事务,数据表最终状态');
- /*********************
- * 例3
- * 如果 SQL 执行过程中有错误发生的情形(数据应该被回卷)
- *********************/
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '例3,初始状态');
- /* 创建事务 */
- mysql_query('START TRANSACTION', $link_id) or exit(mysql_error());
- /*
- * 提交 SQL
- * 人为添加一条错误的 SQL
- */
- $SQL[] = 'INSERT INTO ' . TB . ' (sex) VALUES (100)'; // 数据表中并无 sex 字段
- for($i = 0; $i < count($SQL); $i++) {
- if(! mysql_query($SQL[$i], $link_id)) {
- /*
- * 按理每次更新查询都应该进行判断,前两个例子都没做处理。
- * 若 SQL 执行出错,回卷本次事务操作。
- */
- $err_msg = mysql_error();
- mysql_query('ROLLBACK', $link_id) or exit(mysql_error());
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '错误:' . $err_msg . '。回卷事务,数据表最终状态');
- html_footer();
- exit();
- }
- }
- /*
- * 若上面执行无错误发生,则会运行到此。
- * 提交事务
- */
- mysql_query('COMMIT', $link_id) or exit(mysql_error());
- /* 查询当前数据表记录状态 */
- $result = mysql_query('SELECT id, age FROM ' . TB, $link_id);
- print_result($result, '提交事务,数据表最终状态');
- html_footer();
- ?>
复制代码
以上是事务的基础应用,更多关于事务特性的资料,要么看 MySQL 手册(主要在 InnoDB 手册),要么找本数据库系统理论方面的书籍去看。 |
|