`

事务隔离级别

阅读更多

先来看看在事务应用中可能出现的各种问题.

 

丢失更新(lost update)

是一个经典的数据库问题。实际上,所有多用户计算机环境都存在这个问题。简单地说,出现下面的情况时(按以下所列的顺序),就会发生丢失更新:

(1) 会话Session1中的一个事务获取(查询)一行数据,放入本地内存,并显示给一个最终用户User1。

(2) 会话Session2中的另一个事务也获取这一行,但是将数据显示给另一个最终用户User2。

(3) User1使用应用修改了这一行,让应用更新数据库并提交。会话Session1的事务现在已经执行。

(4) User2也修改这一行,让应用更新数据库并提交。会话Session2的事务现在已经执行。

这个过程称为“丢失更新”,因为第(3)步所做的所有修改都会丢失。例如,请考虑一个员工更新屏幕,这里允许用户修改地址、工作电话号码等信息。应用本身非常简单:只有一个很小的搜索屏幕要生成一个员工列表,然后可以搜索各位员工的详细信息。这应该只是小菜一碟。所以,编写应用程序时没有考虑锁定,只是简单的SELECT和UPDATE命令。

脏数据

        脏数据是指事务A访问并修改了一个数据,但还没有提交回表中,这时事务B访问并使用了该数据,则事务B读到的可能就是一个“脏”的数据。依据脏数据所作的操作就很可能是错误的。

不可重复读

        不可重复读是指事务A对某数据进行一次读取后,数据被事务B访问并修改。当事务A再一次访问数据时,会发现跟前一次读到的数据不一致。

幻觉读

        幻觉读是指当事务不是独立执行时发生的一种现象。例如事务A对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,事务B也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作事务A的用户就会发现表中还有未修改的数据行,就好象发生了幻觉一样。

 

1Read Uncommited: 可以解决丢失更新.将会出现脏读问题。如果不存在并发事务,且只有单个实例处于运行中,则  比较适合。
2Read commited: 能解决脏读问题,适用于只需要从RDMBS中读取数据的应用,但不能解决不可
    重复读。Oracle, SQL Server 默认的级别。
3Repeatable Read: 解决Drity Read和Unrepeatable问题。
    可以用"乐观锁"达到同样目的。
4Serializable:
    这个完全串行化独占式操作数据库。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics