kdb 中的 upsert 线程安全吗

Is upsert thread safe in kdb

我在服务器(端口 5001)中有一个 table`t。

t:([] sym:`GOOG`AMZN; px:100 2000)

我们有两个客户端同时将数据更新到 table t。

Client 1:
h:hopen 5001
do[10; h"`t upsert ({x}rand `GOOG`AMZN;{x}rand 10)"]

Client 2:
h:hopen 5001
do[10; h"`t upsert ({x}rand `GOOG`AMZN;{x}100+rand 10)"]

基于上述场景,我有两个问题:
1. 当多个 threads/processes 同时更新 table 时,upsert 线程是否安全?
2. 如果 table t 在 sym 列上键入,线程行为是否相同?

在使用 kdb 时,您通常不必担心线程安全(除非您使用自己的 C 代码做一些复杂的事情,从而产生自己的线程或其他东西)。原因是只有一个线程负责处理用户查询,来自客户端 1 和客户端 2 的查询将一次处理一个。

有一种所谓的多线程输入查询输入模式(https://code.kx.com/q/kb/multithreaded-input/),但它有自己的限制,这意味着您永远不会遇到不一致的读取。

可以假定线程安全,如果操作不是线程安全的,kdb 将抛出 noupdate 错误。在您的情况下,kdb 一个接一个地处理 IPC 调用,因此绝对是线程安全的,upsert 不是以多线程方式执行的。

多个进程同时向同一个 table 更新插入将是一个问题,但是不要尝试这样做。