目录
1.初识事务
事务是一组DML语句组成,这些语句在逻辑上存在相关性。这一组DML语句是一个整体,要么全部成功,要么全部失败。
事务还规定不同的客户端看到的数据是不同的。
-
1.1 引入
- 火车站卖票
- 当A买了编号为1的车票,而数据库还没有更新的时候。B仍能看到1号车票的存在,B也买了这张车票。这就出现了一张票多次卖的情况。
- 火车站卖票
2. 事务的基本操作
-
2.1 基础语法
- 开始事务
- start transaction;
- 创建保存点
- savepoint 保存点名;
- 回退
- rollback to 保存点名
- 开始事务
-
2.2 注意
- 若没有设置保存点,则直接回退到事务开始处(未提交的情况下)
- 若事务被提交(commit),无法回退(roolback)
- 可以选择回退到哪一个保存点
- InnoDB支持事务,MyISAM不支持事务
3. 事务的隔离级别
- 为了对多个客户端同时操作数据库的某个表进行隔离,MySQL提供了隔离级别
- 隔离机制:使得不同的事务在操作数据时,具有隔离性。从而保证数据的一致性。
-
3.1 无隔离性问题
- 脏读
- 当一个事务正在访问数据,并对数据进行了修改,但还未提交至数据库中。另一个事务访问并使用了这个数据。
- 不可重复读(不能读到相同的数据内容) -> 修改
- 在一个事务内,多次读取同一个数据。在多次读取之间,另一个事务访问了该数据并进行了修改,那么第一个事务多次读取的内容是不同的。
- 幻读 -> 新增或删除
- 第一个事务对表中的数据进行修改,操作了全部数据行。同时,第二个事务插入了一条新数据。那么第一个事物就如同出现了幻觉一样(我不是修改了所有数据行了么,这个怎么没有被修改?)
- 脏读
-
3.1 事务的隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交 read uncommitted | √ | √ | √ | 不加锁 |
读已提交 read committed | × | √ | √ | 不加锁 |
可重复读 repeatable read | × | × | × | 不加锁 |
可串行化 serializable | × | × | × | 加锁 |
- 设置事务隔离级别
- set session transaction isolation level read uncommitted;
- 查看当前的隔离级别
- select @@tx_isolation;
- MySQL默认的隔离级别是可重复读
- 事务的隔离级别和数据库的并发性是对立的
4. 事务的ACID特性
- 原子性
- 事务是一个不可分割的工作单位,要么都发生,要么都不发生
- 一致性
- 事务可以封装状态改变,初始状态与最终状态都是一致的。
- 隔离性
- 多个用户并发访问数据库时,数据库为每一个用户开启的事务不被其他事务的操作数据所干扰。
- 持久性
- 一个事务一旦被提交,对数据库中的数据的修改就是永久的。