|
|
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
Нахожусь в процесе изучения 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. Вот настройки спринга: 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. После метода add добавленные записи отсуствуют в БД. Работает нормально на локальных транзакциях. Транзакции внутри методов add и delete существуют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 10:55 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, debug sql идущих в бд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:12 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
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;"; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:29 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, не знаю как отредиктировать сообщение, второй sql: select * from users where email = 'jyk6k1xmi7qjzm1@mail.ru' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:31 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBellselect id from users where login = 'test';"; delete from users where id = 1336;"; в чём вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 11:53 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
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 работает все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:12 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell , Покажите полный код вашего теста. Если вы используете спринговые обертки для тестов, то у них может стоять роллбэк транзакций, созданных в тесте по дефолту. Как вариант - попробуйте это все сделать не через тест, а через public static void main(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:21 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, ничего не понял. - как узнал что нет коммита? - если по наличию записи, то ты же сразу после вставки её удалил. Т.е. зачем операция 5? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:36 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
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. Есть версия в интернетах, что моя проблема из-за того, что для тестов используется другой context-test.xml (внутри он идентичен основному context.xml). Как считаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:36 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
Petro123StringerBell, ничего не понял. - как узнал что нет коммита? - если по наличию записи, то ты же сразу после вставки её удалил. Т.е. зачем операция 5? смысл теста: создать нового юзера, коммит(1-4), удалить его же, коммит (5). нет экспешенов - тест успешен в тесте 2 транзакции , вторая delete использует результат коммита первой в других тестах то же самое - они падают и по их поведению можно понять,что нет коммита по факту записи в бд создаются только в режиме autocommit=true ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:43 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
cdtyjv StringerBell , Покажите полный код вашего теста. Если вы используете спринговые обертки для тестов, то у них может стоять роллбэк транзакций, созданных в тесте по дефолту. Как вариант - попробуйте это все сделать не через тест, а через public static void main(). через main тот же результат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:46 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, хм....спринг не знаю, поэтому - OFF А у спринга что в доках по поводу автокоммита? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 12:53 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, уровень изоляции почему такой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:02 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
Petro123StringerBell, хм....спринг не знаю, поэтому - OFF А у спринга что в доках по поводу автокоммита? autocommit к спрингу вообще-то не относится (спецы поправьте, если ошибаюсь). Autocommit - это cвойство коннекшена. Их выдает BasicDataSource сразу с установленным значением. По дефолту стоит true - это значит что коммитится после каждого sql statement. Если мы его отключаем - коммит перекладывается на spring. Но у меня что-то не перекладывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:03 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
Petro123StringerBell, уровень изоляции почему такой? для максимальной согласованности в методах чтения такой: Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:04 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBellдля максимальной согласованности в каком смысле? - "уровень изоляции" - самый последний атрибут для регулировки простым смертным. Совет: поставь аннотацию по дефолту, либо вообще одно слово @Transactional либо добавь в аннотацию обработку исключений и трейс сюда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:10 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
Petro123StringerBellдля максимальной согласованности в каком смысле? - "уровень изоляции" - самый последний атрибут для регулировки простым смертным. Совет: поставь аннотацию по дефолту, либо вообще одно слово @Transactional либо добавь в аннотацию обработку исключений и трейс сюда. Цель: Нахожусь в процесе изучения Spring. Есть проект на JDBC, в котором используются apache BasicDataSource и Spring DataSourceTransactionManager. Работа с БД достаточно простая, но для себя хочу разобраться с управлением транзакциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:16 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, всё понятно. Совет см.выше. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:20 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBell, А зачем вам SERIALIZABLE ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:24 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
User.equals переопределен? Или что вообще в тесте происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:28 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
BlazkowiczStringerBell, А зачем вам SERIALIZABLE ? Так аргументированно посоветовал знакомый тимлид. То есть в рамках транзакции максимальная согласованность данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:30 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
BlazkowiczUser.equals переопределен? Или что вообще в тесте происходит? Equals переопределен. В тесте происходит попытка удаления существующего в бд юзера. Я новичек, так что тесты , наверное, не сильно правильные, но все же лучше чем ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:34 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
BlazkowiczStringerBell, А зачем вам SERIALIZABLE ? Понижение до REPEATABLE_READ дает тот же результат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 13:37 |
|
||
|
Spring @Transactional autocommit=false транзакции не коммитятся
|
|||
|---|---|---|---|
|
#18+
StringerBellBlazkowiczStringerBell, А зачем вам SERIALIZABLE ? Понижение до REPEATABLE_READ дает тот же результат второй раз говорю - оставь одно слово @Transactional и проверь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.01.2014, 14:53 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38544872&tid=2127726]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
202ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 491ms |

| 0 / 0 |
