public inbox for [email protected]  
help / color / mirror / Atom feed
From: =?gb18030?B?TGlDaG9uZw==?= <[email protected]>
To: =?gb18030?B?cGdzcWwtb2RiY0Bwb3N0Z3Jlc3FsLm9yZw==?= <[email protected]>
Subject: during call SQLFreeHandle, the connection is broken. client can't be notified.
Date: Tue, 5 Dec 2023 20:37:19 +0800
Message-ID: <[email protected]> (raw)

你好


事务场景下,SQLFreeHandle调用进行中,连接断开,但是SQLFreeHandle返回SQL_SUCCESS。由于SQLFreeHandle调用连接断开,触发cc_on_abort,将事务取消,在客户端执行commit时,没有与服务端交互并且返回成功,导致客户端以为数据已提交,导致丢数据。


In a transaction scenario, the connection is disconnected while the SQLFreeHandle call is in progress, but SQLFreeHandle returns SQL_SUCCESS. Because the connection is disconnected by the SQLFreeHandle call, the cc_on_abort is triggered, the transaction is canceled, and the client performs a commit without interacting with the server and returning success, causing the client to think that the data has been submitted, resulting in data loss.



call step:
SQLAllocHandle1
sql1
SQLFreeHandle1
SQLAllocHandle2
sql2
SQLFreeHandle2
commit


during&nbsp;call SQLFreeHandle2, the connection&nbsp;is broken. client can't&nbsp;be&nbsp;notified.
we modify the code, in statement.c&nbsp;SC_Destructor and PGAPI_FreeStmt,&nbsp;&nbsp;Is there any other better solution to this problem? Please share your thoughts and suggestions, thanks.




below is psqlodbc log, debug=2
--------------
[7f5843a3a700]&nbsp; &nbsp; bind.c[PDATA_free_params]689: leaving
[7f5843a3a700] results.c[PGAPI_MoreResults]2035: leaving 100
[7f5843a3a700]odbcapi30.[SQLFreeHandle]250: Entering
[7f5843a3a700]statement.[PGAPI_FreeStmt]248: entering...hstmt=0x7f583c044600, fOption=1
[7f5843a3a700] qresult.c[QR_Destructor]344: entering
[7f5843a3a700]statement.[SC_init_Result]536: leaving(0x7f583c044600)
[7f5843a3a700]statement.[SC_Destructor]483: entering self=0x7f583c044600, self-&gt;result=(nil), self-&gt;hdbc=0xe27cc0
[7f5843a3a700]connection[CC_send_query_append]1809: conn=0xe27cc0, query='DEALLOCATE "_PLAN0x7f583c044600"'
[7f5843a3a700]connection[CC_send_query_append]1891: query_len=32
[7f5843a3a700]connection[CC_send_query_append]1935: [QLOG]PQsendQuery: 0xdf4990 'SAVEPOINT _per_query_svp_;DEALLOCATE "_PLAN0x7f583c044600";RELEASE _per_query_svp_'
[7f5843a3a700] qresult.c[QR_Constructor]173: entering
[7f5843a3a700] qresult.c[QR_Constructor]242: leaving 0x7f583c030380
[7f5843a3a700]connection[handle_pgres_error]864: PG_DIAG_SEVERITY_NONLOCALIZED=(null)
[7f5843a3a700]connection[handle_pgres_error]883: [QLOG]	((null)) (null) '(null)'
[7f5843a3a700]connection[handle_pgres_error]950: error message=server closed the connection unexpectedly
	This probably means the server terminated abnormally
	before or while processing the request.
(137)
[7f5843a3a700]connection[CC_on_abort]1582: entering opt=2
[7f5843a3a700]connection[CC_on_abort]1604: [QLOG]PQfinish: 0xdf4990
[7f5843a3a700] qresult.c[QR_Destructor]344: entering
[7f5843a3a700] qresult.c[QR_close_result]255: entering
[7f5843a3a700] qresult.c[QR_free_memory]479: entering fcount=0
[7f5843a3a700] qresult.c[QR_free_memory]577: leaving
[7f5843a3a700] qresult.c[QR_close_result]319: leaving
[7f5843a3a700] qresult.c[QR_Destructor]348: leaving
[7f5843a3a700]&nbsp; &nbsp; bind.c[APD_free_params]643: entering self=0x7f583c0447e0
[7f5843a3a700]&nbsp; &nbsp; bind.c[APD_free_params]655: leaving
[7f5843a3a700]&nbsp; &nbsp; bind.c[IPD_free_params]698: entering self=0x7f583c044850
[7f5843a3a700]&nbsp; &nbsp; bind.c[IPD_free_params]709: leaving
[7f5843a3a700]&nbsp; &nbsp; bind.c[PDATA_free_params]663: entering self=0x7f583c044948
[7f5843a3a700]&nbsp; &nbsp; bind.c[PDATA_free_params]689: leaving
[7f5843a3a700]statement.[SC_Destructor]526: leaving
[7f5843a3a700]odbcapi30.[SQLEndTran]171: Entering
[7f5843a3a700] execute.c[PGAPI_Transact]1208: entering hdbc=0xe27cc0, henv=(nil)
[7f5843a3a700]odbcapi30.[SQLAllocHandle]40: Entering
[7f5843a3a700]statement.[PGAPI_AllocStmt]189: entering...



Best Wishes


LiChong
[email protected]



&nbsp;

Attachments:

  [application/octet-stream] statement.c (85.0K, 3-statement.c)
  download

view thread (2+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected]
  Subject: Re: during call SQLFreeHandle, the connection is broken. client can't be notified.
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox