一、事务的ACID特性
   首先事务是一个逻辑上的工作单元,同一组sql语句,他们要么作为一个单元被提交,要么作为一个单元被回滚。使用update在2个银行账号进行转账的例子已经叙述过,这2个Update语句必须同时被提交或回滚;否则,就可能丢钱了。

    严格的定义为,事务有4个基本特性,成为ACID特性。
①atomicity原子性 事务必须承租的提交或者回滚,因此事务是原子的。一个事务中包含的所有sql语句都是一个不可分割的单元;

②consistency一致性 必须确保数据库的状态保持一致。就是说事务开始时,数据库的状态是一致的;在事务结束时,数据库的状态也必须是一致的;

③isolation隔离性多个事务可以独立运行,而不会被彼此产生影响;

④durability一旦事务被提交之后,数据库的变化就会被永远保留下来,即使运行数据库软件的机器后来崩溃也是如此。



二、并发事务 
 oracle数据库支持多用户同时与数据库进行交互,每个用户都可以同时运行自己的事务。这种事务就成为并发事务。

  如果用户同时运行多个事务,而这些事务都对同一个表产生影响,那么这些事务的影响都是独立的。直到执行一条commit语句时才会彼此产生影响。
①T1:
select min(t.id)
from teacher t
--------
5


②T1:
insert into teacher 
values(1,'15555555555','测试')
---------
无commit;

③T2:
select min(t.id)
from teacher t:
-----------
5

④T1:COMMIT;

⑤T2:select min(t.id)
from teacher t
------------
1
--------以上在rapidsql两个对话框中进行测试,都以用户edu登录到数据库上,输入以上数据。按照表中所给出的交叉次序在session对话框中输入这些数据;


三、事务锁
   要支持并发事务,oracle数据库必须保持表中的数据一直有效。可以通过锁来实现。两个事务同时修改teacher表中id=1的记录:
(1)T1执行一条update语句修改id=1的记录,但是呢,T1并没有执行commit语句。此时就称T1对该行加锁了。

(2)T2也试图执行一条UPDATE语句修改id=1的记录,但是由于该行早已被T1加锁,那么T2就不能获得该行的锁。T2的update语句必须一直等,知道T1结束并释放该行上的锁为止。

(3)T1执行commit语句并结束,从而释放该行上的锁。

(4)T2获得该行上的锁,并执行update语句。T2获得该行上的锁一直持有,知道T2结束为止。
  
当一个事务已经拥有某一行上的锁时,另外一个事务不能获得该行上的锁。


默认的加锁机制:读程序不会阻塞读程序;写程序不会阻塞读程序;只有在试图对相同的行进行修改时,写程序才会阻塞写程序。

edit on 2010-08-31

 

posted on 2010-11-26 13:26  维也纳下午茶  阅读(121)  评论(0编辑  收藏  举报