目录
个人主页:东洛的克莱斯韦克-CSDN博客
什么是事务
事务是由一条或多条DML语句构成的。其中多条DML语句的执行必须有两种状体——符合预期的完成对记录的增删改查操作和不执行操作。
虽然DML语句的执行是有过程性的,但如果多条DML语句在MySQL服务的技术支持下,能表现出原子性,这一组DML就是事务,反过来说事务是具有原子性的——事务可以进行回滚,如果事务的操作异常中断,MySQL服务可以让数据进行回滚,从而保证事务操作的原子性。
事务对应的一组DML语句在上层业务逻辑中不能是毫无意义的。
MySQL服务可能会收到大量事务请求,事务与事务之间如果在访问同样的数据,在不加保护的情况下会引发并发问题,所以事务绝对不是简单的SQL语句的集合。
事务的属性
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中 间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个 事务从来没有执行过一样。 |
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完 全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工 作。 |
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务 并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交( Read uncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化 ( Serializable ) |
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 |
原子性是由回滚保证的。隔离性也有技术支持和相关策略。持久性就是数据的落盘(磁盘)行为。而一致性就是上述三者的体现,并没有具体技术的支持。
上面四个属性,可以简称为 ACID 。
原子性(Atomicity,或称不可分割性)
一致性(Consistency)
隔离性(Isolation,又称独立性)
持久性(Durability)。
事务的操作
查看数据库引擎
show engines \G
Engine -- 引擎名称 |
Support -- 默认引擎 |
Transactions -- 是否支持事务 |
Savepoints --是否支持事务保存点 |
事务提交
事务的提交方式常见的有两种: 自动提交 手动提交
查看事务提交方式
show variables like 'autocommit';
用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交
开始一个事务
start transaction;
begin;
begin操作会自动更改提交方式,不会受MySQL是否自动提交影响
提交事务
commit;
创建一个保存点
savepoint 保存点名
回滚到保存点
rollback to 保存点名
rollback; #直接rollback,回滚在最开始
结论
只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是 否设置set autocommit无关。
事务可以手动回滚,同时,当操作异常,MySQL会自动回滚 对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交。(select有特殊情况,因为 MySQL 有 MVCC )
注意事项
如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务 还没有提交)
如果一个事务被提交了(commit),则不可以回退(rollback)
可以选择回退到哪个保存点
InnoDB 支持事务, MyISAM 不支持事务
开始事务可以使 start transaction 或者 begin