Как установить транзакцию на самом низком уровне весной, подобно jdbc? - PullRequest
0 голосов
/ 27 марта 2012

Если бы я не использовал hibernate, я бы использовал jdbcTemplate для вызова db, например:

getJdbcTemplate().update("....")

Я делал это в прошлом, я не писал конфигурацию bean-компонента xml или использовал аннотациидля транзакций.Итак, какой объем транзакции у меня был тогда?

В настоящее время при использовании Spring MVC с Hibernate я внедряю sessionManager (не используя HibernateDaoSupport), и я помещаю аннотацию @Transaction в свой класс обслуживания (который используетDao).

@Service
@Transactional
public class UserServiceImpl extends UserService {

   @Autowired
   UserService userService

   @Override
   public User getUser(int id) {
       return userDao.get(User.class, id);
   }

}

У моего XML-контекста приложения есть:

<context:component-scan base-package="com.myapp"/>
<mvc:annotation-driven/>

<bean id="dataSource" .../>
<bean id="sessionFactory" .../>

<tx:annotation-driven />

На данный момент меня действительно не волнуют транзакции, охватывающие более одного вызова БД, и я хочучтобы все было как можно быстрее.

Как я могу сделать именно то, что делает JdbcTemplate?

Каковы различные варианты, когда речь идет о транзакциях, особенно в поисках способов максимально минимизировать блокировку таблиц / строк (я предполагаю, что мне нужно то, что jdbcTemplate сделал для меня вне-Box).

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Когда вы используете @Transactional без указания какого-либо уровня изоляции, по умолчанию будет использоваться уровень изоляции базового хранилища данных по умолчанию. Это будет верно и для jdbc, и для hibernate.

Если вы хотите изменить уровень изоляции, вам нужно будет указать перечисление изоляции в @Transactional.

@Transactional(isolation=Isolation.???)

Где ??? может быть на уровне, как описано здесь .

  1. READ_COMMITTED
  2. READ_UNCOMMITTED
  3. REPEATABLE_READ
  4. Сериализуемое
  5. ПО УМОЛЧАНИЮ

Чтобы установить уровень изоляции, отличный от значения по умолчанию, вам нужно будет установить логическое свойство " allowCustomIsolationLevels " в true для менеджера транзакций, если используется транзакция JTA.

Подробнее о настройках в весенних документах см. @ Transactional

0 голосов
/ 27 марта 2012

О "как можно быстрее" , я ответил на этот вопрос, используя сеанс без сохранения состояния:

Лучший способ вставить большое количество записей в спящий режим

В основном (я копирую / вставляю свой код из моего ответа на поставленный выше вопрос):

Session session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Item item = new Item(...);
    session.save(item);
    if ( i % 100 == 0 ) {
        session.flush();
        session.clear(); // not needed ? (see below)
    }
}
tx.commit();
session.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...