|
Spring и транзакции
|
|||
---|---|---|---|
#18+
Добрый день, уважаемые форумчане Продолжаю потихоньку осваивать Spring и дошел до транзакцию. Наварачивая круги по интернету в поисках нужной информации натолкнулся на две статьи: https://www.ibm.com/developerworks/java/library/j-ts1/index.html https://habr.com/post/62484/ И в связи с этим у меня возникло несколько вопросов, поэтому прошу помочь разобраться. У меня приложение написано на Spring, для соединения с базой используется Spring jdbc. DataSource получаю с помощью jndi (сервер приложений WebSphere Application) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Для транзакций использую: Код: java 1. 2. 3. 4. 5. 6.
Собственно вопросы: 1. Правильно ли выбран менеджер транзакций? 2. Во второй статье говорится, что "При инициализации spring автоматически найдет доступный менеджер через jndi — т.к. он занет стандартные jndi пути для всех популярных серверов, и последовательно их перебирает." То есть можно было вообще не описывать менеджер транзакций? К сожалению в коде к статье вообще нет этого 3. В первой статье есть упор на то, что если в методе только селекты, то можно не использовать транзакции. То есть если у меня несколько потоков селектят из таблицы, которая почти никогда не меняется, то можно не вешать транзакцию? 4. Так же в 1 статье указывается, что надо осторожно использовать Propagation.REQUIRES_NEW Если у меня в методе происходит вставка в таблицу и метод дергается разными потоками, то какой Propagation лучше использовать? Мне казалось, что, поскольку у меня не открывается внутри метода никаких других транзакций, то Propagation.REQUIRES_NEW мне подходит. А вот теперь сомневаюсь 5. И последний вопрос Код: java 1. 2. 3. 4.
Какие Propagation надо выставить у методов, чтобы methodB выполнялся всегда, вне зависимости откатится ли методА. И в случае ошибки в методеB не откатился методА ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 13:15 |
|
Spring и транзакции
|
|||
---|---|---|---|
#18+
BoomLix2. Во второй статье говорится, что "При инициализации spring автоматически найдет доступный менеджер через jndi — т.к. он занет стандартные jndi пути для всех популярных серверов, и последовательно их перебирает." То есть можно было вообще не описывать менеджер транзакций? К сожалению в коде к статье вообще нет этогоКарл Гаусс вроде бы гордился тем, что написал учебник по геометрии без единой иллюстрации - у ваша статья тоже претендует на уникальность: про жаву без единой строчки кода Посмотрите сколько в спринге реализаций PlatformTransactionManager, вот тот что "При инициализации spring автоматически найдет доступный менеджер через jndi" - это JtaTransactionManager, та и то с некоторыми оговорками: работает оно только в житуи-окружении (т.е. к буту или коту нужно отдельно прикручивать), с каким-нить хибером оно тоже с ходу не заработает (по крайней мере в вебсфере нужно будет поприседать, чтобы хибер заработал с JTA), и в конце-концов PlatformTransactionManager - это какбы не менеджер транзакций (ну оно тупо javax.transaction.TransactionManager не реализует), т.е. менеджер транзакций описывать нужно всегда, а вот какую именно спринговую реализацию выбрать - зависит. BoomLix4. Так же в 1 статье указывается, что надо осторожно использовать Propagation.REQUIRES_NEW Если у меня в методе происходит вставка в таблицу и метод дергается разными потоками, то какой Propagation лучше использовать? Мне казалось, что, поскольку у меня не открывается внутри метода никаких других транзакций, то Propagation.REQUIRES_NEW мне подходит. А вот теперь сомневаюсь Если вопрос возник про следующее утверждение: ibm Код: java 1. 2. 3. 4. 5.
Notice in Listing 11 that both of these methods are public, implying that they can be invoked independently from each other. Problems occur with the REQUIRES_NEW attribute when methods using it are invoked within the same logical unit of work via inter-service communication or through orchestration. For example, suppose in Listing 11 that you can invoke the updateAcct() method independently of any other method in some use cases, but there's also the case where the updateAcct() method is also invoked in the insertTrade() method. Now, if an exception occurs after the updateAcct() method call, the trade order would be rolled back, but the account updates would be committed to the database, as shown in Listing 12: Код: java 1. 2. 3. 4. 5. 6. 7.
То оно не совсем (или не всегда) верно - виной тому спринг, а точнее то, как он отдает бины во вне: если он создает прокси (поведение по-умолчанию), то при обращении к методам внутри класса контракты @Transactional игнорируются, если же он процессит классы через aspectj, то контракт @Transactional выполняется всегда. BoomLix5. И последний вопрос Код: java 1. 2. 3. 4.
Какие Propagation надо выставить у методов, чтобы methodB выполнялся всегда, вне зависимости откатится ли методА. И в случае ошибки в методеB не откатился методАREQUIRES_NEW у methodB, хотя откатывается не "методА", а транзакция, которая могла начать вообще хрен знает где. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2018, 10:03 |
|
|
start [/forum/topic.php?fid=59&fpage=45&tid=2121992]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
517ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 615ms |
0 / 0 |