Моя проблема проста: я хочу отменить все изменения базы данных, вызванные вызовом моего метода обслуживания. У меня проблема с правильным аннотированием. Я не совсем уверен, где поставить @Transactional
и где я должен установить распространение на REQUIRES_NEW
или MANDATORY
. Я вставлю написанный мной код, который помимо того, что выбрасывается SQLException
, не откатывает изменения бд.
Код:
@Service
public class SwapInsertService {
@Autowired
MyDao myDao;
@Transactional(propagation = Propagation.REQURIES_NEW, rollbackFor = SQLException.class)
public void insertToManyTables(MyData data) throws SQLException {
insertToSpecificTables(data);
myDao.insertTwo(data);
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertToSpecificTables(MyData data) throws SQLException {
myDao.insertOne(data);
}
}
@Repository
public class MyDaoImpl implements MyDao {
@Transactional(propagation = Propagation.MANDATORY)
public void insertOne(MyData data) throws SQLException {
// INSERT
}
@Transactional(propagation = Propagation.MANDATORY)
public void insertTwo(MyData data) throws SQLException {
// throws SQLException
}
}
Предположим, что insertTwo
выдает SQLException
. Хотелось бы откатить все предыдущие вставки. Что я делаю неправильно?
Мое понимание:
Propagation.REQURIES_NEW
создает новую транзакцию. Propagation.MANDATORY
поддерживает текущую транзакцию.
insertTwo
выдает ошибку, insertToManyTables
все откатывает и вуаля. К сожалению, это не так просто.
EDIT: важно отметить, что я использую CGLIB
для прокси.
<bean id="txManager"...
) в конфигурации spring? см. static.springsource.org/spring/docs /3.0.x/ссылка/ - person fasseg   schedule 20.09.2012