怀化市住房与城乡建设厅网站自己怎么建设手机网站首页
怀化市住房与城乡建设厅网站,自己怎么建设手机网站首页,网络推广最新技巧,vs2008不能新建网站MySQL 事务#xff1a;原理、操作与隔离级别深度解析1. 事务概述2. 事务的提交与回滚操作3. 事务的隔离级别4. 事务隔离级别的配置与验证1. 事务概述
事务是处理复杂数据操作的核心机制#xff0c;尤其适用于操作量大、逻辑关联性强的场景。例如在企业级人员管理系统中…MySQL 事务原理、操作与隔离级别深度解析1. 事务概述2. 事务的提交与回滚操作3. 事务的隔离级别4. 事务隔离级别的配置与验证1. 事务概述事务是处理复杂数据操作的核心机制尤其适用于操作量大、逻辑关联性强的场景。例如在企业级人员管理系统中删除一名员工的操作并非仅删除其基础信息即可还需同步清理该员工关联的邮箱记录、发布的文章、参与的项目等数据。这些相互关联的数据库操作语句必须作为一个整体执行要么全部完成要么全部回退而事务正是保障这一执行逻辑的关键。PS仅 InnoDB 存储引擎的数据库或数据表支持事务MyISAM 等其他引擎则无此特性事务的核心价值体现在四大特性ACID上原子性Atomicity事务是不可分割的最小执行单元其内部所有操作要么全部成功执行并持久化要么在任意环节出错时整个事务回滚至执行前的状态如同从未执行过一致性Consistency事务执行前后数据库的完整性约束如主键唯一、外键关联、字段校验规则等始终保持有效。例如电商订单创建时订单金额需等于商品总价 运费事务执行后该等式必须成立且库存扣减与订单数量需匹配确保数据逻辑无矛盾隔离性Isolation数据库允许多个事务并发执行隔离性可防止事务间的相互干扰避免因交叉执行导致的数据不一致。不同隔离级别下事务间的隔离程度不同直接影响并发操作的安全性与性能持久性Durability事务一旦提交对数据的修改将永久保存至数据库即便后续发生服务器宕机、系统崩溃等故障已提交的数据也不会丢失2. 事务的提交与回滚操作MySQL 默认开启自动提交每执行一条INSERT、UPDATE、DELETE语句系统会自动隐式提交事务这意味着单条 DML 语句本身就是一个独立事务。但在复杂业务场景中我们需要手动控制事务的边界此时需显式开启事务关闭自动提交。1、开启事务使用BEGIN或START TRANSACTION语句显式开启事务此时后续的 DML 语句将进入同一事务上下文直至执行COMMIT或ROLLBACK才结束事务mysqlBEGIN;-- 等价于 START TRANSACTION开启事务Query OK,0rowsaffected(0.00sec)2、提交事务COMMIT或COMMIT WORK用于提交事务将事务内所有 DML 操作的结果永久写入数据库同时恢复自动提交模式。mysqlCOMMIT;-- 提交事务所有修改生效Query OK,0rowsaffected(0.01sec)3、回滚事务ROLLBACK用于撤销当前事务内未提交的所有修改将数据还原至事务开启前的状态。回滚仅对未提交的事务有效若事务已提交无法通过ROLLBACK撤销。一个完整的事务回滚案例-- 开启事务关闭自动提交mysqlSTARTTRANSACTION;Query OK,0rowsaffected(0.03sec)-- 执行多条插入操作mysqlINSERTINTOdeptVALUES(60,DAHE,ZHIQUAN);Query OK,1rowaffected(0.00sec)mysqlINSERTINTOdeptVALUES(70,DAHE,ZHIQUAN);Query OK,1rowaffected(0.00sec)mysqlINSERTINTOdeptVALUES(80,DAHE,ZHIQUAN);Query OK,1rowaffected(0.00sec)-- 查看事务内的临时数据此时数据未提交仅当前会话可见mysqlSELECT*FROMdept;------------------------------|DEPTNO|DNAME|LOC|------------------------------|10|ACCOUNTING|NEW YORK||20|RESEARCH|DALLAS||30|SALES|CHICAGO||40|OPERATIONS|BOSTON||60|DAHE|ZHIQUAN||70|DAHE|ZHIQUAN||80|DAHE|ZHIQUAN|------------------------------7rowsinset(0.00sec)-- 回滚事务撤销所有未提交的插入操作mysqlROLLBACK;Query OK,0rowsaffected(0.05sec)-- 再次查询数据还原至事务开启前的状态mysqlSELECT*FROMdept;------------------------------|DEPTNO|DNAME|LOC|------------------------------|10|ACCOUNTING|NEW YORK||20|RESEARCH|DALLAS||30|SALES|CHICAGO||40|OPERATIONS|BOSTON|------------------------------4rowsinset(0.00sec)3. 事务的隔离级别MySQL 提供四个从低到高的隔离级别不同级别对应不同的并发问题解决能力同时也影响数据库的并发性能级别越高并发性能越低在讲解具体级别前需先明确三个典型的并发数据问题脏读读取到其他事务未提交的临时数据该数据可能被回滚最终无效。不可重复读同一事务内多次读取同一数据结果不一致因其他事务修改并提交了该数据。幻读同一事务内多次执行相同的查询如全表扫描结果集行数不一致因其他事务插入 / 删除并提交了数据。1、读未提交Read Uncommitted—— 最低级别规则事务 A 可读取事务 B 未提交的任何修改数据。解决问题无仅保证事务原子性。存在问题脏读、不可重复读、幻读均会发生。实战案例财务人员给员工发工资误将月薪 3.6 万改为 3.9 万数据已写入数据库但事务未提交。此时员工查询工资看到 3.9 万的金额脏数据误以为涨薪随后财务发现错误回滚事务将金额改回 3.6 万并提交员工最终实际工资仍为 3.6 万此前读取的 3.9 万即为脏读。适用场景仅适用于对数据一致性要求极低、追求极致并发性能的场景2、读已提交Read Committed规则事务 A 仅能读取事务 B 已提交的修改数据未提交的数据不可见。解决问题解决脏读。存在问题不可重复读、幻读仍会发生。实战案例程序员持信用卡消费扣款系统开启事务后第一次查询卡内余额为 3.6 万此时程序员妻子开启另一事务将卡内全部金额转出并提交。扣款系统准备扣款时再次查询余额发现金额为 0因妻子的事务已提交。同一事务内两次查询同一余额结果不同即不可重复读。特点这是 Oracle、SQL Server 等数据库的默认隔离级别兼顾一定的一致性与并发性能适用于大多数普通业务场景3、可重复读Repeatable Read—— MySQL 默认级别规则事务开启后多次读取同一数据的结果始终一致即便其他事务修改并提交了该数据。解决问题解决脏读、不可重复读。存在问题幻读仍可能发生注MySQL InnoDB 引擎通过间隙锁机制在可重复读级别下已基本解决幻读问题这是 MySQL 的优化特性。实战案例程序员消费时扣款系统开启事务后查询卡内余额为 3.6 万此时妻子尝试转出金额但因可重复读级别限制修改操作需等待扣款事务结束扣款系统第二次查询余额仍为 3.6 万确保扣款操作正常执行避免不可重复读。幻读案例补充程序员妻子查询其当日消费记录事务开启第一次查询显示消费 2000 元随后程序员新增一笔 1 万元的消费并提交事务妻子再次执行相同查询结果显示消费 1.2 万元即幻读特点兼顾一致性与并发性能是 MySQL 的默认级别满足绝大多数业务的并发需求。4、串行化Serializable—— 最高级别规则所有事务串行化执行即事务排队依次执行完全禁止并发操作。解决问题解决脏读、不可重复读、幻读所有并发问题。存在问题并发性能极低数据库吞吐量大幅下降。实战案例多用户同时操作同一订单表时所有事务需排队执行事务 A 执行插入操作时事务 B 的查询、修改操作需等待事务 A 提交事务 B 执行时事务 C 需等待以此类推。适用场景仅适用于对数据一致性要求极高、几乎无并发操作的场景如金融核心交易的对账环节。4. 事务隔离级别的配置与验证1、查看当前隔离级别MySQL 提供系统变量transaction_isolation5.7 及以上版本旧版本为tx_isolation用于查看隔离级别支持会话级和全局级查询-- 查看当前会话的隔离级别mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|REPEATABLE-READ|-------------------------1rowinset(0.00sec)-- 查看全局隔离级别mysqlSELECTglobal.transaction_isolation;--------------------------------|global.transaction_isolation|--------------------------------|REPEATABLE-READ|--------------------------------1rowinset(0.00sec)2、修改隔离级别MySQL 支持会话级和全局级修改隔离级别修改规则如下会话级修改仅对当前数据库连接生效关闭连接后失效不影响其他会话。全局级修改对所有新创建的会话生效已存在的会话不受影响重启数据库后恢复为配置文件默认值需修改 my.cnf/my.ini 永久生效。-- 将当前会话隔离级别设置为读已提交mysqlSETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;Query OK,0rowsaffected(0.00sec)-- 验证修改结果mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|READ-COMMITTED|-------------------------1rowinset(0.00sec)-- 将全局隔离级别设置为读已提交mysqlSETGLOBALTRANSACTIONISOLATIONLEVELREADCOMMITTED;Query OK,0rowsaffected(0.00sec)-- 当前会话仍保留原级别可重复读mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|REPEATABLE-READ|-------------------------1rowinset(0.00sec)-- 新建一个数据库会话验证全局级别生效mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|READ-COMMITTED|-------------------------1rowinset(0.00sec)3、永久修改隔离级别若需重启数据库后仍保持隔离级别需修改 MySQL 配置文件my.cnf 或 my.ini# 新增以下配置设置全局默认隔离级别为可重复读transaction-isolationREPEATABLE-READ