1.什么是数据库的事务?
数据库事务的典型场景?
订单,转账 支付,电商等全部成功/全部不成功。金融
什么是事务?
数据库的最小工作单元,不可分割,一个DML或多个
哪些存储引擎支持事务?
InnoDB 版本5.5.5以后的 数据的一致性 MyIsam 不支持 BDB支持
事务的四大特性?
ACID
原子性: undo log实现 记录数据修改之前的值
一致性 完整性的约束有没有破坏,合法的数据状态,字段长度,主键唯一,类型都是合法,用户自定义的完整性
隔离性 透明的互相不干扰的
持久性 对数据库任意的操作(增删改) 永久性的不能因为重启就更改了
redo log ---写到buffer pool(在内存中)
数据库什么时候出现事务?
update brower set Bro_Pro_username = 'zhangsan' where Bro_id = 165;
Start TRANSACTION;
begin;
update brower set Bro_Pro_username = 'lisi' where Bro_id = 165;
rollback;
show VARIABLES LIKE 'autocommit';
set session autocommit = on;
update brower set Bro_Pro_username = 'wangwu' where Bro_id = 165;
commit;
--事务结束的时候,所持有的锁就会释放
事务并发会带来什么问题?
?问题 为什么会出现查询两次数据时出现数据不一致的情况
脏读:
在一个事务里面前后两次读取数据不一致,是由于其他的事务操作了数据并且没有提交的数据就是脏读;
不可重复读:
一个事务前后两次读取数据发生不一致的情况是由于其他的事务中间操作的数据并且提交了的这种情况。
幻读:只有插入才是幻读
不可重复读和幻读的区别?
不可重复读是更新和删除,而幻读是插入数据导致数据行不同
总结
事务并发的三大问题其实都是数据库一致性问题,必须由数据库提供一定的事务隔离机制来解决。
事务的四种隔离级别
SQL92 ANSI/ISO标准
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
未提交读 ----未解决任何并发问题
事务未提交的数据对其他事务也是可见的,会出现脏读
已提交读 ----解决脏读问题
一个事物开始之后,只能看到已提交的事务所做的修改,会出现不可重复读
可重复读 ----解决不可重复读问题
在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题
串行化 ----解决所有问题
最高的隔离级别,通过强制事务的串行执行。
如何要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,实现事务隔离,应该怎么做?
第一种:在读取数据前,对其加锁,防止其他事务对数据进行修改(LBCC)
第二种:生成一个数据请求时间点的一致性数据快照,并用这个快照来提供一定级别(语句级或事务级)的一致性读取(MVCC)
协同使用
2.MySQL InnoDB 锁的基本类型
myisam支持表锁 innodb支持表锁和行锁
加锁效率 -- 表锁>行锁
冲突概率 -- 表锁>行锁
并发性能 -- 表锁<行锁
行级别锁:
共享锁:
多个事务对于同一数据可以共享一把锁,都可以访问到数据,但是只能读数据不能修改
读数据时修改数据会出现死锁
加锁释锁方式:
select * from emp where emptno = 1 LOCK IN SHARE MODE;
释放 :
commit/rollback;
排他锁:
写锁,排他锁不能与其他锁共存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务可以对数据进行读取和修改
和任意的锁都是冲突的
实现:
自动:delete/update/insert 默认加上X锁
手动:select * from emp where emptno = 1 for update;
commit/rollback
表级别的锁
意向共享锁/意向排他锁
尝试去锁住一张
前提:没有其他任何一个事务锁住了这张表的任何一行数据
锁的作用?
用来解决事务不同事务竞争并发
锁到底锁住了什么?
是一行数据吗?
是一个字段吗?
4.行锁的原理与算法详解
1.无索引时
第一行数据加锁
第三行数据加锁失败
没有索引的时候为什么会导致锁表?
一张表有没有可能没有主键索引,如果没有会创建默认索引,全表的扫描
2.主键索引
唯一索引和主键索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。
为什么第一个事务锁住name,会阻塞第二个事务锁住id呢?
锁住索引
什么是索引?
算法
记录锁:
唯一性索引(唯一/主键) 等值查询,精准匹配
间隙锁
记录不存在 间隙的区间不可变
临键锁
范围查询,包含记录和区间