SPRING FRAMEWORK - JDBC TRANSACCIONES

SPRING FRAMEWORK - TRANSACCIONES
FUNDAMENTOS
Una transacción en un Sistema de Gestión de Bases de Datos (SGBD), es un conjunto de operaciones (instrucciones) que se ejecutan formando una unidad de trabajo, es decir, en forma indivisible o atómica.
CONFIGURACIÓN DEL CONTEXTO
A continuación tienes un ejemplo de la configuración del contexto.
<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" 
            value="oracle.jdbc.driver.OracleDriver" />
  <property name="url" 
            value="jdbc:oracle:thin:@localhost:1521:XE" />
  <property name="username" value="eureka" />
  <property name="password" value="admin" />
  </bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
<tx:annotation-driven transaction-manager="transactionManager" />
PROGRAMACIÓN
A continuación tienes el formato de como debes programar un método donde debes implementar una transacción.
@Transactional(
    propagation=Propagation.REQUIRED, 
    rollbackForClassName={"Exception"}
)
public void insertar( [ parámetros ] ) throws Exception {

  // Proceso

}
EJEMPLO ILUSTRATIVO
El ejemplo que muestro a continuación es utilizando Oracle y el modelo es EUREKABANK, que lo encuentras en:
@Transactional(
  rollbackFor = Exception.class, 
  propagation = Propagation.REQUIRES_NEW)
public void procDeposito(String cuenta, double importe, String codEmp) {
  // Variables
  String sql;
  Map map;
  double saldo;
  int cont;
  // Paso 1: Leer datos de la cuenta
  sql = "select dec_cuensaldo, int_cuencontmov  " 
      + "from cuenta where chr_cuencodigo = ? " 
      + "for update ";
  map = jdbcTemplate.queryForMap(sql, cuenta);
  saldo = Double.parseDouble(map.get("dec_cuensaldo").toString());
  cont = Integer.parseInt(map.get("int_cuencontmov").toString());
  // Paso 2: Actualizar cuenta
  saldo += importe;
  cont++;
  sql = "update cuenta set dec_cuensaldo = ?, " 
    + "int_cuencontmov = ? " 
    + "where chr_cuencodigo = ? ";
  jdbcTemplate.update(sql, saldo, cont, cuenta);
  // Paso 3: Registrar movimiento
  sql = "insert into movimiento(chr_cuencodigo,int_movinumero,"
      + "dtt_movifecha,chr_emplcodigo,chr_tipocodigo,dec_moviimporte) " 
      + "values(?,?,SYSDATE,?,'003',?)";
  jdbcTemplate.update(sql, cuenta, cont, codEmp, importe);
}

VIDEO DEMOSTRATIVO
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.