Я пытаюсь выполнить блокировку UPDLOCK для строки таблицы БД, используя scala slick, а затем выполнить некоторые методы, чтобы эти методы оставались синхронизированными, пока я получаю результаты.
Есть ли способ сделать это, используяscala slick и ms sql server?
Я использую action.transactionally
с db.run
, но я подозреваю, что функция map
будет вызываться только после снятия и снятия блокировки.
Я запускаю запрос select * from db with (UPDLOCK) where something = a_thing
Вот фрагмент кода:
val action /*: DBIOAction[???]*/ =
for {
row <- groupDetailsRepository.selectBaseGroupForUpdate(groupDetailsBO.remoteGroupId)
} yield row
val f /*: Future[???]*/ = db.run(action.transactionally).
map { result =>
println("Merge running for OG : " + groupDetailsBO.remoteGroupId)
GroupHelperFunctions.startGroupMerging(groupDetailsBO, groupBatchMeta,
orderLineDetailsRepository, groupDetailsRepository)
}.recover {
case e: Exception =>
println("Exception while lockinf and merging groups")
e.printStackTrace()
throw e
}
Await.result(f, Duration(20, TimeUnit.SECONDS))
Я подозреваю, что блокировка будет получена и снята до того, как return GroupHelperFunctions.startGroupMerging(groupDetailsBO, groupBatchMeta, orderLineDetailsRepository, groupDetailsRepository)
будет вызван выше, что сделает поток операций небезопасным