什么是数据库的事务?
数据库执行过程中一个逻辑单位
哪些存储引擎支持事务?
InnoDB支持事务,Mysiam不支持
事务四大特性?ACID
原子性:(不可分割,都成功,都失败),回滚操作通过undo log实现
一致性:平衡,-100 ,+100
隔离性:互相不干扰
持久性:事务提交后就是永久性的。事务的恢复通过redo log
在什么地方会用到事务?什么时候回出现事务
发送一个指令到数据库,update,delete,insert自动提交,默认开启事务
事务并发带来的三大问题:
脏读(修改数据没有commit)
不可重复读(update和delete)
幻读(只有insert才是幻读)
以上这种问题有数据库自己提供一定的事务隔离机制来解决。
定义了四种事务隔离级别:建议是有四种隔离级别解决数据库中并发下数据库的事务问题
虽然串行(xing)化解决了所有问题,但是效率慢
各大厂商
Oracle实现已提交读和串行化
Mysql支持可重复读,InnoDB解决了幻读的问题。既保证效率,又将所有的问题解决
InnoDB是如何解决幻读的?
MVCC多版本控制
第一方案不好,第二种实现读一致性,读快照
MVCC实现依赖于:隐藏字段,undo log,Read View
read view最核心,
MVCC可以不采用锁机制,而是通过乐观锁的方式来解决不可重复读和幻读,可以在大多情况下替代行级锁,降低系统开销。
这两个字段是InnoDB中隐藏的字段。回滚指针指向undolog
多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在undo log中,一个事务查询要读取那个版本记录?这里就用到了read view。它帮我们解决行的可见性问题。
readview就是事物使用MVCC机制进行快照读操作时候产生的读视图。当事务启动,会生成数据库系统当前的一个快照,innodb为每个事务构造了一个数组,用来记录并维护当前活跃事务的id(活跃指启动但没有提交)
通过MVCC可以解决
1.读写之间阻塞问题
2.降低死锁概率
3.解决快照读的问题。
另一个事务插入数据读不到,只是在这个事务中,其他事务的操作不影响这个事务的数据。
读取的是快照的数据,而不是最新的数据,如何实现的
第一个事务插入两条数据
第二个事务,第一次查询
第三个事务,插入数据
事务二第二次查询还是之前的数据,刚才事务三新增的数据并没有查询到
事务4删除数据
这就是MVCC工作原理,通过两个影藏列来实现
InnoDB锁的基本类型
表锁和行锁,Myisam是表锁,InnoDB是行锁
共享锁和排它锁是行锁
共享锁(读锁)
排它锁(写锁)
表锁(意向共享锁和意向排它锁)
这张表的任何数据都没有被其他数据锁定,会有一个标志,意向锁,无需进行全表扫描来判断这张表的数据是否全部都没有其他事务锁定,提高加表锁的效率(InnoDB支持表锁)
锁的作用,解决资源竞争问题,解决并发访问
锁的原理?到底锁住了什么?才能实现并发访问?
锁住的是索引,一定有索引,隐藏的rowid
没有用到索引作全表扫描,通过rowid会将表全部锁住,造成锁表的一个现象
InnoDB中辅助索引加锁,主键索引也会被锁住
行锁的算法
1.4.7.10实际存在的
区间划分的概念
n个record会出现n+1个间隙
如果是字符呢?如何排序?ASCII来进行排序
记录锁
间隙锁
临键锁(InnoDB中默认行锁算法)
这就是InnoDB解决幻读的原因
默认RR(三种锁的算法都会使用)
RC会使用记录锁,并没有解决幻读问题
在公司好像都是默认的RR
RR和RC主要区别?使用RC会带来额外的好处。
当没有用到索引的时候,使用update和delete会行锁,而InnoDB会锁表。增加update操作的并发性