【发布时间】:2015-05-24 17:43:46
【问题描述】:
我目前正在使用 Slick 3.x.x,它在对数据库的所有调用中都是完全异步的。比方说,我有一个具有某种版本控制的表。每次我从已经存在的条目创建新条目(即更新给定条目)时,我必须确保增加版本号。
在这个异步的数据库通信世界中,我如何确保我可以保持数据完整性?在我使用版本控制的情况下,我会首先选择最大版本,这会给我一个 Future,然后我使用这个 Future 的结果,递增 1 并发出一个创建命令!
很有可能线程 1 以 select max version 开始并暂停了一段时间,满足新请求的线程 2 可以运行 select for max version 并递增并在数据库中写入新记录。现在 thread1 回来并尝试执行相同的进程,但结果只是导致 thread1 会覆盖 thread2 在数据库中写入的内容。
这可能是因为多个期货的运行顺序可能不同,所以我最终可能会有多个重复!
【问题讨论】:
标签: database postgresql scala asynchronous slick