Выбор ответа Middle JDBC и транзакции обновлено

Транзакция на двух соединениях

Вопрос

Метод берёт два разных соединения из пула, на первом делает списание, на втором зачисление, на обоих setAutoCommit(false) и потом commit() по очереди. Что не так?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Это две независимые транзакции, и атомарности между ними нет. Транзакция принадлежит соединению.

Варианты ответа

  1. Ничего: JDBC держит одну транзакцию на поток, и оба коммита в ней
  2. Второе соединение не увидит изменений первого и упадёт с ошибкой
  3. Это две независимые транзакции, и атомарности между ними нетправильный ответ
  4. Пул не позволит взять два соединения в одном потоке и вернёт то же

Разбор

Транзакция принадлежит соединению. Два соединения дают две транзакции: если между коммитами произошёл сбой, деньги спишутся, но не зачислятся. Обе операции должны идти через одно Connection (Spring связывает его с потоком сам). Понятия «одна транзакция на поток» в JDBC нет. Пул спокойно выдаст два соединения, что ещё и чревато дедлоком пула под нагрузкой.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.