Заблокируйте строку БД с помощью подсказки UPDLOCK и запустите некоторый код, который необходимо синхронизировать между виртуальными машинами. - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь выполнить блокировку 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) будет вызван выше, что сделает поток операций небезопасным

...