这个跟数据库的事务隔离级别设置有关。 SQL-92定义了四种隔离级别:
Read Uncommitted
Read Committed
Repeatable Read
Serializable 隔离级别是根据下面三种被禁止的操作序列(Phenomenan)规定的:
Dirty Read
Non-Repeatable Read
Phantom Read 所谓Dirty Read,如下所示:
Transaction 1: Write(a) Rollback
Transaction 2: Read(a)
如果事务2读出的数据的值是被事务1写过的,那么就是脏读。 所谓Non-Repeatable Read,如下所示:
Transaction 1:Read(a) Read(a)
Transaction 2: Write/Delete(a) Commit
如果事务1中每次读的数据的值不一样(事务2改写或者删除并且提交),那么就
称之为不可重复的读 所谓Phantom Read,如下所示:
Transaction 1:Select(criteria) Select(criteria)
Transaction 2: Update/Create(match to Criteria) Commit
如果事务1中重新执行相同的查询返回的结果集不一样(事务2修改或者插入并且
提交),称phantom Read发生。 四种隔离级别对应的特性:Isolation Level Dirty Read Non-Repeatable Read Phantom Read
Read Uncommitted 可能 可能 可能
Read Committed 不可能 可能 可能
Repeatable Read 不可能 不可能 可能
Serializable 不可能 不可能 不可能
一般数据库好像都缺省地处在Read Committed级别,Serializable级别是排它性最高的,就是模拟的串行化执行事务,在不同的数据库系统中,对这四种级别的对应不尽相同。据Sybase声称,其它的DBMS中,Serializable都被认为是Repeatable Read,呵呵。说白了,隔离级别也是一种加锁和释放锁的方法。
Read Uncommitted
Read Committed
Repeatable Read
Serializable 隔离级别是根据下面三种被禁止的操作序列(Phenomenan)规定的:
Dirty Read
Non-Repeatable Read
Phantom Read 所谓Dirty Read,如下所示:
Transaction 1: Write(a) Rollback
Transaction 2: Read(a)
如果事务2读出的数据的值是被事务1写过的,那么就是脏读。 所谓Non-Repeatable Read,如下所示:
Transaction 1:Read(a) Read(a)
Transaction 2: Write/Delete(a) Commit
如果事务1中每次读的数据的值不一样(事务2改写或者删除并且提交),那么就
称之为不可重复的读 所谓Phantom Read,如下所示:
Transaction 1:Select(criteria) Select(criteria)
Transaction 2: Update/Create(match to Criteria) Commit
如果事务1中重新执行相同的查询返回的结果集不一样(事务2修改或者插入并且
提交),称phantom Read发生。 四种隔离级别对应的特性:Isolation Level Dirty Read Non-Repeatable Read Phantom Read
Read Uncommitted 可能 可能 可能
Read Committed 不可能 可能 可能
Repeatable Read 不可能 不可能 可能
Serializable 不可能 不可能 不可能
一般数据库好像都缺省地处在Read Committed级别,Serializable级别是排它性最高的,就是模拟的串行化执行事务,在不同的数据库系统中,对这四种级别的对应不尽相同。据Sybase声称,其它的DBMS中,Serializable都被认为是Repeatable Read,呵呵。说白了,隔离级别也是一种加锁和释放锁的方法。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货