文章目录
-
- 事务概念
- 事务特性
-
- ACID模型
-
- 原子性Atomicity
- 隔离性Isolation
- 持久性Durability
- 一致性Consistency
- 实现原子性
- 实现持久性
- 事务操作
- 实现隔离性
-
- 事务锁
-
-
- 锁粒度
- 锁模式
-
- 意向锁
- 锁算法
-
- 精准行锁
- 间隙锁
- 临键锁
- 自增锁
-
- 隔离级别
-
-
- 设置与查看隔离级别
- 读未提交
- 读已提交
- 可重复读
- 串行化
-
- 多版本控制(MVCC)
-
- 版本链
- 读视图
事务概念
事务是把⼀组SQL语句打包成为⼀个整体,在这组SQL的执⾏过程中,要么全部成功,要么全部失
败,这组SQL语句可以是⼀条也可以是多条。
使用事务的原因
⽀持事务的数据库能够简化我们的编程模型, 不需要我们去考虑各种各样的潜在错误和并发问题,在使⽤事务过程中,要么提交,要么回滚,不⽤去考虑⽹络异常,服务器宕机等其他因素
事务特性
事务遵循ACID模型
ACID模型
原子性Atomicity
⼀个事务中的所有操作,要么全部成功,要么全部失败,不会出现只执⾏了⼀半的情况,如果事务在执⾏过程中发⽣错误,会回滚( Rollback )到事务开始前的状态,就像这个事务从来没有执⾏过⼀样
隔离性Isolation
数据库允许多个并发事务同时对数据进⾏读写和修改,隔离性可以防⽌多个事务并发执⾏时由于交叉执⾏⽽导致数据的不⼀致。事务可以指定不同的隔离级别,以权衡在不同的应⽤场景下数据库性能和安全
持久性Durability
事务处理结束后,对数据的修改将永久的写⼊存储介质,即便系统故障也不会丢失
一致性Consistency
在事务开始之前和事务结束以后,数据库的完整性不会被破坏。这表⽰写⼊的数据必须完全符合所有的预设规则,包括数据的精度、关联性。只要实现持久性、隔离性、原子性,就可以实现一致性
实现原子性
原子性通过undo日志实现,进行DML操作之前必须先生成一条undo日志,undo日志中保存了目标修改行的旧版本信息(roll pointer),一旦事务执行过程中发生错,可以通过undo日志对已经修改的数据行逐条恢复
实现持久性
持久性通过redo日志和双写缓冲区保证实现,当一个事务提交之后,需要把最新的数据刷盘到磁盘上进行持久化存储,刷盘过程中如果出现崩溃的现象就会导致部分数据没有落盘,当服务器重启之后可以通过查询根据redo日志来识别还未落盘的数据,通过redo日志重新进行一次DML操作
事务操作
- 开启事务 begin (默认情况下单条sql语句即事务)
- 提交事务 commit
- 回滚事物 rollback
实现隔离性
多个事务并发执行时会涉及到临界资源的读写,如果不加以控制将会导致线程安全问题的出现,一致性就得不到满足,因此有必要避免事务之间的干扰.将各个事务通过一定的手段实现隔离,Innodb通过锁和读视图来实现事务的隔离性。