我对事务隔离级别的理解
对4个不同隔离级别的理解。他们都是对Read的并发控制。写的时候肯定是要加锁的
1.Read Uncommitted 未提交读
允许读取已经被其它用户修改但尚未提交确定的数据。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。 该级别一般读的时候不加任何锁。
2.Read Committed 提交读
允许不可重复读取但不允许脏读取。读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。该级别一般通过瞬间共享读锁实现。在一个事务中读取数据读完后马上释放。如果在同一个事务中再次读取改数据可能会数据不一样。被其它事务修改
3.可重复读取(Repeatable Read)
禁止不可重复读取和脏读取。但是有时可能出现幻影数据,该级别一般通过行锁实现。在一个事务中select 一个表的数据.会一直占用select 出来数据的行锁。直到事务结束。但由于是行锁。另一个事务可以插入数据.这导致同一个事务中第一次select 和 第二次 select 出的数据不一样 即 幻影数据
4.序列化(Serializable)。
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。相当于在读的时候或许写锁
数据库在被广大客户所共享访问的操作过程中很可能出现以下几种不确定情况 :
1. 更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来
2. 脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚
3. 不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交
4. 两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效
5. 虚读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的
更多参考:http://blog.sina.com.cn/s/blog_5198c7370100eut5.html