database - Scala 异步数据库调用

标签 database postgresql scala asynchronous slick

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

我如何确保在这个异步的数据库通信世界中我可以保持数据完整性?在我的版本控制案例中,我首先会选择最大版本,这会返回一个 Future,然后我使用这个 Future 的结果,递增 1 并发出一个创建命令!

很可能线程 1 从选择最大版本开始并暂停了一段时间,线程 2 迎合新请求可以运行选择最大版本并递增并在数据库中写入新记录。现在 thread1 返回并尝试执行相同的进程,但结果是 thread1 会覆盖 thread2 在数据库中写入的内容。

可能我最终会得到多个重复项,因为多个 future 的运行顺序可能不同!

最佳答案

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

关于database - Scala 异步数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30421500/

相关文章:

postgresql - Kubernetes:数据库和数据库用户

php - 我怎样才能使这个 mysql 查询工作而不会得到空结果?

database - BigTable 是面向对象的数据库吗?

Postgresql 错误 : could not load library plpgsql. 所以 undefined symbol

PostgreSQL 客户端无法解析 Docker 容器中的主机名

scala - 如何让IntelliJ识别Scala脚本中的导入?

Scala 命名参数

java - Play Framework 2.3.x 外部资源/上传文件夹

mysql - 使用 Joins 和 Where 插入表中

java - com.mysql.jdbc.driver 类未找到异常