postgresql , 10.0 , 后台运行 , pg_background_launch , pg_background_result , pg_background_detach , pg_background
当用户在管理数据库时,如果要在交互式界面跑一些query,但是不知道query要运行多久,担心网络问题或者其他问题导致终端断开,query执行情况不明的话。就需要后台运行这个功能了。
后台运行在linux中也很常见,比如
这样的话,即使断开会话也没关系,这条命令会在后台运行,并将标准输出存入/tmp/result,标准错误也重定向到标准输出。
对于postgresql数据库,在10.0的这个特性出来之前,用户可以使用dblink的异步调用,达到类似的目的,但是不能断开会话,注意了。
使用dblink异步调用,可以达到后台运行的目的,但是别忘了,dblink连接是当前会话建立的,当前会话退出,连接也会退出。
断开本地会话,异步会话也会断开,未提交的异步事务自动回滚。
使用dblink异步接口,可以完成一些后台运行的功能,但是比较繁琐,也不完美(比如当前会话不能退出)
<a href="https://www.postgresql.org/docs/9.6/static/contrib-dblink-get-result.html">https://www.postgresql.org/docs/9.6/static/contrib-dblink-get-result.html</a>
postgresql 10.0 新增了background session的功能,这个功能可以对标类似oracle的自治事务的功能。(是plsql函数或存储过程迁移到postgresql plpgsql的有利兼容性,此前需要使用dblink模拟自治事务)
基于background session,开发了一个后台运行的管理接口。可以方便的执行后台事务了。
参考
<a href="https://github.com/digoal/blog/blob/master/201703/20170312_22.md">《postgresql 10.0 preview 功能增强 - 匿名、自治事务(oracle 兼容性)》</a>
一开始的设计比较简单,提供了三个api函数
最开始的讨论细节如下
社区讨论后,这个架构改成了这样的,架构更优雅一些。
讨论细节如下
后面的讨论又改成了这样,还是朝着优雅的方向在改进
这个patch在commit前,还有一些变数,比如可能将这个功能合并到dblink里面。而不是新开一个extension插件.
这个patch的讨论,详见邮件组,本文末尾url。
postgresql社区的作风非常严谨,一个patch可能在邮件组中讨论几个月甚至几年,根据大家的意见反复的修正,patch合并到master已经非常成熟,所以postgresql的稳定性也是远近闻名的。
<a href="https://commitfest.postgresql.org/13/893/">https://commitfest.postgresql.org/13/893/</a>
<a href="https://www.postgresql.org/message-id/flat/caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com#caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com">https://www.postgresql.org/message-id/flat/caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com#caaj_b97fro+y_-sogxgj-wpwtuwrmifgfgpvbxmavukqykvnva@mail.gmail.com</a>