数据库的隔离级别
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
● 未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
● 授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
● 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
1. 未提交读(READ UNCOMMITED)。事务隔离的最低级别,仅可保证不读物理损坏的数据。
2. 提交读(READ COMMITED)。SQL Server的默认级别,可以保证不读"脏"数据,但会发生不可重复读。
3. 可重复读(REPEATABLE READ)。可以保证读一致性,防止不可重复读现象的发生,但会发生幻象读。
4. 可串行化(SERIALIZABLE)。事务隔离的最高级别,事务之间完全隔离,在该级别上可以保证并发事务均是可串行的。在该隔离级别上不会发生幻象读。
这些隔离级别按照隔离程度有小到大排序,隔离程度越大,隔离效果越好,可保证数据的正确性,但并发度小;隔离程度越小,隔离效果越差,越容易发生数据不一致现象,但并发度较大。