Выбор ответа Middle JDBC и транзакции обновлено
Транзакция на двух соединениях
Вопрос
Метод берёт два разных соединения из пула, на первом делает списание, на втором зачисление, на обоих setAutoCommit(false) и потом commit() по очереди. Что не так?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Это две независимые транзакции, и атомарности между ними нет. Транзакция принадлежит соединению.
Варианты ответа
- Ничего: JDBC держит одну транзакцию на поток, и оба коммита в ней
- Второе соединение не увидит изменений первого и упадёт с ошибкой
- Это две независимые транзакции, и атомарности между ними нетправильный ответ
- Пул не позволит взять два соединения в одном потоке и вернёт то же
Разбор
Транзакция принадлежит соединению. Два соединения дают две транзакции: если между коммитами произошёл сбой, деньги спишутся, но не зачислятся. Обе операции должны идти через одно Connection (Spring связывает его с потоком сам). Понятия «одна транзакция на поток» в JDBC нет. Пул спокойно выдаст два соединения, что ещё и чревато дедлоком пула под нагрузкой.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.