事务是什么
在 MySQL 中,事务是一组原子性的 SQL 操作,这些操作要么全部成功执行,要么全部不执行。就好像是一个不可分割的工作单元,保证了数据的一致性和完整性。也就是说MySQL服务同样会被多个客户端同时访问(MySQL内部采用多线程架构),所以此时多个执行流同时访问MySQL数据库中的内容,为了保障数据一致性与完整性就有了事务的概念。所以事务就要满足以下特性:原子性、一致性、隔离性、持久性(ACID)。
事务版本支持
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。查看数据库引擎 show engines \G指令:
事务提交方式
- 手动提交
- 自动提交
查看事务提交方式:
设置提交方式:
SET AUTOCOMMIT = 0; // 关闭自动提交
SET AUTOCOMMIT = 1; // 打开自动提交
开启事务后,数据库暂时停止自动提交功能,将后续的操作视为一个事务单元。而对于事务是否自动提交的设置只会对单SQL语句起作用,表明单SQL语句是否被当作一个事务进行提交。所以当设置自动提交以后,单SQL语句进行数据的CURD操作时,都会自动将该操作视作一个事务自动提交到数据库当中,使得修改立即生效,从而达到持久化的目的。
事务启动与关闭
启动:
begin;/start transaction;
关闭:
commit;/rollback;
其中可以在启动事务执行中添加保存点 savepoint s1;然后回滚的时候可以rollback to s1;就直接回滚到保存点s1的位置,但此时并不会关闭事务。
事务的原子性与隔离性
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务隔离级别的认识
MySQL中的一个事物可能会有多条语句构成,所以在一个事务就会有三个阶段:执行前、执行中、执行后。而包保证事务得原子性就不运行事务执行中的过程被干扰,也就是用户层只能看到事务执行前和执行后的结果。而要保障事务的执行过程是原子性的就间接的有了隔离性特征,而对与不同的事务存在不同的干扰程度