并发可能导致的影响:
1. 丢失更新:多个事务同时更新同一行;
2. 脏读:修改过程中的数据被读取;
3. 不一致的分析(不可重复读):读取的事务里面,符合读取条件的行搜索条件被更改了;
4. 幻读:读取的事务里面,符合读取条件的行被删除或者插入了;
3和4 的区别在于前者是更新 ,后者是插入删除。
并发控制类型:
1. 悲观并发控制:用到锁来保护数据。用于锁消耗低于回滚事务的成本环境中;
2. 乐观并发控制:并发过程中不产生锁,读取数据后检查用户数据,判断是否产生错误, 回滚事务。用于数据争用少的环境。
锁:是数据库引擎用来同步多个用户同事对一个数据块访问的一种机制
锁的粒度和层次结构
数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源。
锁定在较小的粒度(例如行)可以提高并发度,但开销大,因为锁定的范围越小,需要的锁就越多(锁定了许多行,就需要持有更多的锁);锁定在较大的粒度(例如表)会降低并发度,但是消耗较低,因为锁定的范围大,需要的锁就越小(锁定了表,限制了其他事物对表的访问)。
数据库引擎通常必须获取多粒度级别上的锁才能完整地保护资源。这种多粒度级别上的锁称为锁层次结构
可以锁定的资源:
可被锁定的资源 |
说明 |
RID |
用于锁定堆中的单个行的行标识符 |
KEY |
索引中用于保护可序列化事务中的键范围的行锁 |
PAGE |
数据库中的8KB页,数据页或者索引页 |
EXTENT |
一组连续的页 |
HOBT |
堆或者B树,保护索引或没有聚集索引的表中数据页堆的锁 |
TABLE |
包括所有数据和索引的整个表 |