Parece que mi configuración se perdió esta línea:
<tx:annotation-driven transaction-manager="txManager"/>
Luego, en mis clases de servicio, uso @Transactional anotación. Por ejemplo
@Service
class CompanyServiceImpl implements CompanyService{
@Autowired
private CompanyDAO companyDAO;
@Transactional
public void addCompany(Company company) {
companyDAO.addCompany(company); // in here, there is JDBC sql insert
companyDAO.addCompany_fail(company); // just for test
}
}
Si hay una excepción ocurre en el addCompany_fail(), la primera addCompany() uno también se rollback.
Seguí este documento para comprender la idea de cómo se controla la transacción en Spring. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html
Seguí este documento para comprender cómo codificar con JDBC en Spring. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html
También he leído esto (Gratis) http://www.infoq.com/news/2009/04/java-transaction-models-strategy. Es realmente bueno. Y siento lo mismo con el escritor que la mayoría de las personas no entienden (o les importa) las transacciones.
PS: Parece que muchas personas entienden mal que el uso de dicho marco de Hibernate/Spring es solo para evitar la complejidad de JDBC y el control de transacciones. Mucha gente piensa que "JDBC y Transaction son tan complejos, solo usa Hibernate y olvídate de esos dos". Muchos ejemplos en Internet sobre Spring + Hibernate o Spring + JDBC aparentemente no se preocupan por la transacción en absoluto. Siento que esta es una mala broma. La transacción es demasiado seria para dejar que algo lo maneje sin una verdadera comprensión.
Hibernate y Spring es tan poderoso y tan complejo. Entonces, como alguien dijo: "El gran poder viene con responsabilidades".
ACTUALIZACIÓN: 2013-08-17: Hay un buen ejemplo de transacción aquí http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial. Sin embargo, esto no se explica que si desea utilizar REQUIRES_NEW, ¿por qué es necesario crear otra clase (de lo contrario obtendrá este problema Spring Transaction propagation REQUIRED, REQUIRES_NEW, que parece REQUIRES_NEW en realidad no se cree una nueva transacción)
Actualización: 2018 -01-01: He creado un ejemplo completo con Spring Boot 1.5.8.LANZAMIENTO aquí https://www.surasint.com/spring-boot-database-transaction-jdbi/ y algunos ejemplos de experimentos básicos aquí https://www.surasint.com/spring-boot-connection-transaction/
Y esto funcionó porque el administrador de transacciones de Spring desconecta el auto-commit y hace sus propios commits? – Raedwald