powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Транзакция для чтения
20 сообщений из 20, страница 1 из 1
Транзакция для чтения
    #38001445
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста, зачем задавать транзакцию для режима чтения из базы - типа
Код: java
1.
2.
3.
4.
@Transactional(readOnly=true)
public List<Contact> findAll() 
{
}



И еще вопрос - что происходит, если мы задаем для метода
Код: java
1.
2.
3.
4.
@Transactional(propagation=Propagation.NEVER)
public long countAll()
{
}


Во втором случае транзакция вообще не запускается - из-за propagation=Propagation.NEVER.
То есть таким образом ее просто отключили для этого конкретного метода?
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38001643
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,
намудрили они конечно с таким количеством флагов:

Ошибки, связанные с флагом "только чтение" аннотации @Transactional
http://www.ibm.com/developerworks/ru/library/j-ts1/index.html
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38003436
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во втором случае транзакция вообще не запускается
Любой запрос всегда исполняется в рамках некоторой транзакции. У JDBC Connection может быть включен autocommit, в этом случае драйвер будет сам автоматически посылать серверу команду commit после каждого запроса. Автокоммит вредная вещь, потому что угрожает целостности данных. Если какая-то аннотация приводит к тому, что запросы исполняются в режиме автокоммита, то это вредная аннотация и ее использовать не следует. В каких-то древних СУБД короткие транзакции были лучше для производительности, но сейчас это не актуально.
Подскажите пожалуйста, зачем задавать транзакцию для режима чтения из базы - типа

Для обеспечения transaction level read consistency.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38003452
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В статье на ibm.com написана какая-то фигня. Либо автор не грамотен, либо перевод плохой, либо автор работает с какой-то экзотической СУБД.
Зачем надо начинать транзакцию, если речь идет только о чтении данных? Разумеется, этого делать не нужно.

Для statement level read consistency. Автор считает, что есть два режима - использовать транзакции и не использовать. И при использовании транзакции расходуются какие-то дорогостоящие ресурсы. Это не так. Транзакция неизбежно начинается при выполнении первого запроса, и заканчивается при commit/rollback.
Если вас не заботит качество ваших данных, то нет причин думать на тему применения транзакций, поскольку на платформе Java они могут серьезно снизить производительность

Это абсолютно неверное утверждение. Автокоммит наоборот увеличивает число транзакций и снижает производительность.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38003453
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДля statement level read consistency

Для transaction level read consistency, я имел в виду.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38003699
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
Мы же не говорим про jdbc.
Он применяется для простейших проектов. Там автокоммит Оправдан.
Сабж про Управление транзакциями, когда он выключен по дефолту. Иначе работать не будет.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38020847
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочитал в Spring 3 PRO, что @Transactional(readOnly=true) позволяет

// Other code omitted
@Transactional(readOnly=true)
public List<Contact> findAll() {
return sessionFactory.getCurrentSession().
createQuery("from Contact c").list();
}
}
...
The @Transactional(readOnly=true), which means we want
the transaction to be set as read-only. Setting that attribute for finder methods will result in better
performance.

Но транзакция значит в любом случае открывается и коммитится, даже для чтения?
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38020930
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но транзакция значит в любом случае открывается и коммитится, даже для чтения?

См http://kickjava.com/src/org/springframework/jdbc/datasource/DataSourceTransactionManager.java.htm, методы doBegin и doCommit.
Кстати, тут Blazkowich писал, что классы в спринге простые и понятные. Вот отличный пример:
Data access code that should remain unaware of Spring's data access support can work with this proxy to seamlessly participate in Spring-managed transactions. Note that the transaction manager, for example DataSourceTransactionManager, still needs to work with the underlying DataSource, not with this proxy.

Make sure that TransactionAwareDataSourceProxy is the outermost DataSource of a chain of DataSource proxies/adapters. TransactionAwareDataSourceProxy can delegate either directly to the target connection pool or to some intermediary proxy/adapter like LazyConnectionDataSourceProxy or UserCredentialsDataSourceAdapter.

При этом все нужное API состоит из 3 функций: Datasource.getConnection, Connection.commit и Connection.rollback.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38021603
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪСм http://kickjava.com/src/org/springframework/jdbc/datasource/DataSourceTransactionManager.java.htm, методы doBegin и doCommit.открой для себя grepcode
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38021612
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonНо транзакция значит в любом случае открывается и коммитится, даже для чтения?
чувак, скажи какую часть этой фразы ты не понял

Йуный джавистЪЛюбой запрос всегда исполняется в рамках некоторой транзакции
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38021672
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
не ругайся))
Сервер открывает свою серверную транзакцию (для чтения) Сам.
Для этого обрамлять SELECT на клиенте в Java begin tran необязательно.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38021830
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123не ругайся))
Сервер открывает свою серверную транзакцию (для чтения) Сам.
Вообще говоря не всегда. Версионникам транзакции для чтения не нужны.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38021916
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевPetro123не ругайся))
Сервер открывает свою серверную транзакцию (для чтения) Сам.
Вообще говоря не всегда. Версионникам транзакции для чтения не нужны.
ну дак я и добавил к твоей фразе строку для форума Java - "с клиента стартовать её не надо".
И называется она - клиентская.
Их много разных видов и спор ни о чём.
ЗЫ
Для сиквела SELECT тоже не надо обрамлять.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38022524
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

С другой стороны у тогоже Oracle read-only транзакция это совсем не то же самое, что и обычный select.
И ее надо объявлять явно.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38022558
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевPetro123,
С другой стороны у тогоже Oracle read-only транзакция это совсем не то же самое, что и обычный select.
И ее надо объявлять явно.
Сергей!
Тут с транзакциями замешанными на все виды СУБД столько сторон и ньюансов, что их флажками и аннотациями не решить.
О том, что всё неоднозначно и не так просто для понимания, я и сказал во втором посте.

На уровне прикладного Java кода нет слов Оракл. Все СУБД под одну аннотацию не завести.
И конечно, лучше делать транзакции короткими, а читающую транзакцию делать на уровне оператора. А не длинной транзакции с несколькими SELECT.
http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm
imho
Т.е. идём сначала от простейших случаев на все СУБД, а потом уже "перчим" всё фичами и прибамбасами-хинтами.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38022693
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев Вообще говоря не всегда.Всегда.Версионникам транзакции для чтения не нужны.Нужны. Именно транзакции определяют какую версию записи возвращать клиенту.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38024188
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovСергей Арсеньев Вообще говоря не всегда.Всегда.Версионникам транзакции для чтения не нужны.Нужны. Именно транзакции определяют какую версию записи возвращать клиенту.

В общем клиентская транзакция должна открываться - коммититься и для чтения данных тоже.
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38024193
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonВ общем клиентская транзакция должна открываться - коммититься и для чтения данных тоже.И? Как это влияет на механизм работы версионника?
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38024212
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я ж про версионник не спрашивал. Меня изначальный вопрос интересует :)
...
Рейтинг: 0 / 0
Транзакция для чтения
    #38024218
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonДа я ж про версионник не спрашивал.Тогда не надо выдавать неправильные ответы.
Просто игнорируйте то, что вам не нужно.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Транзакция для чтения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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