MySQL 事务主要用于处理操作量大,复杂度高的数据。
·在MySQL中只有使用了Lnnodb数据库引擎的数据库或表才支持事务。
·事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
·事务用来管理insert,update,delete语句。
一般来收,事务是必须满足4个条件(ACID):Atomicity(原子性)、Consistency(稳定性)、lsolation(隔离性)、Durability(可靠性)
·事务的原子性:一组事务,要么成功;要么撤回。
·稳定性:有非法数据(外键约束之类),事务撤回。
·隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
·可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速的不可兼得,innodb_flush_log_at_trx_commit 选项决定什么时候把事务保存到日志里。
在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此要显式地开启一个事务必须使用命令BEGIN或START TRANSACTION,或者执行SET AUTOCOMMIT=0,用来禁止使用当前回话的自动提交。
事务控制语句:
·BEGIN或START TRANSACTION:显示地开启一个事务;
·COMMIT:也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的。
·ROLLBACK:也可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提到的修改。
·SAVEPOINT identifier:SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
·RELEASE SAVEPOINT identifier:删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
·ROLLBACK TO identifier:把事务回滚到标记点;
·SET TRANSACTION:用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事务处理主要有两种方法:
1.用BEGIN,ROLLBACK,COMMIT来实现
·BEGIN 开始一个事务
·ROLLBACK 事务回滚
·COMMIT 事务确认
2.直接用SET来改变MySQL的自动提交模式:
·SET AUTOCOMMIT=0 禁止自动提交
·SET AUTOCOMMIT=1 开启自动提交
实例
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql>
PHP使用事务实例
<?php
$dbhost = 'localhost:3306'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn, "set names utf8");
mysqli_select_db( $conn, 'RUNOOB' );
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn); // 开始事务定义
if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(8)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚
}
if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(9)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚
}
mysqli_commit($conn); //执行事务
mysqli_close($conn);
?>
参考:
https://www.yuque.com/docs/share/3fbdfffa-7d3a-4826-94d4-a4223f5759b1