隔离性(isolation)是ACID中的一个属性。事务隔离是指由某个事务作出的修改能被数据库产生的其他事务看见的程度(例如在数据库访问并发的条件下)。对于最高级的隔离,每一个事务产生就好像在同一时间只有_一个事务存在一样,它看不到其他事务作出的修改。对于最低级的隔离,任何事务进行的操作,无论是否提交都能被其他事务看见。
ANSI/ISO SQL标准定义了并发事务之间的4种交互类型,如下所示:
- 脏读(dirty read):如果一个事务正在更新一行,而第二个事务在第一个事务提交之前读取了那行,就会发生这种情况。如果原来的更新回滚了,那么第二个事务读取的数据就不一样。这就是脏读。
- 不可重复读取(norepeatabte read):当一个事务在更新数据,第二个事务在其更新过程中读取相同的数据时会发生这种情况。更新前获取的数据和更新后获取的数据不一致。
- 幻读(phantom read):事务产生两次读取,并且在两次读取之间底层的数据有插入的或是被删除的数据。它会造成两个查询的结果行有所不同。在一个查询中出现了但另一个查询未出现的仍称为“幻行”。
- 更新丢失(lost update):如果两个事务都更新了同一行的值,并且最后一次更新的事务“取得了胜利”,那么第一次的更新就丢失了。
SQL Server使用锁定机制来控制并发事务的竞争行为。为了避免脏读、不可重复读等并发问题,SQL Server通过锁来控制对数据库资源的访问,实现某种级别的事务隔离。表3-4描述了SQL Server中可用的隔离级别。
SQL Server隔离级别
隔离级别 | 描 述 |
READ COMMITTED(这是SQL Server默认行为) | 如果设置了READ COMMLTTED,就不能读取未提交的数据修改。在查询中使用共享锁,而且当查询扶取数据的时候,其他进程不能修改数据。只要涉及的行没有被第一个事务锁定,其他事务就能对同一个表进行数据插入和修改 |
READ UNCOMMITED | 这是限制最小的隔离级别,对事务检索的数据不加锁。因为读取的数据在读取时可以被修改(这些读可视为“脏读”),或者有数据新增或者删除从而改变了原始的查询结果,所以它提供了最高的并发性和最低数量的数据完整性。这个选项允许我们在不阻塞的情况下读取,但是也带来了读取不稳定数据的危险,因为数据可能在读取的过程中被修改(包括读取了一个最终被回滚的事务的数据更改).对于相对静态或不修改的数据而言,这种隔离级别可能会提升性能,因为它指示SQL Server不要对访问的资源加不必要的锁 |
REPEATABLE READ | 如果开启了该级别,就不允许脏读和不可重复读取.这通过为所有读取资源加共享锁来实现。然而,在查询返回的日期范围中新插入的行还是能被其他事务插入 |
SERIALIZABLE | 如果开启了该级别,这是限制最高的设置。根据产生结果集的搜索标准,会在数据上加范围锁。这样就保证了不允许进行插入行.修改值或删除在原始查询和搜索标准中返回的行操作 |
SNAPSHOT | 这个隔离级别允许我们读取事务一致性版本的数据,因为它存在于一个事务的开始阶段。数据读取不阻塞数据修改——然而,SNAPSHOT会话不能检测到当前的修改 |
事务和锁定是密切关联的。根据应用程序的设计,事务能显著地影响数据库并发。并发是指在同
一时间有多少人能查询和修改数据库和数据库对象。例如,READ UNCOPWIITED隔离级别不加锁,所以它
允许最大数量的并发一缺点是可能会遇到一些数据孤立的异常(例如脏读)。然而,在查询大批量
数据的时候,SERIALIZABLE模式提供了和其他进程最小的并发性阜