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

Помогите разобраться, почему не работает траназакшн менеджмент через аннотации.
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
01.04.2013, 00:50:13
    #38206432
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
vgrinder, по умолчанию аннотация @Transactional не будет делать откат транзакции (rollback) при проверяемом исключении, а только для проверяемых. Проверить состояние транзакции можно методом
boolean active = TransactionSynchronizationManager.isActualTransactionActive();
...
Рейтинг: 0 / 0
01.04.2013, 00:51:01
    #38206433
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
rdm, а только при не проверяемых исключениях*
...
Рейтинг: 0 / 0
01.04.2013, 00:57:30
    #38206434
vgrinder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
Да, конечно, под исключением имел в виду именно runtime. Проверил с помощью TransactionSynchronizationManager.isActualTransactionActive() - нет активной транзакции. К тому же, если бы транзакция создавалась, разве изменения в БД появились бы не после ее завершения? Сейчас они появляются по мере выполнения statement-ов.
...
Рейтинг: 0 / 0
01.04.2013, 01:03:28
    #38206436
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
vgrinderДа, конечно, под исключением имел в виду именно runtime. Проверил с помощью TransactionSynchronizationManager.isActualTransactionActive() - нет активной транзакции. К тому же, если бы транзакция создавалась, разве изменения в БД появились бы не после ее завершения? Сейчас они появляются по мере выполнения statement-ов.
Попробуй добавить в настройку логера вывод от org.springframework.transaction.annotation. c TRACE уровнем
...
Рейтинг: 0 / 0
01.04.2013, 01:20:18
    #38206439
vgrinder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
В логах ничего связанного с транзакциями не появилось.
Либо что-то не так делаю.

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

Похоже, что вообще не срабатывает AOP.
...
Рейтинг: 0 / 0
01.04.2013, 01:26:12
    #38206440
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
vgrinder, то что вы пишете в Spring context у вас в одном файле?
Может у вас tx... в dispather-servlet.xml?
...
Рейтинг: 0 / 0
01.04.2013, 01:30:24
    #38206441
vgrinder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
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
01.04.2013, 01:36:19
    #38206443
vgrinder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring jdbc + @Transaction не работает
rdm, спасибо огромное!

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

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

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

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


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