powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring @Transactional autocommit=false транзакции не коммитятся
25 сообщений из 28, страница 1 из 2
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544644
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нахожусь в процесе изучения Spring. Есть проект на JDBC, в котором используются apache BasicDataSource и Spring DataSourceTransactionManager. Работа с БД достаточно простая, но для себя хочу разобраться с управлением транзакциями.

Вот методы @Service слоя:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE,
            readOnly = false, rollbackFor = MovieCatalogException.class)
    public void add(User user) throws MovieCatalogSystemException, EntityAlreadyExistsException, ValidationMovieCatalogException, CantAddEntityException {

        userDao.alreadyExists(user);
        UserValidator.validate(user);
        userDao.add(user);

    }

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE,
            readOnly = false, rollbackFor = MovieCatalogException.class)
    public void delete(User user) throws CantDeleteEntityException, MovieCatalogSystemException {

        String tr = TransactionSynchronizationManager.getCurrentTransactionName(); // for debug
        userDao.delete(user);

    }



Вот настройки спринга:

context.xml

<context:annotation-config/>

<context:component-scan base-package="net.muzichko.moviecatalog.dao"/>
<context:component-scan base-package="net.muzichko.moviecatalog.service"/>

<import resource="data.xml"/>
<import resource="security.xml"/>

data.xml

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/moviecatalog" />
<property name="username" value="admin" />
<property name="password" value="200206" />
<property name="defaultAutoCommit" value="false"/>
<property name="initialSize" value="3"/>
</bean>

Есть тесты, в которых используется альтернативный контекст спринга. Реально он сейчас такой же как основной.
Проблема: код нормально работает только в режиме autocommit=true (и то, как я подозреваю, при высокой нагрузке может упасть). При включения режима autoommit=false в BasicDataSource транзакции не коммитятся. Я это вижу на таком тесте:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Test
    public void DeleteExistingUser() throws MovieCatalogException {

        User user = new User("test", randomEnglishSymbolString(10), randomEmail());
        userService.add(user);
        userService.delete(user);

    }



После метода add добавленные записи отсуствуют в БД. Работает нормально на локальных транзакциях.

Транзакции внутри методов add и delete существуют.
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544674
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell,
debug sql идущих в бд
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544719
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

И вот тут я обнаружились недостатки моего логирования.
Ручками пришлось собирать, надеюсь я правильно поняла, что вы спрашивате:

select * from users where login = 'test';
select * from users where email = select * from users where email = 'jyk6k1xmi7qjzm1@mail.ru'
insert into users(login, password, email) values('test','kbfrvsuwqf','jyk6k1xmi7qjzm1@mail.ru');
select id from users where login = 'test';";

delete from users where id = 1336;";
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544724
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StringerBell,

не знаю как отредиктировать сообщение, второй sql:

select * from users where email = 'jyk6k1xmi7qjzm1@mail.ru'
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544773
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBellselect id from users where login = 'test';";
delete from users where id = 1336;";
в чём вопрос?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544818
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123StringerBellselect id from users where login = 'test';";
delete from users where id = 1336;";
в чём вопрос?


1. select * from users where login = 'test';
2. select * from users where email = select * from users where email = 'jyk6k1xmi7qjzm1@mail.ru'
3. insert into users(login, password, email) values('test','kbfrvsuwqf','jyk6k1xmi7qjzm1@mail.ru');
4. select id from users where login = 'test';";
5. delete from users where id = 1336;";

1 и 2 - это относится к проверке уникальности, существования записи в бд с таким логином-имейлом, который мы пытаемся добавить


5. - это операция после успешного insert для подхвата айдишника, сгенерированного БД


1-4 относятся к транзакции add
5 - транзакция delete


вопрос в том, что 1-4 не коммитится вообще

в режиме autocommit=true работает все
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544834
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell ,
Покажите полный код вашего теста. Если вы используете спринговые обертки для тестов, то у них может стоять роллбэк транзакций, созданных в тесте по дефолту.
Как вариант - попробуйте это все сделать не через тест, а через public static void main().
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544872
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell,
ничего не понял.
- как узнал что нет коммита?
- если по наличию записи, то ты же сразу после вставки её удалил. Т.е. зачем операция 5?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544874
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv StringerBell ,
Покажите полный код вашего теста. Если вы используете спринговые обертки для тестов, то у них может стоять роллбэк транзакций, созданных в тесте по дефолту.
Как вариант - попробуйте это все сделать не через тест, а через public static void main().

Обертки для тестов я не использую, поскольку еще новичек и не знаю об их существовании. Хотя , кстати, такая штука реально нужна. Мои тесты сейчас забивают базу рандомным мусором.

По тесту:

Код: 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.
public class UserTest {

    private ApplicationContext context;
    private UserService userService;

    @Before
    public void setUp(){


        context = new ClassPathXmlApplicationContext("context-test.xml");
        userService = (UserService) context.getBean("UserService");

    }

    @Test
    public void testAddNewUniqueUser() throws MovieCatalogException {

        User user = new User(randomEnglishSymbolString(20), randomEnglishSymbolString(10), randomEmail());
        userService.add(user);

        User userFromDb = userService.getById(user.getId());

        if(!user.equals(userFromDb)){
            throw new AssertionError("New user isn't equal to new user from DB.");
        }
    }




Есть версия в интернетах, что моя проблема из-за того, что для тестов используется другой context-test.xml (внутри он идентичен основному context.xml).

Как считаете?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544886
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123StringerBell,
ничего не понял.
- как узнал что нет коммита?
- если по наличию записи, то ты же сразу после вставки её удалил. Т.е. зачем операция 5?

смысл теста: создать нового юзера, коммит(1-4), удалить его же, коммит (5). нет экспешенов - тест успешен

в тесте 2 транзакции , вторая delete использует результат коммита первой

в других тестах то же самое - они падают и по их поведению можно понять,что нет коммита

по факту записи в бд создаются только в режиме autocommit=true
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544895
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjv StringerBell ,
Покажите полный код вашего теста. Если вы используете спринговые обертки для тестов, то у них может стоять роллбэк транзакций, созданных в тесте по дефолту.
Как вариант - попробуйте это все сделать не через тест, а через public static void main().

через main тот же результат
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544916
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell,
хм....спринг не знаю, поэтому - OFF
А у спринга что в доках по поводу автокоммита?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544940
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell,
уровень изоляции почему такой?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544942
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123StringerBell,
хм....спринг не знаю, поэтому - OFF
А у спринга что в доках по поводу автокоммита?

autocommit к спрингу вообще-то не относится (спецы поправьте, если ошибаюсь). Autocommit - это cвойство коннекшена. Их выдает BasicDataSource сразу с установленным значением. По дефолту стоит true - это значит что коммитится после каждого sql statement. Если мы его отключаем - коммит перекладывается на spring. Но у меня что-то не перекладывается.
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544952
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123StringerBell,
уровень изоляции почему такой?

для максимальной согласованности

в методах чтения такой:

Код: java
1.
2.
3.
4.
5.
6.
    @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
    public List<MovieCatalogEntity> list() throws MovieCatalogSystemException, CantGetEntityListException {

        return userDao.list();

    }
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544964
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBellдля максимальной согласованности
в каком смысле?
- "уровень изоляции" - самый последний атрибут для регулировки простым смертным.
Совет:
поставь аннотацию по дефолту, либо вообще одно слово @Transactional
либо добавь в аннотацию обработку исключений и трейс сюда.
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544974
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123StringerBellдля максимальной согласованности
в каком смысле?
- "уровень изоляции" - самый последний атрибут для регулировки простым смертным.
Совет:
поставь аннотацию по дефолту, либо вообще одно слово @Transactional
либо добавь в аннотацию обработку исключений и трейс сюда.



Цель:
Нахожусь в процесе изучения Spring. Есть проект на JDBC, в котором используются apache BasicDataSource и Spring DataSourceTransactionManager. Работа с БД достаточно простая, но для себя хочу разобраться с управлением транзакциями.
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544986
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell,
всё понятно.
Совет см.выше.
Удачи!
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38544993
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBell,

А зачем вам SERIALIZABLE ?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38545001
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
User.equals переопределен? Или что вообще в тесте происходит?
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38545007
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczStringerBell,

А зачем вам SERIALIZABLE ?

Так аргументированно посоветовал знакомый тимлид. То есть в рамках транзакции максимальная согласованность данных.
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38545020
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczUser.equals переопределен? Или что вообще в тесте происходит?

Equals переопределен.
В тесте происходит попытка удаления существующего в бд юзера.

Я новичек, так что тесты , наверное, не сильно правильные, но все же лучше чем ничего.
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38545031
StringerBell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczStringerBell,

А зачем вам SERIALIZABLE ?

Понижение до REPEATABLE_READ дает тот же результат
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38545212
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBellBlazkowiczStringerBell,

А зачем вам SERIALIZABLE ?

Понижение до REPEATABLE_READ дает тот же результат
второй раз говорю - оставь одно слово @Transactional и проверь
...
Рейтинг: 0 / 0
Spring @Transactional autocommit=false транзакции не коммитятся
    #38545215
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StringerBellREPEATABLE_READ
это разве по умолчанию?
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring @Transactional autocommit=false транзакции не коммитятся
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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