С областью действия implicit val session: DBSession
, конкретно как scalikejdbc.AutoSession
:
Обновления работают
sql"""
update payments set status=${status.name} where id in ($ids)
""".update().apply()
И выбирает работу
sql"""
select id
from payments
where status='valid'
""".map(_.long).list().apply()
Но обновлениевозврат столбцов завершается неудачно, потому что транзакция установлена только для чтения.
sql"""
update payments
set status='submitted'
where status='pending'
and scheduled <= ${ZonedDateTime.now.toInstant}
returning id
""".map(_.long).iterable().apply().toIterator
org.postgresql.util.PSQLException: ERROR: cannot execute UPDATE in a read-only transaction
.
session
соответствует SQLToResult
в предположении, что она должна быть только для чтения:
case AutoSession | ReadOnlyAutoSession => DB.readOnly(f)
Я пытался создать свой собственный DBSession
, чтобы избежать совпадения с этим шаблоном, но отказался от этого подхода.Самое близкое, что я получил к работе, было:
val writeableSession: DBSession = DBSession(session.connection, isReadOnly = false)
def inner()(implicit session: DBSession): Iterator[Payment] = {
sql"""
update payments
set status='submitted'
where status='pending'
returning id
""".map(_.long).iterable().apply().toIterator
}
inner()(writeableSession)
Это не удалось, потому что session.connection
было null
.
Как я могу заставить это быть localTx вместо readOnly?