Mysql 事务
事务是多个操作的集合。最为经典的例子就是银行转账操作,A向B转账分为两步,从A账户扣钱,往B账户打钱,这两个操作必须是统一的,要么一起成功要么一起失败,因此我们需要事务来对这个操作集合进行操作。
事务的特点 (ACID)
-
原子性 (Atomicity) :事务中的全部操作,要么全部完成 ,要么全部不做
-
一致性 (Consistency) :几个并行执行的事务,其执行结果必须与按某一顺序串行执行结果一致
-
隔离性 (Isolation) :数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
-
持久性 (Durability) :对于已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。修改数据的命令会触发事务,包括 INSERT、UPDATE、DELETE。
事务控制语句
-
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 COMMITTED、REPEATABLE READ和SERIALIZABLE。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET
AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
事务处理主要有两种方法:
- 用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN
开始一个事务ROLLBACK
事务回滚COMMIT
事务确认
- 直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0
禁止自动提交SET AUTOCOMMIT=1
开启自动提交
事务测试实例
创建测试表
//创建测试表,指定引擎为innodb
CREATE TABLE transaction_test( id int(1)) engine=innodb;
select * from transaction_test;
确认事务
显式开启事务进行测试
//显式地开启一个事务
BEGIN;
//插入数据
insert into transaction_test value(5);
//提交,事务确认
COMMIT;
//查询表中数据
select * from transaction_test;
结果如下:
回滚事务
显式开启事务进行测试
//显式地开启一个事务
BEGIN;
//插入数据
insert into transaction_test value(6);
//回滚,事务取消
rollback;
//查询表中数据
select * from transaction_test;
结果如下: