事务
- 事务
- 事务的操作
- 事务并发处理可能出现的问题
- 隔离级别
- MVCC:多版本并发控制
事务
事物本质上指一条 sql 语句或一组 sql 组合
事务的特性:ACID
1、原子性:一个事务,要么一次性完成,要么就不做
2、一致性:事务以前及事务以后,数据库完整性不会被破坏,符合所有预设规则
3、隔离性:事务之间相互隔离,防止多个事务并发执行时由于交叉执行而导致数据不一致
4、持久性:事务处理之后,对数据的修改是永久性的,即便系统故障也不会丢失
事务的操作
开始事务:begin; / start transaction;
提交事务:commit;
保存事务节点:savepoint point_name;
事务回滚:rollback; 全部回滚 / rollback to point_name; 回滚到某一个事务点
一旦事务进行中,客户端发生异常,为了维护原子性,则会时候就会自动进行数据库回滚;
一旦事务进行了提交 commit ,则这时候对数据库的修改就是永久性的
事务并发处理可能出现的问题
1、脏读:
事务 A 读取到了事务 B 并未提交前所作的修改;
2、不可重复读:
一个事务在不同的时间段读取到的数据不一致(读取到的数据是未进行提交的数据)
3、幻读:
一个事务在不同时刻,读取到的数据条码数量不一致
隔离级别
读未提交:
所有事务可以看到其他事务没有提交的执行结果。但相当于没有任何隔离性,也会有很多并发问题:脏读、幻读、不可重复读等
读提交:
大多数数据库默认的隔离级别(不是 MySql 默认的),满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变,会引起不可重复读-------即:一个事务执行时,若多次 select 可以得到不同的结果
可重复读:
MySql 默认的隔离级别,确保同一个事务,在执行中多次读到操作数据时,会看到同样的数据,解决了脏读和不可重复读,但会产生幻读
串行化:
事务的最高隔离级别,通过强制事务排序,使之不可能相互冲突从而解决了幻读问题。在每个读的数据行上加共享锁,但可能会导致超时和锁竞争
加锁串行化进行,可以解决所有问题
隔离级别如何实现:隔离,基本都是通过锁来实现的,不同的隔离级别,锁的使用是不同的。常见有:表锁、行锁、读锁、写锁、间隙锁GAP、Next-Key锁(GAP+行锁)等等。
(间隙锁:行级锁,加锁不仅仅针对所要操作的数据,还会对要操作的数据旁边的数据(范围根据查询范围进行控制)进行加锁------可以解决幻读问题)
MVCC:多版本并发控制
MVCC 是一种快照读,读取到的都是历史版本的数据(事务只能获取到事务版本低于自己当前事务版本(ID)的数据)
每一个事务启动后,数据库都会给事务分配一个事务 ID(不断增长的)