隔离性(isolation)是ACID中的一个属性。事务隔离是指由某个事务作出的修改能被数据库产生的其他事务看见的程度(例如在数据库访问并发的条件下)。对于最高级的隔离,每一个事务产生就好像在同一时间只有_一个事务存在一样,它看不到其他事务作出的修改。对于最低级的隔离,任何事务进行的操作,无论是否提交都能被其他事务看见。
ANSI/ISO SQL标准定义了并发事务之间的4种交互类型,如下所示:
- 脏读(dirty read):如果一个事务正在更新一行,而第二个事务在第一个事务提交之前读取了那行,就会发生这种情况。如果原来的更新回滚了,那么第二个事务读取的数据就不一样。这就是脏读。
- 不可重复读取(norepeatabte read):当一个事务在更新数据,第二个事务在其更新过程中读取相同的数据时会发生这种情况。更新前获取的数据和更新后获取的数据不一致。
- 幻读(phantom read):事务产生两次读取,并且在两次读取之间底层的数据有插入的或是被删除的数据。它会造成两个查询的结果行有所不同。在一个查询中出现了但另一个查询未出现的仍称为“幻行”。
- 更新丢失(lost update):如果两个事务都更新了同一行的值,并且最后一次更新的事务“取得了胜利”,那么第一次的更新就丢失了。
SQL Server使用锁定机制来控制并发事务的竞争行为。为了避免脏读、不可重复读等并发问题,SQL Server通过锁来控制对数据库资源的访问,实现某种级别的事务隔离。表3-4描述了SQL Server中可用的隔离级别。
SQL Serv