2016-08-15 4 views
1

Я пытаюсь написать SQL SELECT ... FOR UPDATE, используя Anorm in Play, чтобы я мог взаимодействовать с несколькими потоками с одной и той же базой данных, но это бросает проблему.SELECT ... FOR UPDATE с использованием Anorm

Код:

db.withConnection { implicit connection: Connection => 
     SQL""" 

      start transaction; 

      select * from push_messages where vendorId=$vendorId for update; 

      UPDATE push_messages set stageOne=$first, stageTwo=$second, stageThree=$third, 
      stageFour=$fourth, stageFive=$fifth, highestStage=$highestStage, iOSTotal=$iOSTotal, 
      androidTotal=$androidTotal, iOSRunningCount=$iOSRunningCount, androidRunningCount=$androidRunningCount, 
      problem=$newProblem, iOSComplete=$iOSCompleted, androidComplete=$newAndroidComplete, 
      totalStageThrees=$totalStageThrees, totalStageFours=$totalStageFours, expectedTotals=$expectedTotals, 
      startTime=$startTime, date=$date, topics=$topics, androidFailures=$androidFailures, iOSFailures=$iOSFailures where vendorId=$vendorId; 

      commit; 

     """.execute 
    } 

Но это, кажется, не нравится использование .execute на select заявлении. Есть ли хороший способ разбить это, чтобы сделать select...for update, чтобы я мог использовать либо execute(), либо executeUpdate?

Любая помощь будет оценена. Благодарю.

+0

Я не вижу, как вы намерены достичь лучшего многопоточности, используя «SQL SELECT ... FOR UPDATE» ... – cchantep

ответ

1

Как и большинство базовых библиотек JDBC, Anorm использует PreparedStatement для безопасного взаимодействия с БД, поэтому вы не должны передавать ему такую ​​строку нескольких операторов, но только один оператор для каждого вызова SQL.

Кроме того, около start transaction, вам лучше использовать способ JDBC для него (например, с помощью Play DB DB.withTransaction { ... }).