powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring и транзакции
2 сообщений из 2, страница 1 из 1
Spring и транзакции
    #39659238
BoomLix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане
Продолжаю потихоньку осваивать 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.
@Bean
public DataSource dataSource(){
   JndiTemplate jndi= new JndiTemplate();
   return (DataSource) jndi.lookup("ds/Test");
}

@Bean
public JdbcTemplate jdbcTemplate(){
   return new JdbcTemplate(dataSource());
}



Для транзакций использую:
Код: java
1.
2.
3.
4.
5.
6.
@Bean
public PlatformTransactionManager transactionManager(){
   DataSourceTransactionManager tM = new DataSourceTransactionManager ();
   tM.setDataSource(dataSource());
   return tM;
}



Собственно вопросы:
1. Правильно ли выбран менеджер транзакций?
2. Во второй статье говорится, что "При инициализации spring автоматически найдет доступный менеджер через jndi — т.к. он занет стандартные jndi пути для всех популярных серверов, и последовательно их перебирает."
То есть можно было вообще не описывать менеджер транзакций? К сожалению в коде к статье вообще нет этого
3. В первой статье есть упор на то, что если в методе только селекты, то можно не использовать транзакции. То есть если у меня несколько потоков селектят из таблицы, которая почти никогда не меняется, то можно не вешать транзакцию?
4. Так же в 1 статье указывается, что надо осторожно использовать Propagation.REQUIRES_NEW
Если у меня в методе происходит вставка в таблицу и метод дергается разными потоками, то какой Propagation лучше использовать? Мне казалось, что, поскольку у меня не открывается внутри метода никаких других транзакций, то Propagation.REQUIRES_NEW мне подходит. А вот теперь сомневаюсь
5. И последний вопрос
Код: java
1.
2.
3.
4.
public void methodA(){
   //какие-то действия с базой
   methodB();
}


Какие Propagation надо выставить у методов, чтобы methodB выполнялся всегда, вне зависимости откатится ли методА.
И в случае ошибки в методеB не откатился методА
...
Рейтинг: 0 / 0
Spring и транзакции
    #39659389
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
@Transactional(propagation=Propagation.REQUIRES_NEW)
public long insertTrade(TradeData trade) throws Exception {...}
 
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateAcct(TradeData trade) throws Exception {...}



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(propagation=Propagation.REQUIRES_NEW)
public long insertTrade(TradeData trade) throws Exception {
   em.persist(trade);
   updateAcct(trade);
   //exception occurs here! Trade rolled back but account update is not!
   ...
}




То оно не совсем (или не всегда) верно - виной тому спринг, а точнее то, как он отдает бины во вне: если он создает прокси (поведение по-умолчанию), то при обращении к методам внутри класса контракты @Transactional игнорируются, если же он процессит классы через aspectj, то контракт @Transactional выполняется всегда.

BoomLix5. И последний вопрос
Код: java
1.
2.
3.
4.
public void methodA(){
   //какие-то действия с базой
   methodB();
}


Какие Propagation надо выставить у методов, чтобы methodB выполнялся всегда, вне зависимости откатится ли методА.
И в случае ошибки в методеB не откатился методАREQUIRES_NEW у methodB, хотя откатывается не "методА", а транзакция, которая могла начать вообще хрен знает где.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring и транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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