Pregunta

Yo estaba leyendo acerca de RDBMS, y una propiedad de un RDBMS es atomicidad. Por lo tanto, si se retira el dinero de una cuenta y se transfiere a otro, ya sea la transacción pasará por completo o no en absoluto. No hay parcial actas. Pero, ¿cómo es en realidad asegurado?

consultas SQL para el escenario anterior podría parecer (I) el equilibrio conjunto ACTUALIZACIÓN accounts = saldo - DONDE cantidad ac_num = 101 (Ii) el equilibrio de Actualización de Conjunto accounts = saldo + cantidad DONDE ac_num = 102

Lo que de ninguna manera se asegura la atomicidad .. Entonces, ¿cómo es lo que realmente sucede?

¿Fue útil?

Solución

Si lo hace

BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION

El sistema de base de datos va a escribir notas a lo que se ha hecho por los cambios en la cuenta 101. Y luego, si el trabajo a causa 102 fallaría, el RDBMS utiliza esas notas para deshacer la obra de 101.

Por otra parte, cuando se ha empezado a trabajar en la cuenta 101 se lleva a un bloqueo en la base de datos, por lo que nadie más puede venir a leer la actualiza, pero no los datos confirmados en cuenta 101. (Una cerradura aquí es básicamente sólo una nota en alguna parte "Estoy trabajando aquí, no toque".)

Otros consejos

Para ser atómica, las transacciones tienen que:

  • Evitar que otras transacciones de interferir con las filas que están escribiendo o leyendo
  • Asegúrese de que todos o ninguno de los cambios que hace la transacción, habrá en la base de datos cuando se confirma la transacción.

El primero se logra mediante de bloqueo filas que la transacción lee o escribe durante su ejecución.

En segundo lugar uno se hace para que las transacciones escriben sus acciones en un registro de transacciones . Esto hace que la base de datos capaz de recuperar incluso cuando el servidor no recibe alimentación durante una transacción. En este caso, el proceso de recuperación va a leer el registro, asegúrese de que las transacciones activas (uncommited) quedan abortados y los cambios realizados por ellos se cancelan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top