PostgreSQL 取消進(jìn)行中的查詢

2021-09-02 11:25 更新

一個客戶端應(yīng)用可以使用本節(jié)描述的函數(shù)請求取消一個仍在被服務(wù)器處理的命令。

PQgetCancel

創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)包含取消一個通過特定數(shù)據(jù)庫連接發(fā)出的命令所需要的信息。

PGcancel *PQgetCancel(PGconn *conn);

PQgetCancel 創(chuàng)建一個PGcancel 對象,給出一個 PGconn 連接對象。 他將返回NULL,如果給出的connNULL 或是一個無效的連接。 The PGcancel 對象是一個不透明結(jié)構(gòu),不應(yīng)該被應(yīng)用所直接訪問。它只能夠傳遞到 PQcancelPQfreeCancel。

PQfreeCancel

釋放一個由PQgetCancel創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。

void PQfreeCancel(PGcancel *cancel);

PQfreeCancel釋放一個之前由PQgetCancel創(chuàng)建的數(shù)據(jù)對象。

PQcancel

要求服務(wù)器放棄當(dāng)前命令的處理。

int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);

如果取消請求成功發(fā)送,則返回值為 1,否則為 0。如果不成功,則errbuf會被填充一個解釋性的錯誤消息。errbuf必須是一個尺寸為errbufsize的字符數(shù)組(推薦尺寸為 256 字節(jié))。,解釋為何不成功。errbuf必須是 一個大小為errbufsize的 char 數(shù)組(建議大小為 256 字節(jié))。

不過,成功的發(fā)送并不保證請求會有任何效果。如果取消有效,那么當(dāng)前的命令將提前終止并且返回一個錯誤結(jié)果。如果取消失敗(也就是說, 因為服務(wù)器已經(jīng)完成命令的處理),那么就根本不會有可見的結(jié)果。

如果errbuf是信號處理器中的一個局部變量,PQcancel可以從一個信號處理器中安全地調(diào)用。 在PGcancel有關(guān)的范圍內(nèi), PQcancel 都是只讀的,因此也可以在一個從操縱PGconn對象的線程中獨立出來的線程中調(diào)用它。

PQrequestCancel

PQrequestCancelPQcancel的一個被廢棄的變體。

int PQrequestCancel(PGconn *conn);

要求服務(wù)器放棄當(dāng)前命令的處理。它直接在PGconn對象上進(jìn)行操作, 并且如果失敗,就會在PGconn對象里存儲錯誤消息(因此可以用PQerrorMessage檢索出來)。 盡管功能相同,這個方法在多線程程序里和信號處理器里會帶來危險,因為它可能 覆蓋PGconn的錯誤消息,進(jìn)而將當(dāng)前連接上正在處理的操作搞亂。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號