@ Транзакционная аннотация с пружиной и получение текущего сотрудничества - PullRequest
0 голосов
/ 10 июля 2019

У меня есть метод, который имеет запрос 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 для текущей транзакции

...