Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Пусть есть приложение, работа с транзакциями, которого настроена декларативно через spring.

У транзакции есть свойство Isolation, которое определяет видимость между транзакциями.

Но у меня возник вопрос, что увидит метод, который не помечен аннотацией @Transactional ?

увидят ли его изменения если это не read?
9 янв 17, 19:20    [20086044]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
Если у в контексте текущего потока не запущена транзакция, то все операции с БД происходят с автокоммитом. То есть на каждый запрос своя транзакция. Удивительно что вы пытаетесь вникнуть в такие дебри, но не пытаетесь понять как это вообще работает.
9 янв 17, 21:35    [20086383]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
Если у в контексте текущего потока не запущена транзакция, то все операции с БД происходят с автокоммитом. То есть на каждый запрос своя транзакция. Удивительно что вы пытаетесь вникнуть в такие дебри, но не пытаетесь понять как это вообще работает.


Можете обрисовать, что именно нужно понять?
9 янв 17, 21:45    [20086414]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
Нужно понять как работает АОП, особенно в спринге.
Что происходит в начале транзакции, а что происходит в конце и как это связано с проксями через которые работает АОП.
ThreadLocal
Нужно знать работу с транзакцией в JDBC API, так как в большинстве случаев другого и не нужно. Connection.setAutocommit() разве совсем не знакомый метод?
Все это можно за пару часов найти в исходниках Спрингa.
Если это всё увязать в одно целое, то исходного вопроса не возникло бы совсем.
9 янв 17, 23:12    [20086759]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
Нужно понять как работает АОП, особенно в спринге.

Прокси, либо инструментация
Blazkowicz
Что происходит в начале транзакции, а что происходит в конце и как это связано с проксями через которые работает АОП.

я так понимаю, что обернули метод
begin transaction
наш метод
stop transaction
Blazkowicz
ThreadLocal

Я понимаю, что это, но как это связано с темой непонятно.
Blazkowicz
Нужно знать работу с транзакцией в JDBC API, так как в большинстве случаев другого и не нужно. Connection.setAutocommit() разве совсем не знакомый метод?
Все это можно за пару часов найти в исходниках Спрингa.
Если это всё увязать в одно целое, то исходного вопроса не возникло бы совсем.



Что-то в голову не пришло, что автокоммит это из Jdbc api.
10 янв 17, 10:21    [20087665]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Прокси, либо инструментация

В Spring-е уже работает инструментация для транзакций? Круто.

questioner
я так понимаю, что обернули метод
begin transaction
наш метод
stop transaction

Во-первых нет никаких stop transaction. Есть commit и rollback.
Во-вторых тут начинаются заблуждения. Область действия транзакции больше чем один метод.

questioner
Blazkowicz
ThreadLocal

Я понимаю, что это, но как это связано с темой непонятно.

А так, что информация о текущей транзакции лежит в ThreadLocal. Поэтому если метод не помечен как @Transactional, это ещё не значит что он не работает в транзакции. Он может использовать уже существующую. Отсутствие этой аннотации говорит о том что метод не создаст новой транзакции (в контексте спринга, не БД).

questioner
Что-то в голову не пришло, что автокоммит это из Jdbc api.

Могут быть ещё нюансы в зависимости от выбранного менеджера транзакции. Но я предлагаю разобраться с простейшим случаем, когда менеджер транзакций просто полагается на БД.
http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/jdbc/datasource/DataSourceTransactionManager.html
http://grepcode.com/file/repository.springsource.com/org.springframework/org.springframework.jdbc/3.0.5/org/springframework/jdbc/datasource/DataSourceTransactionManager.java
10 янв 17, 10:49    [20087783]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz,

Blazkowicz
В Spring-е уже работает инструментация для транзакций? Круто.


А почему нет? для аннотации @Transactional.

Blazkowicz
Область действия транзакции больше чем один метод.


Зависит же от propagation или я про другое ?
10 янв 17, 13:59    [20088971]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz,

Кажется мне нужно ещё разжевать/направить немножко(

не понятно.
11 янв 17, 12:52    [20093277]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Blazkowicz
Область действия транзакции больше чем один метод.

Зависит же от propagation или я про другое ?

ThreadLocal уже прочитан?

@Transactional
void doSomeBusiness(){
    someBean.doThis();
    someBean.doThat();
}


doThis и doThat полноценно участвуют в транзакции, но помечать их как @Transactional не нужно. Почему? Потому что информация о текущей транзакции у нас в ThreadLocal.
11 янв 17, 12:57    [20093311]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Atum1
Member

Откуда: СПБ
Сообщений: 1703
еще,как вариант - напишите тесты используя p6spy библиотеку и посмотрите какие sql выполняются и где и как отрабатывают коммиты !!

но тут у меня бага с p6spy - некоторые sql отображатся два раза ?!!! я не пойму что такое с этой либой ..

но это бага кода , пока не понял где дублируются (((

все равно p6spy лучше чем простой hibernate.show_sql c кучей ????

Blazkowicz

@Transactional
void doSomeBusiness(){
    someBean.doThis();
    someBean.doThat();
}


doThis и doThat полноценно участвуют в транзакции, но помечать их как @Transactional не нужно. Почему? Потому что информация о текущей транзакции у нас в ThreadLocal.



Ссылка на позицию в клипе: http://youtu.be/U8MtGYa04v8?t=1040


тут задачка про вложенные транзакции ..
11 янв 17, 14:56    [20094021]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
Atum1
тут задачка про вложенные транзакции ..

С добрым утром. Этот вопрос мы ещё в предыдущей теме прояснили.
20073053

А по поводу стандартых косяков в этом вопросе есть отличная статья
http://www.ibm.com/developerworks/java/library/j-ts1/index.html
Перевод
http://www.k-press.ru/cs/2009/1/ts/ts.asp
11 янв 17, 15:14    [20094106]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
questioner
пропущено...

Зависит же от propagation или я про другое ?

ThreadLocal уже прочитан?

@Transactional
void doSomeBusiness(){
    someBean.doThis();
    someBean.doThat();
}


doThis и doThat полноценно участвуют в транзакции, но помечать их как @Transactional не нужно. Почему? Потому что информация о текущей транзакции у нас в ThreadLocal.


Да, это я понимаю. ThreadLocal подходит для хранения информации о транзакции.
11 янв 17, 16:16    [20094479]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Да, это я понимаю. ThreadLocal подходит для хранения информации о транзакции.

Хорошо. Тогда что ещё осталось не понятным?
11 янв 17, 16:19    [20094499]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz,

Непонятно почему @Transactional не может работать через инструментацию.
11 янв 17, 17:54    [20095006]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Непонятно почему @Transactional не может работать через инструментацию.

Кто сказал про "не может"? Возможно и может.
11 янв 17, 17:59    [20095030]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
questioner
Прокси, либо инструментация

В Spring-е уже работает инструментация для транзакций? Круто.


Я воспринял это так, что Вы считаете, что это очевидно неверно.

Я что-то не понимаю, наверное, но AOP в спринге может использоваться много для чего, например для кеширования. И как мы этот AOP сконфигурён так и будет spring работать. AspectJ часто ведь используют в ответах по реалихации AOP в spring.

Почему такие сомнения с @Transactional ?
11 янв 17, 18:06    [20095059]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Я воспринял это так, что Вы считаете, что это очевидно неверно.

Я не могу знать всего. Поэтому выразил удивление. Это же вы изучаете вопрос. Почему не смотрите в мануал?

questioner
Почему такие сомнения с @Transactional ?

Потому что по умолчанию там всегда прокси. Потому что использование Spring AOP это не совсем одно и тоже что и использование других модулей Spring.

В актуальном мануале пишут что работает и через инструментацию mode="aspectj"
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html
11 янв 17, 18:18    [20095113]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
использование Spring AOP это не совсем одно и тоже что и использование других модулей Spring.

а что с ним не так?

Так Вы же сами в этом ответе в соседней теме писали, что если AOP реализован не через инструментацию, то могут быть проблемы с запуском транзакции при локальном вызове

http://www.sql.ru/forum/1244882/requiresnew?mid=20073053#20073053
11 янв 17, 18:38    [20095190]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
а что с ним не так?

Это два разных модуля.

questioner
Так Вы же сами в этом ответе в соседней теме писали, что если AOP реализован не через инструментацию, то могут быть проблемы с запуском транзакции при локальном вызове

Это вообще к чему? Об этом и в мануале написано.
11 янв 17, 19:11    [20095289]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
questioner
Так Вы же сами в этом ответе в соседней теме писали, что если AOP реализован не через инструментацию, то могут быть проблемы с запуском транзакции при локальном вызове

Это вообще к чему? Об этом и в мануале написано.


Когда Вы писали тот пост, то знали, что @Transactional не будет работать как надо если AOP реализован не через инструментацию, а тут как будто забыли.

Это с моей стороный так выглядит. Естественно Вы что-то иное имеете ввиду, но я не понимаю, что именно
11 янв 17, 19:19    [20095322]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Когда Вы писали тот пост, то знали, что @Transactional не будет работать как надо если AOP реализован не через инструментацию, а тут как будто забыли.

У вас логические выводы нарушены. Во-первых нигде не говориться про "так надо". Во-вторых то что прокси не перехватывают вызовы методов внутри класса вообще никак не связано с тем работает ли декларативное управление транзакциями через compile time weaving или нет.
"не будет работать через прокси" не значит что "будет работать через инструментацию". Это значит что "будет работать через инструментацию, при услови что декларативное управление транзакциями умеет работать через инструментацию".
Беглый просмотр документации говорит что умеет. Но раньше, когда я интересовался этим вопросом, инструментация была геморроем. Поэтому я понятия не имел умеет так спринг или нет.
11 янв 17, 19:27    [20095340]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
questioner
Когда Вы писали тот пост, то знали, что @Transactional не будет работать как надо если AOP реализован не через инструментацию, а тут как будто забыли.

У вас логические выводы нарушены. Во-первых нигде не говориться про "так надо". Во-вторых то что прокси не перехватывают вызовы методов внутри класса вообще никак не связано с тем работает ли декларативное управление транзакциями через compile time weaving или нет.
"не будет работать через прокси" не значит что "будет работать через инструментацию". Это значит что "будет работать через инструментацию, при услови что декларативное управление транзакциями умеет работать через инструментацию".
Беглый просмотр документации говорит что умеет. Но раньше, когда я интересовался этим вопросом, инструментация была геморроем. Поэтому я понятия не имел умеет так спринг или нет.


Хотелось бы докапаться до истины, почему нарушены причинно следственные связи) Я явно чего-то не понимаю.

Blazkowicz
"не будет работать через прокси" не значит что "будет работать через инструментацию".

а как ещё? есть третий вариант?

Blazkowicz
то что прокси не перехватывают вызовы методов внутри класса вообще никак не связано с тем работает ли декларативное управление транзакциями через compile time weaving или нет.


О,похоже загвоздка тут. А зачем вообще тогда прокся эта нужна если через нее @Transactional-ы/ @Autowired-ы работали?
11 янв 17, 21:57    [20095886]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
с @Autowired я наверное погорячился
11 янв 17, 22:00    [20095896]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 22476
questioner
Хотелось бы докапаться до истины, почему нарушены причинно следственные связи) Я явно чего-то не понимаю.

Какой ещё истины? Походу вопросы закончились, осталось только "а поговорить?".

questioner
а как ещё? есть третий вариант?

Предложение до конца дочитать не вариант?

questioner
А зачем вообще тогда прокся эта нужна если через нее @Transactional-ы/ @Autowired-ы работали?

Не понял вопроса.
12 янв 17, 08:06    [20096571]     Ответить | Цитировать Сообщить модератору
 Re: Видимость метода, запущенного вне транзакции.  [new]
questioner
Member

Откуда:
Сообщений: 1002
Blazkowicz
questioner
Хотелось бы докапаться до истины, почему нарушены причинно следственные связи) Я явно чего-то не понимаю.

Какой ещё истины? Походу вопросы закончились, осталось только "а поговорить?".

questioner
а как ещё? есть третий вариант?

Предложение до конца дочитать не вариант?

questioner
А зачем вообще тогда прокся эта нужна если через нее @Transactional-ы/ @Autowired-ы работали?

Не понял вопроса.


Да, с вопросом топика понятно.

Во время топика появилось непонимание про Spring AOP.

Почему раньше @Transactional раньше не мог работать через инструментацию?(это касалось только @Transactional ?)
Spring AOP может использоваться как собственно AOP, чтобы обрамлять свои методы какой-то своей логикой, а может, собственно для всяких @Transactional/@Cacheable.

Насколько я понимаю, AOP конфигурируется глобально.

Собственно если настроить AOP через инструментацию, то всё, что пользует AOP будет работать через инструментацию.

Blazkowicz
Предложение до конца дочитать не вариант?
а что дочитать то?
12 янв 17, 09:56    [20096907]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить