MySQL의 트랜잭션 기본 사항: ACID 완료, 자동 커밋 지원

마지막 업데이트 : 11/05/2025
  • InnoDB는 ACID, bloqueo 또는 fila y REPEATABLE READ 또는 결함을 트랜잭션합니다.
  • 원자성을 위해 자동 커밋, 트랜잭션 시작, 커밋/롤백 및 저장점을 제어합니다.
  • Ajusta niveles de aislamiento y modos READ ONLY/READ WRITE con SET TRANSACTION.
  • Evita sucias, no repetibles y fantasmas Equilibrando Consencia y rendimiento.

MySQL 트랜잭션

Las transacciones en MySQL son el pilar para Operar con datos de forma segura cuando intervienen varias sentencias que deben comportarse como una sola unidad. Si algo falla por el camino, queremos volver al estado anterior sin dejar la base de datos a medias. 이 문서에는 완전한 기능 설명과 함께 설명이 포함되어 있으며, 균형 일관성과 렌디미엔토를 구성하는 데 필요한 프로피에이드가 있습니다.

기본 지침서 트랜잭션 시작, 커밋 및 롤백, veremos el papel de 자동 커밋, ACID의 수준, 자물쇠, 저장점, modos de acceso y 거래 설정. 이 경우에는 동일한 문제가 있는 경우가 포함됩니다. 주의 사항 InnoDB 대 MyISAM, como manejar transacciones desde PHP(MySQL)저장 프로시저, Así como una batería de casos prácticos para que puedas afianzar lo aprendido. DAW, DAM 또는 ASIR을 준비하는 경우 모든 준비가 완료되어야 합니다..

DAW, DAM 및 ASIR에 대한 BD 정보 — 2025/2026년 코스. Este 자료 sintetiza las mejores prácticas y la teoría clave 전문적인 MySQL 형식으로 트랜잭션을 수행하려면 지배적인 역할이 필요합니다.

주의: El dinero donado nos sirve para mantener nuestro sitio web, así como para generar mejor contenido. Tu apoyo nos ayuda a seguir creando guías técnicas útiles y al día.

Qué es una transacción y por qué importa

Una transacción es una unidad lógica de trabajo que agrupa varias sentencias de forma que o se aplican todas o no se aplica ninguna. Esto evita estados inconsiles, especialmente en opaciones que tocan varias tablas or filas. Piensa en un traspaso entre quentas bancarias: se descuenta de la quenta origen y se abona en la destino; si una de las acciones falla, no puedes allowedir que la otra quede verifyada sola.

MySQL, 모터와 함께 InnoDB, transacciones según el modelo 구현 ACID, Proporcionando garantías solidas de integridad incluso ante fallos de sistema o cortes de luz. Si vienes de otros SGBD, te sentirás como en casa: los Conceptos clave son los mismos.

Propiedades ACID: las cuatro garantías

  • 원자성: el bloque se trata como indivisible; o 할 일 OK o nada. Si una Operación falla, se revierte todo el conjunto.
  • 일관성: cada transacción lleva la base de datos de un estado válido a otro. No deja reglas de negocio vulneradas ni datos imposibles.
  • 격리: lo que ocurre dentro de una transacción 더 이상 간섭하지 마세요. por otras que se ejecutan en paralelo, según el nivel elegido.
  • 내구성: una vez haces COMMIT, 로스 캄비오스 케단 퍼시시도스 incluso ante fallos.

InnoDB vs MyISAM: 모터의 중요성

MySQL에는 다양한 종류가 있습니다 스토리지 엔진. 솔로 InnoDB는 트랜잭션 및 클라이브를 위한 솔루션입니다.; además ofrece bloqueo a nivel de fila y recuperación ante fallos. MyISAM은 트랜잭션을 지원하지 않습니다. 우선적으로 속도를 조절하고 일관성을 유지하고 강의 강도를 높이기 위해 노력해야 합니다. 더 이상 ACID가 필요하지 않습니다..

자동 커밋: qué es y cómo te afecta

MySQL은 어떻게 작동합니까? 결함이 있는 경우 자동 커밋 활성화. Esto significa que, fuera de una transacción explícita, Cada sentencia DML은 자동 확인을 통해 확인됩니다. como si estuviese envuelta por START TRANSACTION y COMMIT. Si la sentencia falla, se revierte automáticamente ese 의도, pero si tiene éxito, no podrás deshacerla manualmente con ROLLBACK.

거래에 대한 초기 정보 START TRANSACTION, MySQL desactiva temporarymente el autocommit hasta que haces COMMIT o ROLLBACK. Puedes cambiar el autocommit a nivel de sesión con SET:

-- Ver el valor actual
SELECT @@autocommit;

-- Desactivar autocommit en la sesión actual
SET autocommit = 0;

-- Activarlo de nuevo
SET autocommit = 1;

자동 커밋 비활성화, los cambios no sonpermanes hasta que ejecutes COMMIT; si quieres descartarlos, 미국 ROLLBACK. 세션 구성에 대한 10가지 질문 se Resetea al cerrar la conexion.

기본 명령: START TRANSACTION, COMMIT 및 ROLLBACK

El ciclo típico es: 초기 트랜잭션, 실행 DML 및 디샤서 확인 결국 결과가 나왔습니다. Tienes sinónimos como BEGIN o BEGIN WORK 시작하려면, y COMMIT/ROLLBACK para finalizar:

START TRANSACTION;
  UPDATE cuentas SET saldo = saldo - 100 WHERE id = 20;
  UPDATE cuentas SET saldo = saldo + 100 WHERE id = 30;
COMMIT; -- o ROLLBACK si algo fue mal

Si el sistema cae entre las dos UPDATE o se pierde la conexion con autocommit desactivado, InnoDB는 트랜잭션이 완료되지 않았음을 확인했지만 확인하지 못했습니다.. Si una de las curentas는 존재하지 않거나 제한이 없습니다. (p. ej., CHECK de saldo no negativo) falla, la transacción se revierte y la base queda como al principio.

세이브포인트: fino dentro de la transacción 제어

SAVEPOINT creas puntos de recuperación dentro de una transacción para poder deshacer parcialmente sin tirar todo el trabajo:

START TRANSACTION;
  UPDATE productos SET stock = stock - 2 WHERE id = 10;
  SAVEPOINT p1;
  UPDATE productos SET stock = stock - 5 WHERE id = 11;
  -- Si falla lo siguiente, solo deshacemos hasta p1
  ROLLBACK TO SAVEPOINT p1;
  -- Seguimos con otras operaciones
RELEASE SAVEPOINT p1;
COMMIT;

Si는 varios SAVEPOINT con el mismo nombre를 정의합니다., MySQL은 최후의 수단으로 간주됩니다. 탐비엔 푸에데스 eliminarlos con RELEASE SAVEPOINT para mantener limpia la transacción.

Niveles de aislamiento: 균형은 일관성과 렌디미엔토에 맞춰져 있습니다.

MySQL es에 대한 결함이 있는 경우 REPEATABLE READ, que ofrece lecturas coherentes dentro de la misma transacción gracias al multiversioning (MVCC).

동시성 고전 문제 que queremos acotar:

  • Lectura sucia (Dirty Read): leer cambios de otra transacción que aún no ha hecho COMMIT.
  • 반복 불가능한 강의: leer la misma fila dos veces y obtener valores distintos por actualizaciones confirmadas de otra transacción entre ambas lecturas.
  • 환상 읽기: ejecutar la misma Consulta y que 아파레즈칸 필라스 누에바스 거래 확인을 위해 삽입을 확인하세요.

Comportamiento por nivel(실습 재개): READ UNCOMMITTED permite las tres anomalías; READ COMMITTED evita lecturas sucias pero puede sufrir no repetibles y fantasmas; REPEATABLE READ 에비타 스시아스 이 노 레페터블스 y, 일반적으로 솔로는 "환타지"의 가능성을 인정합니다. SERIALIZABLE bloquea como si ejecutaras en serie, las tres a Costa de más bloqueos를 제거합니다.

-- Consultar nivel de aislamiento (sesión y global)
SELECT @@transaction_isolation;     -- sesión
SELECT @@global.transaction_isolation; -- global

Puedes ajustar el aislamiento por transacción, sesión o globalmente. Recuerda que los cambios GLOBAL afectan a nuevas conexiones, 존재하지 않습니다.

Bloqueos y lecturas con bloqueo

Para mantener el aislamiento, 엘 모터 미국 블로케오스(잠금). InnoDB 블록은 결함이 있음 필라 수준, lo que allowede mayor concurrencia que el bloqueo por tabla. Un bloqueo impide que otras transacciones vean o alteren datos en uso mientras la tuya no haya finalizado.

Según el nivel y la Operación, MySQL은 escritura에 대한 강의 블록을 요구합니다.. 예를 들어, SERIALIZABLE con autocommit desactivado convierte lecturas en bloqueantes para reforzar la Consencia. 데이터의 “즉각적”인 인터파이어를 통해 개체를 제거할 수 있습니다..

액세스 모드: READ WRITE y READ ONLY

Las transacciones pueden declararse en modo READ WRITE (기본값) 또는 READ ONLY. En modo solo lectura, no se permiten cambios 따라서, 재현성과 안정성을 알려줄 때까지.

-- Establecer modo de acceso al iniciar
START TRANSACTION READ ONLY;
-- o
START TRANSACTION READ WRITE;

También puedes fijarlo con SET TRANSACTION, Combinándolo con el nivel de aislamiento y el 범위 응용 프로그램의.

설정된 트랜잭션: aislamiento, acceso y ambitos(세션, 글로벌)

문장 SET TRANSACTION permite establecer el nivel de aislamiento y el modo de acceso para la 다음 거래, 전체 세션 또는 방법 글로벌:

-- Aplica a la próxima transacción (si no indicas ámbito)
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY;

-- Aplica a todas las transacciones de esta sesión actual
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;

-- Aplica a sesiones futuras (no a las existentes)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

Este control fino te permite 평형 fiabilidad y rendimiento según el caso de uso, 높은 동시 OLTP 분석을 수행합니다.

동시 예제: Dirty Read, No Repetible y Fantasma

Dirty Read (읽어보세요): una transacción B lee valores는 A. Con에 의해 확인되지 않습니다. READ UNCOMMITTED esto es posible; con READ COMMITTED en adelante, 아니요.

-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
-- (sin COMMIT todavía)

-- Terminal B
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT saldo FROM cuentas WHERE id = 1; -- puede ver el saldo "sucio"

-- Terminal A
ROLLBACK; -- los cambios se deshacen

반복 불가능한 강의: B는 A. Con의 강의 내용 업데이트를 확인합니다. REPEATABLE READ 로 에비타스; 콘 READ COMMITTED puede ocurrir.

-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT saldo FROM cuentas WHERE id = 1; -- lectura 1

-- Terminal B (otra sesión)
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
COMMIT;

-- Terminal A
SELECT saldo FROM cuentas WHERE id = 1; -- lectura 2 (puede diferir)
ROLLBACK;

환상 읽기: entre dos Consultas que agregan datos, otra transacción inserta filas que encajan en el filtro. Con SERIALIZABLE se evita a costa de más bloqueos.

-- Terminal A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT SUM(saldo) FROM cuentas;

-- Terminal B
INSERT INTO cuentas(id, saldo) VALUES (4, 3000);
COMMIT;

-- Terminal A
SELECT SUM(saldo) FROM cuentas; -- puede observar un "fantasma"
ROLLBACK;

DML 필수 및 claves foráneas: efectos ON DELETE / ON UPDATE

엘 DML 그룹 SELECT, INSERT, UPDATE 및 DELETE. InnoDB에 대한 정의가 명확하고, 테이블 참조에 대한 보라도스/실제화에 대한 설명이 나와 있습니다.

  • RESTRICT: 참조를 제거/실제화하는 것을 방해합니다. MySQL에 결함이 있는 경우.
  • CASCADE: propaga la acción a las filas hijas.
  • SET NULL: pone el valor a NULL en las filas hijas.
  • NO ACTION: 동등한 RESTRICT MySQL에서.
  • SET DEFAULT: MySQL에서는 InnoDB를 사용할 수 없습니다.

Estas reglas son clave para asegurar 일관성 참조 y는 거래 및 관계 완료로 인한 데이터 손실을 방지합니다.

PHP 트랜잭션(mysqli): 자동 커밋, 커밋 및 롤백

PHP로 프로그램을 만드는 방법 mysqli, puedes controlar transacciones de forma sencilla. 자동 커밋 해제, 이 경우 문의 후 확인 결과를 확인하세요.

$db = new mysqli("localhost", "root", "pass", "database");
$db->autocommit(false);

try {
  $db->query("INSERT INTO users (name) VALUES ('marcus')");
  $db->query("UPDATE users SET name = 'jane' WHERE id = 39");
  $db->commit();
} catch (Throwable $e) {
  $db->rollback();
  // log del error
}

이 패턴을 사용하면 si cualquier sentencia falla, haces rollback() y evitas inconsistencias. Luego는 나중에 어떤 조치를 취할 것인지에 대한 통지, 통지를 결정합니다.

MySQL의 오류 처리 및 오류 처리 절차

MySQL이 선언하는 과정을 진행 중입니다. manejadores de errores 파라 SQLEXCEPTION y SQLWARNING그래서 배출하다 ROLLBACK 자동적으로 ante fallos:

DELIMITER //
CREATE PROCEDURE transferir(IN p_origen INT, IN p_destino INT, IN p_importe DECIMAL(10,2))
BEGIN
  DECLARE exit handler FOR SQLEXCEPTION
  BEGIN
    ROLLBACK;
  END;

  START TRANSACTION;
    UPDATE cuentas SET saldo = saldo - p_importe WHERE id = p_origen;
    UPDATE cuentas SET saldo = saldo + p_importe WHERE id = p_destino;
  COMMIT;
END //
DELIMITER ;

다른 방법으로 오류가 발생했을 때 다른 방법을 사용하는 방법을 알아보세요. 객체를 중앙 집중화하고 반전 및 기본 림프화를 해제합니다. cuando algo no va bien.

Casos prácticos propuestos: pon a prueba lo aprendido

Tienda de informática

  • Inserta fabricantes indicando código y nombre; y también solo con nombre.
  • Inserta productos asociados a fabricantes con diferentes conjuntos de Columnas(con y sin código).
  • Crea la tabla fabricante_productos 콘 칼럼 nombre_fabricante, nombre_producto, precio e inserta de una sola vez todos los registros 부터 tienda.
  • Crea la vista vista_fabricante_productos con las tres Columnas anteriores.
  • Elimina fabricantes 으로 Asus o Xiaomi y razona por qué puede no ser posible; ajusta claves foráneas (p. ej., ON DELETE) si hace falta.
  • Actualiza códigos 제조업체 (Lenovo 20, Huawei a 30) y 분석은 필수 항목을 제한합니다.
  • Actualiza precios sumando 5 € todos los productos; 엘리미나 임프레소라스 con precio < 200 €.

Empleados

  • Inserta departmentamentos con diferentes Combinaciones de Columnas(con y sin código, con gastos).
  • Inserta empleados vinculados a Departmentmentos(con y sin código explícito).
  • Crea y relena departamento_backup ~로부터 departamento.
  • Elimina departamentos (Proyectos, Desarrollo) y justifica si se puede o no; 필요한 경우에만 해당됩니다.
  • Actualiza códigos (예: Recursos Humanos 30으로; Publicidad 40) evaluando Impacto 참조.
  • Incrementa presupuestos +50.000 € 솔로 파라 로스 < 20.000 €.
  • 트랜잭션: elimina empleados sin Departmentamento asociado garantizando Consencia.

원예

  • Inserta oficina en Almería 당신은 통풍을 대표하는 직원입니다.
  • 클라이언트 삽입 cuyo commercial sea el empleado anterior; crea un pedido con al menos dos productos.
  • 고객의 거래 사실 확인 y verifica cambios en tablas relacionadas; 삭제하다 y 수정 효과; 건초 카스카다도 없고, 구성 ON DELETE CASCADE.
  • 엘리미나 클라이언트 sin pedidos; 20% 할인 el precio de productos sin pedidos; 보라 파고스 고객의 신용 한도를 확인하세요.
  • Ajusta límite de crédito 0 para el cliente con menos unidades del producto 11679.
  • Modifica la tabla detalle_pedido añadiendo campo iva; mediante una transacción pon 18 a pedidos desde enero 2009 y 21 나머지.
  • 추가 캄포 total_linea y 계산 con precio_unidad*cantidad*(1 + (iva/100)) para todos los registros.
  • Borra el cliente 신용 제한이 있는 경우: evalúa si se puede con una sola Consulta y por qué.
  • Inserta oficina en Granada con tres comerciales y 트레스 클라이언트 사회 구성원; 거래 para un pedido por cliente con dos productos cada uno; 고객을 보라 y ajusta foráneas si no 건초 캐스케이드; 거래 para registrar pagos de esos pedidos.

Ensayo adicional útil: simula una pérdida de conexion con SET AUTOCOMMIT = 0, cierra la sesión antes de finalizar y luego reconecta para comprobar qué quedó persistido y qué no. 내구성과 원자성 개념에 대한 정의.

SQL Server와 Oracle의 빠른 비교

Los conceptos son homólogos: 거래 시작/시작, COMMIT, 롤백 y 격리 수준. SQL Server는 이미 존재하고 있습니다. 스냅 사진Presenta una vista Consiste al inicio de la transacción sin bloquear tanto como 직렬화 가능. Oracle ofrece un conjunto 유사한 de niveles; en la práctica, cambia el “dialecto” pero la música es la misma: se busca el punto óptimo entre aislamiento y rendimiento.

시험/기업의 사전 팁

  • ¿ Qué son las propiedades ACID? Defínelas y pon un ejemplo.
  • ¿ Cuáles son los tres Problemas de Concurrencia 당신은 이슬람교도와 함께 mitigarlos를 알고 있습니까?
  • InnoDB에 결함이 있는 이유는 무엇입니까? 반복해서 읽을 수 있음.
  • MyISAM을 통해 거래할 수 있나요? 아니요, InnoDB가 필요합니다.
  • InnoDB와 MyISAM의 차이점: transacciones, foráneas, bloqueo por fila, 회복 등
  • 은행 송금: ¿qué pasa si falla una UPDATE 중개자 o si la quenta가 존재하지 않나요? Respuesta: 롤백 asegura Consencia.

MySQL을 통한 지배적인 트랜잭션이 결합에 포함되었습니다. ACID, 자동 커밋, aislamiento, bloqueos, 저장점 및 액세스 모드 para proteger tus datos sin estrangular el rendimiento. 콘 InnoDB, Tienes las herramientas para que Operaciones complejas(파고스, 페디도스, 인벤타리오) se comporten como una sola acción segura. 아주스타 거래 설정 al caso de uso, apóyate en 절차 및 오류 제어, y practica con los casos propuestos: el salto de calidad en tus sistemas se nota enseguida.

visión General de sistemas de almacenamiento de datos
관련 기사 :
Visión General de sistemas de almacenamiento de datos
관련 게시물: