事务
事务的特性
- 原子性:所有操作要么都做要么都不做
- 一致性:数据在事务操作前后都满足业务规则的约束
- 隔离性:数据库允许多个并发事务同时对数据进行读写和修改的能力
- 持久性:对数据的修改是永久的
truncate与delete(中金所一面问到过)
区别:
- truncate是DDL语句操作,delete是DML语句操作
- 简而言之(DDL是建库/建表/等语句;DML是增删改查语句)
- truncate不能回滚,delete可以回滚
- truncate清空表的自增id属性,从1重新开始记录,delete则不会
并发带来的问题
- 脏读:当一个事务对一个数据修改后还没提交数据库中时,另一个事务也访问了这个数据
- 丢失修改:一个事务修改数据时,另一个事务也修改了这个数据
- 不可重复读:一个事务多次读取同一个数据时 还没结束时,另一个数据页访问此是数据,导致两次读取的数据不一样
- 幻读:第一事务读取了几行数据,接着另一个事务插入了几行数据,,随后第一事务就会发现多了一些原本不存在的数据
隔离级别
- READ-UNCOMMITTED(读取未提交):允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣。
- REPEATABLE-READ(可重复读):对同⼀字段的多次读取结果都是⼀致的,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣。
- SERIALIZABLE(可串⾏化):完全服从ACID,可以防⽌脏读、不可重复读以及幻读。
innoDB锁类型
行锁
id name score
1 aa 60
- 在会话
A事务中更新字段score=60时名字设为aaa
- 在会话
B事务中,更新会话A同一行数据,将name设为a,会出现锁等待超时现象
间隙锁(Gap lock)
- 在RR隔离级别下,为了避免幻读,引入了Gap lock
- 但它只锁定行记录数据的范围,不包含本身,即不允许在此范围内插入任何数据
==在RR级别下==
id name score
1 aa 60
2 bb 70
3 cc 80
- 会话
A查询score<80的记录,在上面加了一个共享锁
- 会话
B往表中插入score=75的数据,但没插入成功,出现锁超时现象
- 在scor<80的这个区间内,不允许有任何数据插入
池化思想(或好处)
- 抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销
- 比如去食堂打饭,每次阿姨都打好了,去了直接吃
InnoDB处理死锁
- 检测到死锁的循环依赖,立即返回一个错误
- 目前的处理办法是:将持有最少行级排它锁的事务进行回滚