当 Go 驱动程序检测到一个上下文被取消时,我认为它会空闲连接并将其返回到池中。这是否意味着它启动的正在运行的数据库操作也会在服务器上被终止?还是继续这样?
问问题
40 次
1 回答
1
您可以在此处阅读有关驱动程序如何使用上下文的官方文档。
相关部分:套接字读写:
当驱动程序为操作检索连接时,它将套接字的读取或写入期限设置为上下文期限或套接字超时,以较短者为准。
如果在
Read()
orWrite()
函数执行后但在其截止日期之前取消上下文,则驱动程序的行为会因版本而异。当
Read()
orWrite()
函数正在进行时,驱动程序会生成一个单独的 goroutine 来监听上下文取消。如果 goroutine 检测到取消,它将关闭连接。挂起的Read()
或Write()
函数返回一个错误,驱动程序用该错误覆盖该context.Canceled
错误。
请注意,关闭连接仅意味着将其以空闲状态放回池中。服务端并没有明确说明取消操作,但很明显是发送了一个信号,客户端放弃操作,不再监听/关心结果。如果可以的话,MongoDB 服务器会愚蠢地不中止已启动的操作。例如,如果操作是查询,则可以中止。如果是写入操作(例如插入或更新),则可能不会中止。
于 2022-01-19T23:40:34.470 回答