MySQL的事务

MySQL 的 事务(Transaction) 是一组操作的集合,这些操作作为一个单一的单元执行,要么全部成功,要么全部失败。事务在保证数据一致性和完整性方面发挥着重要作用,尤其在并发环境下确保数据的安全性和准确性。


事务的四大特性:ACID

  1. 原子性(Atomicity)

    • 事务中的操作要么全部执行,要么全部不执行。即使发生错误或中断,事务所做的部分操作也不会被提交,整个事务会被回滚。
    • 例子:银行转账操作,若一个操作失败(如余额更新),则整个操作会回滚,不会部分成功。
  2. 一致性(Consistency)

    • 事务开始前和结束后,数据库必须处于一致的状态。事务中的操作必须保持数据库的完整性约束。
    • 例子:转账操作前后,账户的总余额应始终相等。
  3. 隔离性(Isolation)

    • 一个事务的执行不应受其他事务干扰,每个事务都应像独立运行一样。MySQL 提供了不同级别的隔离性来控制事务之间的干扰。
    • 例子:在一个事务完成前,其他事务无法看到中间的修改(视事务隔离级别而定)。
  4. 持久性(Durability)

    • 一旦事务被提交,对数据库的修改就是永久性的,即使系统崩溃也能保证数据不会丢失。
    • 例子:当银行的转账事务提交后,即使数据库崩溃,转账结果仍然会被保留。

事务控制语句

MySQL 提供了几种基本的事务控制语句,用于管理事务的开始、提交和回滚。

  1. START TRANSACTIONBEGIN

    • 启动一个新的事务。
    • 事务开始后,可以执行一系列的数据库操作。
    START TRANSACTION;
    -- 或者
    BEGIN;
  2. COMMIT

    • 提交当前事务,所有的修改将会被保存到数据库中。
    COMMIT;
  3. ROLLBACK

    • 回滚当前事务,撤销在当前事务中执行的所有操作。
    ROLLBACK;
  4. SAVEPOINTROLLBACK TO SAVEPOINT

    • 用于在事务内设置一个保存点,可以回滚到某个保存点,而不是回滚整个事务。
    SAVEPOINT my_savepoint;
    -- 在事务中的某个地方回滚到保存点
    ROLLBACK TO SAVEPOINT my_savepoint;

事务的隔离级别

MySQL 提供了四种事务隔离级别,用来控制事务之间的可见性和干扰程度:

  1. READ UNCOMMITTED(读取未提交):

    • 一个事务可以读取另一个事务未提交的数据,可能会导致脏读(dirty read)。
    • 最低级别,性能较高,但可能导致数据不一致。
  2. READ COMMITTED(读取已提交):

    • 事务只能读取已经提交的事务的数据,避免了脏读,但可能发生不可重复读(non-repeatable read)。
  3. REPEATABLE READ(可重复读):

    • 确保事务在执行过程中多次读取相同的数据时结果一致,避免了脏读和不可重复读,但可能会发生幻读(phantom read)。
    • MySQL 的默认隔离级别。
  4. SERIALIZABLE(串行化):

    • 最强的隔离级别,事务串行执行,完全避免脏读、不可重复读和幻读,但会显著降低性能。
    • 在这个级别下,事务执行时会加锁,防止其他事务同时访问数据。
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

事务的锁机制

MySQL 在事务处理中使用了不同类型的锁来保证数据一致性和并发控制。常见的锁类型包括:

  1. 共享锁(S 锁)

    • 允许其他事务读取数据,但不能修改数据。
    • 常用于 SELECT ... FOR SHARE 查询。
  2. 排他锁(X 锁)

    • 只有当前事务能读取和修改数据,其他事务无法访问该数据。
    • 常用于 SELECT ... FOR UPDATE 查询。
    • 当事务对某一行数据执行 UPDATE、DELETE 或 INSERT 操作时,会自动为该行加上排他锁。
  3. 意向锁(Intention Lock)

    • 用于表级锁,指示事务将在某些行上请求共享锁或排他锁。

事务示例

假设有两个账户表 accounts,我们要在一个事务中完成资金的转移。

-- 开始事务
START TRANSACTION;
-- 从账户 A 中扣款
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 向账户 B 中存款
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;

如果在这个过程中发生任何错误,可以使用 ROLLBACK 回滚事务,撤销所有的修改。


事务的自动提交

MySQL 默认启用自动提交模式(autocommit),即每一条 SQL 语句都会被自动提交作为一个独立的事务。如果你希望手动控制事务,可以禁用自动提交模式。

-- 禁用自动提交
SET autocommit = 0;
-- 启用自动提交
SET autocommit = 1;

死锁(Deadlock)

在并发事务的情况下,如果两个或多个事务相互等待对方释放锁,可能导致死锁。MySQL 会自动检测到死锁,并回滚其中一个事务,以解除死锁。

死锁示例:

  • 事务 A 锁定了表 accounts 的一行,准备更新。
  • 事务 B 锁定了表 accounts 的另一行,准备更新。
  • 事务 A 等待事务 B 提交,事务 B 等待事务 A 提交,形成死锁。

MySQL 会自动检测并回滚其中一个事务,解除死锁。


总结

  • 事务确保数据的一致性、可靠性和并发控制。
  • 通过 START TRANSACTIONCOMMITROLLBACK 来显式控制事务的执行。
  • 事务支持四种隔离级别,确保事务之间的可见性。
  • 事务使用不同的锁来控制并发操作,防止冲突和数据不一致。

了解事务的原理和操作,可以帮助你更好地设计数据库应用,确保数据的安全性和高效性。

注意:该内容由由AIGC提供。

posted @   长空nice  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示