MYSQL教程之AUTONOMOUS TRANSACTION(自治事件)的介...
尽管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缺少了一些人们想要的功能。 这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片? 呵呵,这就是偶想说的 多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油 我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过! 连做梦都在想页面结构是怎么样的,绝非虚言 然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情 你可以简单地认为适合的就是好,不适合就是不好。
页:
[1]