Comentarios acerca de Java y Asuntos Exteriores de primavera

Transacción (ACID)

 

En términos informáticos se entiende acceder a la base de datos y puede actualizar los distintos elementos de datos de una unidad de ejecución del programa.

 

Cuatro características de la transacción (ácido):

 

La atomicidad (atomicidad): la transacción es una unidad lógica de base de datos de trabajo, sino que debe ser unidad atómica de trabajo, para el que la modificación de datos, o bien todos ejecutado o todos no ser ejecutado.

 

La consistencia (consistencia): Al finalizar la operación, todos los datos deben ser estado coherente. En la base de datos pertinente, todas las reglas deben aplicarse para modificar la operación de mantener la integridad de todos los datos

 

Aislamiento (aislamiento): ejecución de una operación no puede verse afectada por otras empresas.

 

Y la persistencia (durabilidad): Una vez que se confirma una transacción, el funcionamiento de las cosas será almacenado permanentemente en la base de datos. Incluso la operación de confirmación no se perderá en caso de una base de datos de transacción de fallo del sistema de encuentros.

 

Cinco niveles de aislamiento:

DEFAULT Este es un nivel de aislamiento predeterminado PlatfromTransactionManager, utilice el nivel de aislamiento de base de datos por defecto.

Lectura no confirmada (lectura uncommited): lecturas sucias, lecturas no repetibles, lecturas fantasma que puede suceder

Lectura confirmada (lectura comprometida): sucia evitar lee. Sin embargo, no repetibles y las lecturas fantasma puede ocurrir

Lectura repetible (lectura repetible): evitar lecturas sucias y no repetible pero lee las lecturas fantasma puede ocurrir.

Serializado (serializable): Evitar la lectura de todos los problemas anteriores.

 

 

ISOLATION_DEFAULT: Este es un nivel de aislamiento predeterminado PlatfromTransactionManager, utilice el nivel de aislamiento de base de datos por defecto.

 

También con cuatro correspondiente nivel de aislamiento JDBC;

 

ISOLATION_READ_UNCOMMITTED: Este es el nivel de aislamiento de transacción más bajo, se comprometió a no cobrar una transacción en el extranjero puede ver los datos que las transacciones no confirmadas. lectura sucia

Escena: el final de los salarios financieros para todo el mundo, a una cuenta pequeña hizo 10.000 yuanes, mientras que la transacción aún no ha presentado una pequeñas cuentas comprobados para ver 10.000 yuanes, emocionó. Pero esta vez encontró su propio error financiero para jugar otro lado 0, a continuación, deshacer la transacción, reeditado 1000 yuanes asuntos presentados, una pequeña cantidad de re-comprobado y encontrado que Cary 1.000 yuanes en la alegría de un vacío campo.

 

ISOLATION_READ_COMMITTED: permite irrepetible lee pero no sucio lee. Esto puede ser "bloqueos de lectura instantánea compartidos" y "bloqueos de escritura exclusivos" para lograr. Leer transacción de datos permite otras operaciones continúan para acceder a las filas de datos, pero escriben transacciones no evitarán que otras transacciones tener acceso al banco, Lectura confirmada (se refiere principalmente a los cambios de valor de datos). nivel por defecto Oracle

Escena: Una transacción de cuenta abierta pequeña comprobó la cantidad de 1.000 yuanes, esta vez se ha pasado el canto madurez, Alipay deduce automáticamente de la cuenta de 100 yuanes (100 yuanes esta deducción es la operación de otras cosas, y se ha presentado), comprobar una pequeña este tiempo el equilibrio más convertirse en un yuan 900 (los resultados se produjeron en una cosa en dos investigaciones son incompatibles).

ISOLATION_REPEATABLE_READ: Este aislamiento de la transacción impide nivel lecturas sucias, las lecturas no repetibles. Sin embargo, se puede producir la lectura fantasma. Mágico de lectura (se refiere principalmente al número de filas al cambio). nivel por defecto de MySQL

Escena: Una pequeña transacción de cuenta abierta comprobó la cantidad de 1.000 yuanes, se comprobó su cuenta no transfiere los registros, esta vez se ha pasado el canto madurez, Alipay deduce automáticamente 100 yuanes (100 deducido de la cuenta del yuan es algo más para operar y se ha presentado), comprobó el equilibrio de los cuales sigue siendo de $ 1000, y luego mi esposa se volvió a 800 dólares, unos registros de cuentas de cheque repente encontraron los dos, esta vez se ha pasado de lectura fantasma)

 

ISOLATION_SERIALIZABLE: Este es el más caro, pero el costo del nivel de aislamiento más confiable. La transacción se procesa como una ejecución secuencial. Serialize todo en las colas, al mismo tiempo, no está permitido, muy baja eficiencia.

 

 

 

La propagación de transacción:

 

* Asegúrese de que la misma transacción

PROPAGATION_REQUIRED apoyar la transacción actual, si no existe para crear una nueva (por defecto)

PROPAGATION_SUPPORTS apoyan la transacción actual, y si no, no utilice la transacción

PROPAGATION_MANDATORY apoyar la transacción actual, si no, una excepción

* No hay garantía ninguna transacción en el mismo

PROPAGATION_REQUIRES_NEW si hay existe una transacción, suspender la transacción actual y crear una nueva transacción

PROPAGATION_NOT_SUPPORTED funcionando en modo no transaccional, si hay una transacción, en espera de la transacción actual

PROPAGATION_NEVER funcionando en modo no transaccional, si hay una transacción, una excepción

PROPAGATION_NESTED Si existe la transacción actual, transacciones anidadas ejecutados

 

 

condiciones de fallo de transacción de primavera

 

@Transactional algunas escenas a menudo se encuentran:

Método @Transactional aplica a privada, public void @Transactional aplica al método de interfaz no se añade, a continuación, la interfaz llamada por el método ordinario, aplicado al método de interfaz @Transactional válido, independientemente de la llamada siguiente método es privada o pública, se añaden a la @Transactional efectiva después de que el método de interfaz, la clase general presente llamado método directamente de la interfaz, el método es @Transactional inválida añadió a la interfaz, esta clase es una interfaz común a través de la invocación del método de la interfaz, el @Transactional eficaz añadió a la interfaz métodos, es la clase llama al método de la interfaz, el eficaz @Transactional añade al método de interfaz, es los métodos privados las llamadas de clase, eficaces

 

Tiempo de primavera en un método no-operación A llama a B un método predeterminado Asuntos (PROPAGATION_REQUIRED), y si se utiliza este método para llamada B, Método B lanza RuntimeException, esta vez Método B transacción no es, y no se deshace.

@Servicio

EmployeeService public class {

@Autowired

employeeDao EmployeeDao privado;

public void Save () {

tratar {

this.saveEmployee (); // aquí esta llamada no transacciones abiertas, se guardará los datos

} Catch (Exception e) {

e.printStackTrace ();

}

}

@Transactional (propagación = Propagation.PROPAGATION_REQUIRED)

// aquí es si PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW, las materias no tenga efecto

saveEmployee public void () {

empleado Empleado = new Employee ();

employee.setName ( "zhangsan");

employee.setAge ( "26";

employeeDao.save (empleado);

throw new RuntimeException ();

}

}

JDK proxy dinámico. Sólo cuando la transacción generará un proxy dinámico llamada directamente. llamadas a objetos devueltos en un recipiente SpringIoC es un objeto proxy en lugar de un objeto real. Y esto aquí es EmployeeService objeto real en lugar del objeto proxy.

 

solución:

1, en el método transacción abierta guardar, no hay ninguna transacción método saveEmployee predeterminada o una transacción, y la captura tirar Método nueva RuntimeException A (); (rollbackFor Cuando no se especifica, el valor predeterminado es una reversión excepción RuntimeException), tal uso es para salvar método de transacción. (Asegúrese de arrojar nueva RuntimeException (); de lo contrario excepción es el proceso de captura, lo mismo no se retrotraerá) de la siguiente manera:

@Transactional () // asuntos abiertos

public void Save () {

tratar {

this.saveEmployee (); // llamada aquí esta transacción va a fracasar, se guardan los datos

} Catch (Exception e) {

e.printStackTrace ();

throw new RuntimeException ();

}

}

 

Publicado cuatro artículos originales · ganado elogios 0 · Vistas 38

Supongo que te gusta

Origin blog.csdn.net/a970066364/article/details/104736992
Recomendado
Clasificación