先来看看在事务应用中可能出现的各种问题.
丢失更新(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:
这个完全串行化独占式操作数据库。