Связывает ли диспетчер транзакций Spring соединение с потоком?

Я нашел следующий поток: Как именно JdbcTemplate с TransactionManager работает вместе?

Первая фраза этого:

Насколько я понял, DataSourceTransactionManager связывает JDBC-соединение из указанного источника данных с текущим потоком, позволяя использовать одно связанное с потоком соединение для каждого источника данных. Если это пул соединений, он возьмет одно из доступных соединений.

... это именно то, что я хочу знать.

При использовании диспетчера транзакций вы получаете каждый поток, имеющий свое собственное единственное соединение? Кроме того, как долго живет эта связь? Использует ли один и тот же поток одно и то же соединение для одного запроса или происходит что-то еще? Я просто пытаюсь понять, что именно делает Spring, когда у вас есть менеджер транзакций, а когда нет (независимо от того, есть ли у вас транзакция или нет).


person dnc253    schedule 13.02.2012    source источник


Ответы (1)


При использовании диспетчера транзакций вы получаете каждый поток, имеющий свое собственное единственное соединение? Кроме того, как долго живет эта связь?

Соединение обычно получается из пула соединений. Соединение заимствовано из пула, когда менеджер транзакций запускает транзакцию, а затем возвращается в пул, когда транзакция завершается. В течение этого времени соединение привязывается к потоку.

Использует ли один и тот же поток одно и то же соединение в рамках одного запроса?

Он использует одно и то же соединение на протяжении всей транзакции. Сам запрос не имеет значения.

независимо от того, действительно ли у вас есть транзакция

У вас всегда есть транзакция, независимо от того, делаете вы это явно или нет. Если вы не настроите его явно, то драйвер JDBC и база данных будут запускать и завершать его столько времени, сколько потребуется для выполнения одной операции. Управление транзакциями в Spring (или управление транзакциями в любой другой среде) позволяет продлить время существования этой транзакции для нескольких операций. Для этого требуется исключительное использование соединения на время транзакции.

person skaffman    schedule 14.02.2012
comment
Благодарю за ваш ответ. Это помогает мне немного лучше понять, что происходит. Я понимаю, как управление транзакциями позволяет транзакциям расширяться для нескольких операций. Однако в моем случае у меня есть @Transactional(propagation=Propagation.SUPPORTS) для каждого из моих методов DAO, что означает, что каждый вызов будет использовать свою собственную независимую транзакцию. После того, как менеджер получает начальное соединение из пула, связывает ли он это соединение с текущим потоком, а затем извлекает его оттуда на время жизни потока вместо того, чтобы вернуться в пул, чтобы получить соединение? - person dnc253; 14.02.2012
comment
каждый вызов будет использовать свою собственную независимую транзакцию - это неверно. Ваш DAO унаследует любую существующую транзакцию, которая уже привязана к потоку. он не запустит новый, если он еще не связан. - person skaffman; 14.02.2012
comment
Я предполагаю, что то, как я определяю транзакцию, не совсем правильно. То, как я понял транзакцию, - это когда у вас есть одна операция с БД (которая может иметь любое количество обновлений, вставок и т. д.). Все это происходит или ничего не происходит. При настройке DAO каждый метод будет работать с БД независимо от других методов. Если один метод дает сбой, это не повлияет на то, какие операции выполнялись другими методами до или после отказа. Итак, что же такое транзакция? Я думал, что каждый метод будет создавать свою собственную новую транзакцию, но, видимо, это не так? - person dnc253; 15.02.2012
comment
Ребята, вы знаете, каково время жизни соединения, полученного DataSourceTransactionManager? - person Giovanni Botta; 26.07.2013
comment
когда соединение закрыто? когда завершается метод jdbctemplate или когда завершается фактическая транзакция? - person Kalpesh Soni; 19.09.2013