sqlserver中 事务和锁 的基础概念总结
.1 基本概念 并发控制:主要是考虑到多个用户同时存取数据库中的同一数据的情况。 sql server 设计有两种并发访问的控制机制:锁、行版本控制。 锁:主要用于多用户环境下保证数据库完整性和一致性.每个事务对所依赖的资源会请求不同类型的锁,它可以阻止其
.1 基本概念
并发控制:主要是考虑到多个用户同时存取数据库中的同一数据的情况。
sql server设计有两种并发访问的控制机制:锁、行版本控制。
锁:主要用于多用户环境下保证数据库完整性和一致性.每个事务对所依赖的资源会请求不同类型的锁,它可以阻止其他事务以某种可能会导致事务请求锁出错的方式修改资源。当事务不再依赖锁定的资源时,锁将被释放。
行版本控制:当启用了基于行版本控制的隔离级别时,数据库引擎将维护修改的每一行的版本。应用程序可以指定事务使用行版本查看事务或查询开始时存在的数据,而不是使用锁保护所有读取。通过使用行版本控制,读取操作阻止其他事务的可能性将大大降低。
事务:事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的
1.2 并发访问的不利影响
并发访问,如果没有并发访问控制机制,可能产生的不利影响有以下几种:
脏读,丢失更新,不可重复读,幻像度
1.脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
2.丢失更新:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
3.不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
4.幻象读:指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,,就好象发生了幻觉一样。
1.3 锁的分类
按数据库引擎使用的资源锁模式。
锁模式
说明
共享 (S)
用于不更改或不更新数据的读取操作,如 SELECT 语句。
更新 (U)
用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排他 (X)
用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时对同一资源进行多重更新。
意向
用于建立锁的层次结构。意向锁的类型有:意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。
架构
在执行依赖于表架构的操作时使用。架构锁的类型有:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU)
在向表进行大容量数据复制且指定了 TABLOCK 提示时使用
键范围
当使用可序列化事务隔离级别时保护查询读取的行的范围。确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行