厦门网站排名营销网站建设培训
厦门网站排名,营销网站建设培训,销售网站开发意义,公司网站的后台#x1f525; MySQL事务核心知识大全
#x1f4d6; 什么是事务#xff1f;
事务是一组操作的集合#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销#xff0c;即这些操作要么同时成功#xff0c;要么同时失败。
-- 银行转账示… MySQL事务核心知识大全 什么是事务事务是一组操作的集合它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销即这些操作要么同时成功要么同时失败。-- 银行转账示例BEGIN;UPDATEaccountSETbalancebalance-100WHEREid1;-- 扣钱UPDATEaccountSETbalancebalance100WHEREid2;-- 加钱COMMIT;-- 要么都成功-- ROLLBACK; -- 要么都失败 ACID四大特性特性中文一句话解释生活类比Atomicity原子性要么全做要么全不做转账扣钱和加钱必须一起完成Consistency一致性数据要符合业务规则总金额不变余额不为负Isolation隔离性并发执行互不干扰排队取钱一个接一个Durability持久性一旦提交永久生效用笔写在纸上不会消失详细解释 原子性Atomicity事务是不可分割的最小操作单位要么同时成功要么同时失败。-- 如果扣钱成功加钱失败整个事务回滚BEGIN;UPDATEaccountSETbalancebalance-100WHEREid1;-- ✅UPDATEaccountSETbalancebalance100WHEREid2;-- ❌ROLLBACK;-- 回到最初状态钱没丢 一致性Consistency事务完成时必须使所有数据都保持一致状态满足业务规则。-- 转账前后总金额不变-- 余额不能为负数-- 不能出现“钱凭空消失”的逻辑错误 隔离性Isolation多个事务并发执行时互不干扰就像在独立环境中运行。-- 两个人同时转账结果要正确-- 不能出现互相影响的情况 持久性Durability事务一旦提交数据永久保存即使系统崩溃也不会丢失。COMMIT;-- 数据落盘断电也不怕 事务隔离级别1. 四个级别对比隔离级别中文脏读不可重复读幻读性能Read Uncommitted读未提交✅✅✅最高Read Committed读已提交❌✅✅↑Repeatable Read可重复读❌❌✅↓Serializable串行化❌❌❌最低MySQL默认隔离级别Repeatable Read可重复读2. 三种并发问题 脏读读到其他事务未提交的数据-- 事务A修改未提交UPDATEaccountSETbalance800WHEREid1;-- 事务B读到未提交数据SELECTbalanceFROMaccountWHEREid1;-- 800-- 如果事务A回滚事务B读到的就是脏数据 不可重复读同一个事务内两次读取同一数据结果不一致-- 事务A第一次读SELECTbalanceFROMaccountWHEREid1;-- 1000-- 事务B修改并提交UPDATEaccountSETbalance800WHEREid1;COMMIT;-- 事务A第二次读SELECTbalanceFROMaccountWHEREid1;-- 800-- 同一个事务内两次结果不一样 幻读同一个事务内两次查询结果集行数不同-- 事务A第一次查询SELECT*FROMaccountWHEREbalance500;-- 3条-- 事务B插入新数据INSERTINTOaccountVALUES(4,赵六,600);COMMIT;-- 事务A第二次查询SELECT*FROMaccountWHEREbalance500;-- 4条-- 多出来一条幻影数据3. 用生活场景理解隔离级别微信群聊类比Read Uncommitted张三打了我…还没发出去你就能看到他在输入Read Committed张三发出消息你才能看到但刷新一下消息可能变了Repeatable Read你看到的消息始终不变但可能突然多出一条新消息Serializable大家排队发言一个人说完另一个才能说4. 操作命令-- 查看当前隔离级别SELECTTRANSACTION_ISOLATION;-- 设置当前会话隔离级别SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;-- 设置全局隔离级别SETGLOBALTRANSACTIONISOLATIONLEVELREADCOMMITTED;-- 示例设置为读已提交SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;⚖️ 隔离级别选择策略业务场景推荐级别原因金融转账Serializable必须绝对安全电商订单Repeatable Read防止重复下单报表统计Read Committed接受实时变化日志记录Read Uncommitted性能优先MySQL默认Repeatable Read平衡性能和安全⚠️注意隔离级别越高数据越安全但是性能越低️ 事务操作命令开启事务BEGIN;-- 或 START TRANSACTION;提交事务COMMIT;回滚事务ROLLBACK;保存点SavepointSAVEPOINTsp1;-- 设置保存点-- 一些操作...ROLLBACKTOsp1;-- 回滚到保存点 MySQL优化策略1. 索引优化-- 为经常查询的字段建索引CREATEINDEXidx_balanceONaccount(balance);2. 分库分表-- 水平分表按用户ID取模-- user_0, user_1, user_2, user_3...-- 垂直分表按字段拆分-- user_base(id, name) 基础信息表-- user_detail(id, address, phone) 详细信息表3. 读写分离主库写操作 从库读操作 减轻数据库压力4. 连接池配置# 连接池参数调优maximum-pool-size:20minimum-idle:5connection-timeout:30000 面试八股文汇总Q1: 什么是事务事务是一组操作的集合具有ACID四大特性保证数据的一致性和完整性。Q2: ACID分别是什么原子性要么全做要么全不做一致性数据符合业务规则隔离性并发事务互不干扰持久性提交后永久保存Q3: 脏读、不可重复读、幻读的区别问题现象解决级别脏读读到未提交数据Read Committed不可重复读同一数据两次读不一致Repeatable Read幻读结果集行数变化SerializableQ4: MySQL默认隔离级别是什么为什么MySQL默认是Repeatable Read可重复读。因为MySQL在RR级别通过MVCC解决了幻读问题所以RR级别既能保证数据一致性又有较好的性能。Q5: 如何解决幻读升级到Serializable级别性能差MySQL InnoDB的Next-Key Lock在RR级别解决幻读使用乐观锁或悲观锁手动控制Q6: 事务隔离级别越高越好吗不是。隔离级别越高数据越安全但并发性能越差。需要根据业务场景在安全和性能之间做权衡。Q7: 什么情况会导致死锁-- 事务AUPDATEaccountSETbalance800WHEREid1;UPDATEaccountSETbalance500WHEREid2;-- 事务BUPDATEaccountSETbalance300WHEREid2;UPDATEaccountSETbalance900WHEREid1;-- 相互等待对方释放锁 → 死锁 总结┌─────────────────────────────────────┐ │ 事务核心特性 │ ├─────────────────────────────────────┤ │ ┌──────┐ ┌──────────┐ ┌──────┐ │ │ │原子性│ │ 一致性 │ │隔离性│ │ │ └──┬───┘ └────┬─────┘ └──┬───┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────┐ │ │ │ 持久性 │ │ │ └─────────────────────────────┘ │ ├─────────────────────────────────────┤ │ 隔离级别演进 │ │ 读未提交 → 读已提交 → 可重复读 → 串行化 │ │ (高性能) (高安全) │ └─────────────────────────────────────┘一句话总结事务就是让数据库操作要么全成功要么全失败ACID四大特性保证数据可靠四种隔离级别在安全和性能间提供选择。记忆口诀事务的四大特性原子性Atomicity事务中的所有操作要么全部完成要么全部不执行一致性Consistency事务执行前后数据必须保持合法状态隔离性Isolation并发事务之间互不干扰持久性Durability事务一旦提交数据变更永久有效隔离级别说明读未提交Read Uncommitted最低级别可能读取到未提交数据读已提交Read Committed只能读取已提交的数据可重复读Repeatable Read确保事务内多次读取数据一致串行化Serializable最高级别事务完全串行执行