|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
尽管MySQL也有一个认证培训项目,但是它的培训却要比Oracle或MS-SQL相差很远。尽管有的使用MySQL的用户表示,MySQL很容易上手,但是对于具有企业级数据库需求的用户来说,
在基于低版本的ORACLE做一些项目标过程当中,偶然会碰到一些头疼的成绩.,好比想在实行以后一个由多个DML构成的transaction(事件)时,为每步DML纪录一些信息到跟踪表中,因为事件的原子性,这些跟踪信息的提交将决意于主事件的commit或rollback.如许一来写程序的难度就增年夜了,程序员不能不把这些跟踪信息纪录到相似数组的布局中,然后在主事件停止后把它们存进跟踪表.哎,真是贫苦!
有无一个复杂的办法办理相似成绩呢?
ORACLE8i的AUTONOMOUSTRANSACTION(自治事件,以下AT)是一个很好的回覆。
AT是由主事件(以下MT)挪用可是自力于它的事件。在AT被挪用实行时,MT被挂起,在AT外部,一系列的DML能够被实行而且commit或rollback.
注重因为AT的自力性,它的commit和rollback其实不影响MT的实行效果。在AT实行停止后,主事件取得把持权,又能够持续实行了。
见:
:
怎样完成AT的界说呢?我们来看一下它的语法。实在十分复杂。
只需以下PL/SQL的声明部分加上PRAGMAAUTONOMOUS_TRANSACTION就能够了。
1.顶级的匿名PL/SQL块
2.Functions或Procedure(自力声明或声明在package中都可)
3.SQLObjectType的办法
4.触发器。
好比:
在一个自力的procedure中声明AT
CREATEORREPLACEPROCEDURE
Log_error(error_msgINVARCHAR2(100))
IS
PRAGMAAUTONOMOUS_TRANSACTION;
BEGIN
InsertintoError_logvalues(sysdate,error_msg);
COMMIT;
END;
上面我们来看一个例子,(win2000advancedserver+oracle8.1.6,connectasscott)
创建一个表:
createtablemsg(msgvarchar2(120));
起首,用一般的事件写个匿名PL/SQL块:
declare
cntnumber:=-1;--}Globalvariables
procedurelocalis
begin
selectcount(*)intocntfrommsg;
dbms_output.put_line(local:#ofrowsis||cnt);
insertintomsgvalues(NewRecord);
commit;
end;
begin
deletefrommsg;
commit;
insertintomsgvalues(Row1);
local;
selectcount(*)intocntfrommsg;
dbms_output.put_line(main:#ofrowsis||cnt);
rollback;
local;
insertintomsgvalues(Row2);
commit;
local;
selectcount(*)intocntfrommsg;
dbms_output.put_line(main:#ofrowsis||cnt);
end;
运转了局(注重翻开serveroutput)
local:#ofrowsis1->子程序local中能够’看到’主匿名块中的uncommitted纪录
main:#ofrowsis2->主匿名块能够’看到’2笔记录(它们都是被localcommit失落的)
local:#ofrowsis2->子程序local起首’看到’2笔记录,然后又commit了第三笔记录
local:#ofrowsis4->子程序local又’看到’了新增添的纪录(它们都是被localcommit失落的),然后又commit了第五笔记录
main:#ofrowsis5->主匿名块最初’看到’了一切的纪录.
从这个例子中,我们看到COMMIT和ROLLBACK的地位不管是在主匿名块中大概在子程序中,城市影响到全部以后事件.
如今用AT改写一下匿名块中的procedurelocal:
...
procedurelocalis
pragmaAUTONOMOUS_TRANSACTION;
begin
...
从头运转(注重翻开serveroutput)
local:#ofrowsis0->子程序local中没法能够’看到’主匿名块中的uncommitted纪录(由于它是自力的)
main:#ofrowsis2->主匿名块能够’看到’2笔记录,但只要一条是被commited.
local:#ofrowsis1->子程序local中能够’看到’它前一次commit的纪录,可是主匿名块中的纪录已被提早rollback了
local:#ofrowsis3->子程序local中能够’看到’3笔记录包含主匿名块commit的纪录
main:#ofrowsis4->主匿名块最初’看到’了一切的纪录.
很分明,AT是自力的,在它实行时,MT被停息了.AT的COMMIT,ROLLBACK其实不影响MT的实行.
使用AT时,有一些注重事项,复杂枚举以下:
1.在匿名PL/SQL块中,只要顶级的匿名PL/SQL块能够被设为AT
2.假如AT试图会见被MT把持的资本,大概有deadlock产生.
3.Package不克不及被声明为AT,只要package所具有的function和procedure才干声明为AT
4.AT程序必需以commit或rollback开头,不然会发生Oracle毛病ORA-06519:activeautonomoustransactiondetectedandrolledback
在程序开辟时,假如充实使用AUTONOMOUSTRANSACTION的特征,必定能获得事半功倍的效果.
参考材料:
metalink.oracle.com
oracle8imanual
对于IT经理来说,令他们喜欢的MySQL的简单性还有另一方面。MySQL可以运行的更快速。某些人或许会说MySQL缺少了一些人们想要的功能。 |
|