Scala异步数据库调用

时间:2015-05-24 08:26:10

标签: database postgresql scala asynchronous slick

我目前正在使用Slick 3.x.x,它在对数据库的所有调用中都是完全异步的。让我们说,我有一个表有某种版本。每次我从现有条目创建一个新条目(即更新给定条目)时,我必须确保增加版本号。

如何在这个数据库通信的异步世界中确保我可以保持数据完整性?在我的版本控制的情况下,我会首先选择最大版本,它会给我一个Future,然后我使用Future的结果,增加1并发出一个create命令!

线程1很可能以select max version开始并暂停一段时间,满足新请求的线程2可以运行select for max version和increment并在数据库中写入新记录。现在thread1回来并尝试使用相同的进程,但只是为了导致thread1覆盖thread2在数据库中写入的内容。

可能我可能最终会有多个副本,因为多个期货的运行顺序可能会有所不同!

1 个答案:

答案 0 :(得分:3)

应用程序管理与数据库交互的异步不会改变数据库事务的语义。如果您想要原子的,一致的操作序列,那么您需要一个数据库事务。 Slick wikipedia一个名为transactionally的“组合器”,它将强制在数据库事务中运行一系列操作。