暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

剖析KingbaseES自治事务核心

原创 jack 2023-09-19
181

数据库自治事务指的是在当前事务(主事务)上开启的另一个完全独立的事务,执行自治事务程序时,主事务将挂起,退出自治事务,主事务会继续。因此,就时间线而言,主事务启动自治事务后会暂时挂起,等待自治事务执行完毕后才再次运行。类似的子事务也具有相同的时间序,但是自治事务和主事务有本质的区别

自治事务的本质也是一个事务,所以自治事务可以commit和rollback。自治事务程序正常执行结束后,自治事务内执行的所有操作会被提交并持久化;如果自治事务抛出异常,那么主事务能够捕获其抛出异常,然后用户可能根据其异常进行相应处理。

因为自治事务能独立地被提交,而不影响主事务,所以自治事务可以用来做独立的数据处理。基于此,自治事务可以用于错误日志记录、数据库审计等场景。

如果主事务所在的程序抛出异常,而我们想要记录该异常信息,直接使用INSERT语句向日志表中插入此异常信息显然是行不通的,因为如果触发了事务回滚将导致该条日志信息被清理。所以在这种情况下使用自治事务就能达到独立记录错误日志信息的目的。下图给出了一个自治事务记录错误日志的示例。
create or  replace procedure write_err_log(err_msg text)  as
 pragma autonomous_transaction;
begin 
insert into err_log values(sysdate,err_msg);
commit;
end;



create or replace procedure select_name 
as 
 name varchar2(20);
 past_due  EXCEPTION;
cur cursor is select name from  account where age = 20 ;
begin 
update account set age=21 where id =1 ;
open cur ;
fetch cur into name ;
close cur ;
if name is null then 
 raise past_due;
end  if;
exception   
  when past_due then 
     call write_err_log(sqlerrm);
end;


主事务UPDATE操作执行完成后,再进行fetch into时未读到数据,此时name为空,进入异常处理块,然后调用程序write_err_log开启自治事务,挂起主事务,等待自治事务程序write_err_log将错误信息插入到日志表err_log中,结束自治事务,主事务继续,由于主事务已经出错并且事务并未提交,所以test表中的数据将被回滚。由此可见,自治事务很适合做独立的数据处理,特别是用于记录错误日志。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论