Вставка значений в Oracle 11g через JdbcTemplate-OracleDataSource, введенные через конфигурационный файл Spring. Транзакции выполняются с помощью @Transactional, управляемого DataSourceTransactionManager.
Вопрос 1) Как установить значение autocommit равным false? Значение по умолчанию истинно, я думаю. Ниже приведен фрагмент кода:
DataSource ds = (DataSource)ctx.getBean("dataSourceBean");
try {
ds.getConnection().setAutoCommit(false);
System.out.println("Autocommit " +ds.getConnection().getAutoCommit());
} catch (SQLException e) {
e.printStackTrace();
}
Утверждение println
дает только true
.
Также напечатано значение getAutoCommit в методе вставки класса DAO. То же самое происходит.
Question2) Для уникального нарушения ограничений мне нужно откат. В этом случае генерируется исключение DuplicateKeyException
которое обертывается над SQLIntegrityConstraintViolationException. Итак, @Transactional (rollbackFor =?.Class) должен иметь, какое исключение?
1. Хранить его в переменной
DataSource ds = (DataSource)ctx.getBean("dataSourceBean");
try {
Connection con =ds.getConnection();
con.setAutoCommit(false);
System.out.println("Autocommit " +con.getAutoCommit());
} catch (SQLException e) {
e.printStackTrace();
}
Когда вы снова вызываете ds.getConnection(), вы получаете другое соединение из пула
2.Изменить конфигурацию Weblogic DataSource
Автоматическое совершение транзакций, если явно не выполнено или отката
Вместо того, чтобы делать программно, проверьте, что пул соединений имеет возможность установить auto commit в false при возврате соединения из пула. DBCP BasicDataSource имеет такую опцию
Spring будет откатываться, если будет выбрано любое RuntimeException.