活着的死人 发表于 2015-1-16 22:48:52

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缺少了一些人们想要的功能。

第二个灵魂 发表于 2015-1-20 05:03:00

这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?

爱飞 发表于 2015-1-27 15:43:40

呵呵,这就是偶想说的

谁可相欹 发表于 2015-2-5 07:59:47

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

透明 发表于 2015-2-11 08:05:20

我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!

愤怒的大鸟 发表于 2015-3-2 00:13:00

连做梦都在想页面结构是怎么样的,绝非虚言

柔情似水 发表于 2015-3-17 17:31:20

然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情

兰色精灵 发表于 2015-3-24 15:45:50

你可以简单地认为适合的就是好,不适合就是不好。
页: [1]
查看完整版本: MYSQL教程之AUTONOMOUS TRANSACTION(自治事件)的介...