powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring jdbc + @Transaction не работает
14 сообщений из 14, страница 1 из 1
Spring jdbc + @Transaction не работает
    #38206425
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Помогите разобраться, почему не работает траназакшн менеджмент через аннотации.
Environment: spring 3.0, tomcat 6, mysql (InnoDB).

Если поставить брейкпоинт или выбросить исключение внутри метода save, то в базе появляется (остается) запись, сделанная до этого. Следовательно, подозреваю, что @Transaction не работает. В логах ничего от DataSourceTransactionManager нет.

Код ниже. Спасибо.

Spring context:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    <context:component-scan base-package="my.package" />
    <tx:annotation-driven transaction-manager="txManager" />

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="url" value="${jdbc.url}" />
        <property name="initialSize" value="5" />
        <property name="minIdle" value="10" />
        <property name="maxActive" value="100" />
        <property name="testOnBorrow" value="true" />
        <property name="maxWait" value="3000" />
        <property name="validationQuery" value="/* ping */ SELECT 1" />
    </bean>

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="defaultTimeout" value="30" />
	<property name="dataSource" ref="dataSource" />
    </bean>



Фрагмент контроллера:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        @Resource
	private SellerRepository sellerRepository;

	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public String save(@ModelAttribute("seller") Seller seller) {
		sellerRepository.save(seller);
		return "redirect:/profile/edit";
	}



Фрагмент Repository:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
@Repository("sellerRepository")
public class JdbcSellerRepository extends JdbcDaoSupport implements SellerRepository {

	@Autowired
	public JdbcSellerRepository(DataSource dataSource) {
		super.setDataSource(dataSource);
	}

	@Override
	@Transactional
	public void save(final Seller seller) {
		saveSeller(seller);
		for (final MenuItem menuItem : seller.getMenu()) {
			saveMenuItem(menuItem, seller.getId());
			for (final Dish dish : menuItem.getDishes()) {
				saveDish(dish, menuItem.getId());
			}
		}
	}

	private void saveSeller(final Seller seller) {
		getJdbcTemplate().update("update Seller set name = ?, description = ?, contacts = ?, imageUrl = ?, " +
				"workTime = ?, email = ? where id = ?",
				new PreparedStatementSetter() {
					@Override
					public void setValues(PreparedStatement ps) throws SQLException {
						ps.setString(1, seller.getName());
						ps.setString(2, seller.getDescription());
						ps.setString(3, seller.getContacts());
						ps.setString(4, seller.getImageUrl());
						ps.setString(5, seller.getWorkTime());
						ps.setString(6, seller.getEmail());
						ps.setLong(7, seller.getId());
					}
				});
	}

	private void saveMenuItem(final MenuItem menuItem, final Long sellerId) {
		if (menuItem.getId() != null) {
			getJdbcTemplate().update("update MenuItem set name = ?, imageUrl = ? where id = ?",
					new PreparedStatementSetter() {
						@Override
						public void setValues(PreparedStatement ps) throws SQLException {
							ps.setString(1, menuItem.getName());
							ps.setString(2, menuItem.getImageUrl());
							ps.setLong(3, menuItem.getId());
						}
					});
		} else {
			GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
			getJdbcTemplate().update(
					new PreparedStatementCreator() {
						@Override
						public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
							PreparedStatement ps = con.prepareStatement("insert into MenuItem (name, imageUrl, sellerId) values (?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
							ps.setString(1, menuItem.getName());
							ps.setString(2, menuItem.getImageUrl());
							ps.setLong(3, sellerId);
							return ps;
						}
					} , keyHolder);
			menuItem.setId((Long) keyHolder.getKey());
		}
	}
}
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206432
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgrinder, по умолчанию аннотация @Transactional не будет делать откат транзакции (rollback) при проверяемом исключении, а только для проверяемых. Проверить состояние транзакции можно методом
boolean active = TransactionSynchronizationManager.isActualTransactionActive();
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206433
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm, а только при не проверяемых исключениях*
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206434
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, конечно, под исключением имел в виду именно runtime. Проверил с помощью TransactionSynchronizationManager.isActualTransactionActive() - нет активной транзакции. К тому же, если бы транзакция создавалась, разве изменения в БД появились бы не после ее завершения? Сейчас они появляются по мере выполнения statement-ов.
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206436
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgrinderДа, конечно, под исключением имел в виду именно runtime. Проверил с помощью TransactionSynchronizationManager.isActualTransactionActive() - нет активной транзакции. К тому же, если бы транзакция создавалась, разве изменения в БД появились бы не после ее завершения? Сейчас они появляются по мере выполнения statement-ов.
Попробуй добавить в настройку логера вывод от org.springframework.transaction.annotation. c TRACE уровнем
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206439
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В логах ничего связанного с транзакциями не появилось.
Либо что-то не так делаю.

Пробовал:
log4j.logger.org.springframework.transaction=DEBUG
log4j.logger.org.springframework.transaction=TRACE

Похоже, что вообще не срабатывает AOP.
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206440
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgrinder, то что вы пишете в Spring context у вас в одном файле?
Может у вас tx... в dispather-servlet.xml?
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206441
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tx в persistence.xml,
а context:component-scan и mvc в applicationContext.xml,
еще есть security.xml

Фрагменты web.xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/context/*.xml
		</param-value>
	</context-param>

	<servlet>
		<servlet-name>webmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
				/WEB-INF/context/applicationContext.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206443
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdm, спасибо огромное!

Разнес по разным файлам <context:component-scan base-package="by.vsesushi" /> и контекст с настройкой mvc, и заработало.

Единственное, что хотелось бы понять, почему так. Буду благодарен за объяснение.
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206444
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgrinder, попробуй перенести bean txManager и <tx..> в applicationContext.
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206445
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgrinderrdm, спасибо огромное!

Разнес по разным файлам <context:component-scan base-package="by.vsesushi" /> и контекст с настройкой mvc, и заработало.

Единственное, что хотелось бы понять, почему так. Буду благодарен за объяснение.
Это к документации Spring, вот тут на русском http://mzungu-dev.livejournal.com/975.html, сам не читал, но вроде как раз по вашей теме.
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206446
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылка не работает.
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206448
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vgrinderСсылка не работает.
http://mzungu-dev.livejournal.com/975.html запятая попала)
...
Рейтинг: 0 / 0
Spring jdbc + @Transaction не работает
    #38206449
vgrinder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
))) Не заметил.
Буду читать. Большущее спасибо.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring jdbc + @Transaction не работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]