SAP Sybase ASE数据库支持ANSI SQL标准定义的全部4种隔离级别,从本文开始将向广大SAP Sybase ASE的初学者介绍事物和并发控制的知识。ASE数据库的事物和并发控制相对来说比较复杂,如果初学者不能正确掌握的话,开发出来的应用系统会遇到很多问题,比容性能和并发能力低等方面的问题。这篇文章将向初学者介绍ANSI SQL定义的4种事物隔离级别,本文近可能以简单的语言描述并结合例子进行介绍。
1. Read Uncommitted(隔离级别1,读取未提交数据)
事物在这种隔离级别下,允许读取/访问(看到)其他事物中尚未提交的数据修改。读取未提交的数据,也被称之为脏读(Dirty Read)。通常情况下,很少使用这种隔离级别。
2. Read Committed(读取提交数据)
在这种隔离级别下,事物只能访问其他事物已经提交的数据修改。"读提交"隔离级别虽然解决了“脏读”问题,但是可能会遇到"不可重复读"问题:"即一个事物在先后两次执行相同查询语句所读取到的数据值发生了不一致。这是由于在前后两次执行相同语句期间,其它的事物对数据t.163.com进行了update或delete操作并且已经提交了事物而导致的"。例如:
事物TA执行如下操作:
begin transaction
.....
select balance from accounts where actno=1234567 --第一次读取
.....
select balance from accounts where actno=1234567 --第二次读取
....
commit
事物TA在第1次执行查询时得到账号123567的余额是1000;当他第2次执行相同查询语句之前,事物TB执行了如下事物并提交:
begin transaction
......
update accounts set balance=balance+100 where actno=1234567
commit
这样一来,事物TA第2次执行相同查询时得到账号1234567的余额就是1100了,两次查询结果不一致,即遇到了"不可重复读"问题!此外,如果事物TB执行了delete accounts where actno=1234567,那么事物TA在第2次执行查询时就会找不到对应记录了event。
3. Repeatable Read(可重复读)
在这种隔离级别下,事物可以重复多次执行同一查询,并且读到的结果集中的任何一行记录都不会被其他事物更新或删除。这种隔离级别虽然解决了"不可重复读"问题,但是可能会遇到"幻像读 (Phantom Read)"问题:info"即当事物读取满足某一范围条件的数据行时,另一个事务又在该范围内插入了新行,当事物再次读取该范围的数据行时,会发现有新的"幻像" 行"。例如:
eventId事物TA执行如下操作:
begin transaction
.....
--第一次读取
select count(*) from accounts where balance>=1000 and balance <=3000
.....
select count(*) from accounts where balance>=1000 and balance <=3000
....
commit
事物TA在第1次执行查询时得到账户余额在1000和3000之间的账户数,假设为500;当他第2次执行相同查询语句之前,事物TB执行那个了如下事物并提交:
begin transaction
......
insert into accounts(actno, balance) values (2222222,2000)
commit
这样一来,事物TA第2次执行相同查询时得到账户余额在1000和3000之间的账户数就变为501个了,这样两次查询结果不一致!这种不一致是由于insert语句扎入了满足范围条件的新记录行导致的(注意与"不可重复读"的区别)。
4. Serializable(可串行化)
"可串行化"是ANSI SQL中定义的最高事物隔离级别。在这种隔离级别下,事物可以重复多次执行相同查询,并且每次都能够得到完全相同的结果。在这种隔离级别下,其他事物不能插入任何将出现在结果集中的记录行,从而可以解决"幻像读"问题(参见前面有关"幻像读"的例子)。
读取数据如下:
-2709363171357338787
8198153407774009605
-3487502777657169621
780058357012435560
-5000640981123956120
-2821494704275498339
-2425956167199689235
-9011993965288702187
1708607274409042905
6002422013389288836
-2064567574901603426
8674852667706047769
377931308804466091
2004615724147687284
-486574254389256041
8117756139014843207
-4497748372325528577
4517644586513436790
-2451289459080009547
3235176669837675122
-5777896639697768785
341018209886538040
-248752558554698112
3695141408112736151
-7997662361159449950
212821422613202010
-294409163655268084
4518187912517456276
-6258722245610832837
7555051128934922001
-2563812029577661172
-8987855923191418848
-6535855513250128448
7647637506402175787
-5999989679990946649
-524696247291654558
4519174811055014556
932422716846628974
298578870777511097
-4858117309282232497
3581843498415465799
-1130885605335979942
4263705493882513384
-1335960542939031169
-483360142662101861
7167819713847047518
7219827211832149163
8679748020396397022
1566921127311075439
8974460389557478243
执行完毕,效果显而易见。大家看看。