事务在我们做较为复杂的项目时都会用到,无论用什么数据库都会用到事务处理。MySQL 事务主要用于处理操作量大,复杂度高的数据。
事务的一些介绍:
事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。
- 支持连续SQL的集体成功或集体撤销。
- 事务是数据库的一个功能。
- MySQL需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
- InnoDB被称为事务安全型引擎。
事务的特性:
1. 原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务前后数据的完整性必须保持一致。
- 事务开始和结束时,外部数据一致
- 在整个事务过程中,操作是连续的
3. 隔离性(Isolation)
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
4. 持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
MySQL中事务的注意事项:
1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。
2. 事务不能被嵌套。
MySQL事务的执行要求:
1. 要求是事务支持的表类型
2. 执行一组相关的操作前要开启事务
3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。
事务开启
START TRANSACTION; 或者 BEGIN;
开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。
事务提交
COMMIT;
事务回滚
ROLLBACK;
演示执行事务
--开启事务
begin;
insert into stu(sname,sage,sgender,stuinfo,cid) values('peter',22,'male','hello i am peter',1),('alice',22,'female','hello i am alice',1),('sam',23,'male','hello i am sam',2);
--提交事务
commit;
演示事务回滚
--开启事务
begin;
insert into stu(sname,sage,sgender,stuinfo,cid) values('peter',22,'male','hello i am peter',1),('alice',22,'female','hello i am alice',1),('sam',23,'male','hello i am sam',2);
--回滚事务
rollback;
由于事务回滚了,所以在开启事务之后执行的语句都相当于撤回了,所以演示的时候查询回滚的数据会出错。
当然我们还可以设置一个事务回滚的标记点。
保存点
SAVEPOINT 保存点名称 -- 设置一个事务保存点
ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名称 -- 删除保存点
我们还可以设置自动提交事务。
InnoDB自动提交特性设置
SET autocommit = 0|1; 0表示关闭自动提交,1表示开启自动提交。
- 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
- 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)
事务的并发
事务的并发问题涉及以下几种情况
1.脏读
能够看到其他用户还没有提交的数据
2.不可重复度
两个用户发出相同的查询,却返回了不同的数据
3.幻读
事务的隔离级别
隔离级别 脏读 不可重复度 幻读 说明 read-uncommitted √ √ √ 一个事务可以读取另一个未提交事务的数据 read-committed × √ √ 一个事务要等待另一个事务提交后才能读取数据 repeatable-read × × √ 当开启读取数据时(事务已开启),不允许修改数据 serializable × × × 事务串行化执行,都可避免,但性能最低。不建议使用。
查看隔离级别
mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation |
+-----------------------+-----------------+
| REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.01 sec)设置隔离级别
set global transaction isolation level 隔离级别
set session transaction isolation level 隔离级别