《MySQL事务基础:从入门到精通》

事务在数据库中的重要性

事务是数据库管理系统中的核心概念,确保数据操作的完整性和可靠性。在涉及多个相关操作的场景中,事务可以保证这些操作要么全部成功,要么全部失败,避免数据处于不一致的状态。

银行转账是一个典型的事务应用场景:从账户A扣款并存入账户B,这两个操作必须作为一个整体执行。如果扣款成功但存款失败,没有事务机制会导致资金丢失;如果扣款失败但存款成功,会导致凭空产生资金。

事务的基本概念

事务是数据库操作的最小逻辑单元,具备ACID特性:

原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。例如转账中扣款和存款必须同时成功或失败。

一致性(Consistency):事务执行前后,数据库从一个一致状态变到另一个一致状态。转账前后两个账户的总额应保持不变。

隔离性(Isolation):多个事务并发执行时,一个事务的操作不应影响其他事务。例如两个转账事务同时修改同一账户时需隔离处理。

持久性(Durability):事务完成后,其结果永久保存在数据库中,即使系统故障也不丢失。

MySQL中的事务操作

MySQL通过以下语句支持事务控制:

START TRANSACTIONBEGIN 开启一个事务。

COMMIT 提交事务,确认所有变更。

ROLLBACK 回滚事务,撤销所有未提交的变更。

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

SET autocommit=0 关闭自动提交模式,需手动提交;SET autocommit=1 启用自动提交。

autocommit=1 (启用):

  1. 每条语句自动提交
  2. 不需要显式使用 COMMIT 或 ROLLBACK
  3. 适合简单的单语句操作

autocommit=0 (禁用):

  1. 需要显式使用 COMMIT 提交事务
  2. 可以执行多条语句作为一个事务
  3. 适合需要原子性操作的复杂业务逻辑

事务隔离级别

MySQL支持四种隔离级别:

读未提交(READ UNCOMMITTED):可能读取到其他事务未提交的数据,导致脏读。

读已提交(READ COMMITTED):只读取已提交的数据,避免脏读,但可能出现不可重复读。

可重复读(REPEATABLE READ):MySQL默认级别,确保同一事务中多次读取结果一致,避免不可重复读,但可能出现幻读。

串行化(SERIALIZABLE):最高隔离级别,完全隔离事务,避免所有并发问题,但性能最低。

设置隔离级别:

--查看全局作用域,全局系统变量,所有会话都生效
SELECT @@GLOBAL.transaction_isolation;

--查看会话作用域,当前会话生效
SELECT @@SESSION.transaction_isolation;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
--设置全局作用域
set global transaction isolation level READ UNCOMMITTED;
--设置会话作用域
set session transaction isolation level READ UNCOMMITTED;

一句话总结读取的错误:

  • 脏读:读到别人没写完的草稿(可能错)。

  • 不可重复读:同一行数据,读两次不一样(被修改了)。

  • 幻读:同一批数据,读两次数量不一样(新增/删除了数据)。

常见错误与避免方法

长时间运行的事务会锁定资源,影响系统性能。应避免在事务中包含用户交互或耗时操作。

未正确处理事务边界可能导致部分提交。确保业务逻辑的异常处理中包含ROLLBACK。

过度使用事务会降低系统吞吐量。非关键操作或单条语句操作可能不需要事务。

高级话题

保存点(SAVEPOINT) 允许事务部分回滚:

SAVEPOINT point1;
ROLLBACK TO point1;

最佳实践

事务应尽量短小,减少锁定时间和资源占用。

根据业务需求选择适当的隔离级别,平衡一致性和性能。

事务中避免包含网络请求或用户交互等不可控操作。

批量操作可以考虑拆分事务,避免单一大事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值