У меня есть метод, который имеет запрос UPDATE и запрос выбора.Я аннотировал метод с помощью @Transactional для приведенного ниже варианта использования.
Для одновременных выполнений - если два пользователя обновляют одну и ту же таблицу, мне нужно выполнить запрос обновления и выбора как единое целое
Если не использовать @Transactional, я использую шаблон jdbc, и я пытаюсь получить для текущего набора соединений автоматическую фиксацию в false и зафиксировать в true в конце метода
Проблема 1:
Обновление фиксируется сразу после выполнения оператора
Проблема 2:
С шаблоном jdbc невозможно получить текущее соединение, используемое для транзакции.
Я попробовал два нижеприведенных способа получить текущее соединение, но, похоже, это новое соединение из пула
1.Connection conn = DataSourceUtils.getConnection (template.getDataSource ());2.Connection con = template.getDataSource (). GetConnection ();
Приложение, развернутое на сервере WebLogic с использованием конфигурации Java, созданный EJB-компонент для шаблона JDBC, управления источниками данных и транзакциями и использованное автоматическое подключение
@Transactional
public Integer getNextId(String tablename) {
Integer nextId = null;
int swId = template.update("update " + tablename + " set swId = swId + 1");
//int swId1 = template.update("update " + tablename + " set swId = swId + 1");
if (swId == 1) {
nextId = template.queryForObject("select swId from " + tablename,
int.class);
}
return nextId;
}
}
@Scope("prototype")
@Bean
public DataSource dataSource() throws NamingException {
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
DataSource dataSource = (javax.sql.DataSource) ctx.lookup(dsnName);
return dataSource;
}
@Scope("prototype")
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
@Scope("prototype")
@Bean
public JdbcTemplate template(DataSource dataSource) {
JdbcTemplate template = new JdbcTemplate(dataSource);
return template;
}
Ожидаемые результаты.Фиксация должна происходить после выполнения всех операторов в методе. Jdbc шаблон должен получить активное соединение sed для текущей транзакции