事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。
- 支持连续SQL的集体成功或集体撤销。
- 事务是数据库在数据晚自习方面的一个功能。
- 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
- InnoDB被称为事务安全型引擎。
事务开启
START TRANSACTION;
或者 BEGIN;
开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。
事务提交
COMMIT;
事务回滚
ROLLBACK;
如果部分操作发生问题,映射到事务开启前。
事务的特性
- 原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 - 一致性(Consistency)
事务前后数据的完整性必须保持一致。
- 事务开始和结束时,外部数据一致
- 在整个事务过程中,操作是连续的 - 隔离性(Isolation)
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。 - 持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
关于事务之间的隔离性
事务隔离性存在隔离级别,理论上隔离级别包括4个:
- 第一级别: 读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。 - 第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到。
这种隔离级别解决了:脏读现象没有了。 - 第三级别:可重复读(repeatable read)
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象。 - 第四级别:序列化/串行化读
解决了所有问题。但存在效率低。事务需要排队。
注意
oracle 数据库默认的隔离级别是:读可提交。(第二级别)
mysql 数据库默认的隔离级别是:可重复读。(第三级别)
事务的实现
- 要求是事务支持的表类型
- 执行一组相关的操作前开启事务
- 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。
事务的原理
利用InnoDB的自动提交(autocommit)特性完成。
普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。
而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。
注意
- 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。
- 事务不能被嵌套
保存点
SAVEPOINT
保存点名称 – 设置一个事务保存点
ROLLBACK TO SAVEPOINT
保存点名称 – 回滚到保存点
RELEASE SAVEPOINT
保存点名称 – 删除保存点
InnoDB自动提交特性设置
SET autocommit = 0|1;
0表示关闭自动提交,1表示开启自动提交。
- 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
- 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)