MySQL 事务(Transaction)是一组SQL语句,它们作为一个逻辑单元一起执行,要么全部成功执行(提交),要么全部失败(回滚)。事务确保了数据库操作的一致性和完整性,即使在多个并发用户同时访问数据库的情况下也能保证数据的正确性。
特性 ACID
事务遵循ACID(原子性、一致性、隔离性、持久性)四个基本特性:
-
原子性(Atomicity):
事务是一个原子操作单元,其对数据的修改要么全部执行,要么全部不执行。如果事务中的任何一条语句失败,则整个事务都会被回滚到事务开始之前的状态,数据库不会被修改。 -
一致性(Consistency):
事务在开始和完成时,数据库的完整性约束没有被破坏。这意味着在事务开始之前和事务结束之后,数据库必须保持一致状态。 -
隔离性(Isolation):
多个事务并发执行时,每个事务的操作都应该与其他事务隔离。隔离性的级别决定了一个事务可能会受到其他事务影响的程度。MySQL支持不同的隔离级别,例如读未提交、读提交、可重复读和串行化。 -
持久性(Durability):
一旦事务提交,事务所做的修改将会永久保存在数据库中,即使系统崩溃也不会丢失。持久性通常通过数据库的日志系统来实现,确保已提交的事务在数据库中恢复时不会丢失。
语法
在MySQL中,可以使用以下语法开启、提交和回滚事务:
-
开启事务:
START TRANSACTION; BEGIN;#简写
-
提交事务:
COMMIT;
-
回滚事务:
ROLLBACK;
示例:
START TRANSACTION;
-- 执行一系列SQL语句
INSERT INTO orders (order_id, product_id, quantity) VALUES (1, 101, 10);
UPDATE products SET stock = stock - 10 WHERE product_id = 101;
-- 检查是否有足够的库存,如果不足,则回滚事务
SELECT stock FROM products WHERE product_id = 101;
IF stock < 0 THEN
ROLLBACK;#回滚
ELSE
COMMIT;#提交
END IF;
在这个示例中,如果更新操作后发现库存不足,则会回滚整个事务,确保订单和库存操作的原子性和一致性。
注意事项
在使用MySQL事务时,需要注意以下几点:
-
事务的边界:事务应该尽可能地小,只包含必要的操作。长时间持有事务可能会阻塞其他用户对数据库的访问,降低系统的并发性能。
-
隔离级别选择:根据业务需求选择合适的隔离级别,平衡并发性能和数据一致性的要求。
-
异常处理:在编写事务时考虑可能出现的异常情况,并确保事务的回滚和提交逻辑正确处理。