版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CHAPTER6触发器和事件MySQL数据库高级特性完整教程6核心章节9实战案例80知识节点DataFlowAutomation打造智能化数据管理体系目录完整知识体系架构01触发器概述与核心概念深入理解触发器的本质、五大优势、四大挑战、分类体系,掌握NEW与OLD临时表的工作机制02触发器的创建与实战案例掌握CREATETRIGGER语法,通过医务人员信息触发器、删除备份触发器、级联更新触发器3个案例03触发器的管理与维护学习SHOWTRIGGERS查看方法,掌握information_schema.triggers表结构,了解删除与维护最佳实践04事件概述与调度机制理解事件的定时任务机制,掌握事件调度器的启用方法,学习15种时间间隔表达式05事件的创建与实战案例掌握CREATEEVENT语法,通过立即创建表、周期性插入时间戳、每周自动备份3个案例06事件的管理与维护学习SHOWEVENTS查看方法,掌握ALTEREVENT修改、重命名、禁用、删除操作07本章小结与知识梳理知识图谱梳理、学习成果检验、最佳实践总结、性能优化技巧、典型应用场景内容深度导览学习目标与预期成果9个实战案例20+关键语法80页深度内容01理解触发器和事件的核心概念掌握两种数据库自动化机制的定义、特性、优缺点、适用场景,建立完整的知识框架02掌握CREATE语法和实战应用通过9个完整案例学习触发器和事件的创建方法,包括语法结构、参数配置、验证测试全流程03学会日常管理与维护技能掌握查看、修改、删除、监控等管理操作,建立完善的维护体系和问题排查能力04提升性能优化和最佳实践能力学习设计原则、性能优化策略、典型应用场景、调试技巧、安全考虑等高级主题触发器:数据库的自动化守护者核心定义触发器(Trigger)是一种基于特定事件、特定时机自动触发的机制。它关联到某张表格的数据操作行为(增删改操作),当该表中预定义的动作事件发生时,触发器将按照预定义的时机触发,完成触发器体中的逻辑操作。触发器无需人工干预,能够自动执行复杂的完整性约束、数据验证、自动计算字段更新、日志记录等业务逻辑,是数据库自动化管理的关键工具。事件驱动基于INSERT、UPDATE、DELETE等数据操作事件自动激活时机精确支持BEFORE和AFTER两种触发时机,精确控制执行顺序行级触发FOREACHROW确保每行记录受影响时都会触发执行透明自动化对应用程序透明,无需修改应用代码即可实现业务逻辑核心价值数据完整性保障自动验证业务规则,确保数据质量开发效率提升减少重复代码编写,逻辑集中管理审计追踪支持自动记录数据变更,便于问题追溯典型应用场景外键约束检查和业务规则验证自动计算字段和级联更新数据变更日志记录和审计复杂业务逻辑的自动化处理关键洞察:触发器是数据库层面的"响应式编程",它将业务逻辑下沉到数据层,实现真正的自动化数据管理,但需要注意性能影响和调试难度。触发器的五大优势01自动化操作触发器通过事件自动触发执行复杂的逻辑,无需在每个插入、更新或删除操作中手动编写代码。实际应用:在订单表中创建触发器,自动更新库存表的库存数量,无需在应用程序中编写更新逻辑,减少代码重复,提高开发效率。02数据完整性在用户插入数据或更新前验证数据,确保数据完整性,例如检查外键约束、验证业务规则、限制数值范围等。实际应用:在员工表创建BEFOREINSERT触发器,验证入职日期不能早于出生日期,确保数据的逻辑一致性。03维护数据一致性通过触发器自动更新相关联表格的数据,保持数据的一致性。场景:当订单状态变更为"已完成"时,自动更新用户表的累计消费金额。04日志记录可以在数据修改时自动记录日志,便于审计和恢复。场景:在敏感数据表创建触发器,自动记录所有数据变更到审计日志表。05复杂业务逻辑适合处理一些复杂的业务逻辑,例如根据多个条件更新多个表。场景:当商品退货时,自动更新库存、退款记录、销售统计等多个表。自动化完整性一致性日志记录复杂逻辑触发器的四大挑战与应对策略性能问题在高并发的情况下,创建过多的触发器的执行可能会增加数据库操作的负担,会引起性能瓶颈。影响:每次数据操作都需要执行触发器逻辑,增加响应时间优化:精简触发器逻辑、避免复杂查询、合理使用索引、控制触发器数量调试困难触发器的错误难以调试,因为它们通常是在数据库内部自动执行的,不像应用代码那样容易跟踪和测试。影响:问题定位困难,增加开发维护成本应对:使用日志表记录执行过程、分步骤测试、充分验证边界条件隐藏的依赖关系触发器可能导致应用程序与其他数据库对象的隐藏依赖关系,这可能会使应用程序难以理解和修改。影响:系统复杂度增加,维护难度加大管理:建立完善的文档体系、使用统一的命名规范、定期审查触发器列表可移植性问题触发器是特定于数据库的,不同的数据库系统在触发器的实现和支持上可能有所不同,这可能影响触发器的可移植性。影响:数据库迁移成本高,跨平台兼容性差规避:遵循SQL标准、封装数据库特定逻辑、评估迁移需求关键建议:在使用触发器前,应当进行充分的数据库性能考量和架构设计,确保不会对系统性能产生负面影响的前提下,适当运用触发器能够提高数据库管理效率。触发器的分类体系按事件类型分类INSERT触发器在数据插入操作时触发,包括INSERT、LOADDATA、REPLACE命令应用场景:自动生成主键、验证必填字段、记录创建时间UPDATE触发器在数据更新操作时触发,当表执行UPDATE命令时激活应用场景:级联更新关联表、记录修改历史、验证更新规则DELETE触发器在数据删除操作时触发,包括DELETE和REPLACE命令应用场景:备份删除数据、级联删除关联记录、防止误删除按触发时机分类BEFORE触发器在数据操作执行之前触发,可以修改即将写入的数据或阻止操作执行•数据验证和预处理•设置默认值和自动填充AFTER触发器在数据操作执行之后触发,主要用于级联操作和日志记录•级联更新其他表•记录审计日志和发送通知组合矩阵:两种分类维度可以组合成6种触发器类型:BEFOREINSERT、AFTERINSERT、BEFOREUPDATE、AFTERUPDATE、BEFOREDELETE、AFTERDELETE。每种类型适用于不同的业务场景。NEW与OLD临时表:数据操作的桥梁NEW临时表NEW临时表用于临时存储表格在INSERT和UPDATE操作中即将被插入或更新的新数据。INSERT操作NEW表包含要插入的新记录的所有字段值UPDATE操作NEW表包含更新后的新值,可用于验证和修改访问语法NEW.columnNameOLD临时表OLD临时表用于临时存储表格在UPDATE和DELETE操作中被删除或更新的旧数据的状态。UPDATE操作OLD表包含更新前的原始值,可用于对比和备份DELETE操作OLD表包含被删除的记录的所有字段值,可用于备份访问语法OLD.columnNameINSERT操作可用:NEW不可用:OLDUPDATE操作可用:NEW可用:OLDDELETE操作不可用:NEW可用:OLD重要提醒:NEW和OLD临时表只有在触发器被触发时的触发器体中才能访问,新数据或旧数据的状态使用NEW.columnName、OLD.columnName前缀形式访问。这些临时表在触发器执行完毕后自动释放。触发器执行流程深度解析BEFORE触发器执行流程1事件发生执行INSERT/UPDATE/DELETE操作2BEFORE触发器激活在数据变更前执行触发器逻辑3数据预处理可修改NEW表中的数据或验证规则4原始操作执行执行实际的数据变更操作5结果返回返回操作结果给客户端关键特性:BEFORE触发器可以修改NEW表数据、可以抛出错误阻止操作、可以访问OLD表进行对比AFTER触发器执行流程1事件发生执行INSERT/UPDATE/DELETE操作2原始操作执行首先执行实际的数据变更操作3AFTER触发器激活在数据变更后执行触发器逻辑4级联操作执行执行关联表的更新、日志记录等5结果返回返回操作结果给客户端关键特性:AFTER触发器不能修改NEW表数据、可以访问OLD表进行备份、可以执行跨表操作触发器生命周期与作用域触发器生命周期01创建阶段使用CREATETRIGGER语句定义触发器,绑定到指定表的特定事件关键动作:语法解析、权限验证、依赖关系检查、元数据存储02激活阶段当关联表发生预定义事件时,触发器被激活并准备执行关键动作:事件监听、触发条件判断、执行计划生成03执行阶段按照BEFORE/AFTER时机执行触发器体中的SQL逻辑关键动作:NEW/OLD临时表创建、SQL语句执行、结果处理04销毁阶段触发器执行完毕后,临时表被销毁,资源被释放关键动作:临时表清理、内存释放、锁资源释放作用域与绑定关系表级绑定触发器与特定表绑定,只能响应该表的数据操作事件事件级触发只能响应预定义的INSERT/UPDATE/DELETE事件类型行级作用域FOREACHROW确保每行记录都有独立的临时表作用域临时表生命周期NEW和OLD临时表仅在触发器执行期间存在,执行后自动销毁自动执行特性透明性:对应用程序完全透明,无需修改应用代码强制性:无法绕过触发器,确保业务规则强制执行原子性:触发器与原始操作在同一个事务中执行触发器vs存储过程:何时选择触发器调用方式触发器自动触发,无需显式调用存储过程需要显式CALL调用执行时机触发器BEFORE/AFTER数据操作存储过程根据需要随时执行参数传递触发器通过NEW/OLD临时表隐式传递存储过程支持IN/OUT/INOUT参数适用场景触发器数据验证、级联更新、审计日志存储过程复杂业务逻辑、批处理、报表生成性能特点触发器每次数据操作都执行,开销固定存储过程按需调用,可批量处理数据管理复杂度触发器分散在各表,调试困难存储过程集中管理,易于调试优化选型建议:选择触发器实现强制性、透明、与数据操作紧密耦合的逻辑;选择存储过程实现复杂、可选、独立的业务逻辑。两者可以结合使用,发挥各自优势。CREATETRIGGER语法完全解析完整语法结构CREATETRIGGERtri_nametri_timetri_eventONtable_nameFOREACHROWtrigger_statementtri_name触发器名称,建议格式:tri_表名_操作_时机tri_time触发时机:BEFORE或AFTERtri_event触发事件:INSERT、UPDATE、DELETEtable_name关联表的名称FOREACHROW行级触发,每行记录都执行trigger_statement触发器执行体,包含SQL逻辑命名规范建议推荐格式tri_表名_操作_时机示例•tri_users_insert_after•tri_orders_update_before•tri_logs_delete_after事件类型说明INSERT:INSERT、LOADDATA、REPLACEUPDATE:UPDATE命令DELETE:DELETE、REPLACE重要提示:由于系统对执行逻辑的限制,在同一张表不能定义对同一事件(INSERT、UPDATE或DELETE)多个触发器。触发器不允许返回结果集,触发器体中不能包含对触发器所在表本身的UPDATE或DELETE操作。触发器创建的关键注意事项01单一触发器限制在同一张表不能定义对同一事件(INSERT、UPDATE或DELETE)多个触发器。解决方案:将多个逻辑合并到一个触发器中,使用BEGIN...END块包含多个SQL语句。02禁止返回结果集触发器不允许返回结果集,触发器中的SELECT语句不能有输出。说明:如果需要调试,可以使用SET命令设置用户变量,在外部查询这些变量。03自操作限制触发器体中不能包含对触发器所在表本身的UPDATE或DELETE操作,但可以对其他表执行这些操作。说明:这是为了避免递归触发和死锁问题。如果需要更新同表数据,可以使用BEFORE触发器修改NEW表。04命名规范触发器名称在同一个数据库中必须唯一,建议使用有意义的命名格式。推荐格式:tri_表名_操作_时机,例如:tri_doctors_insert_after05delimiter命令的使用在命令行中创建包含多条SQL语句的触发器时,需要使用delimiter命令临时更改语句分隔符。原因:触发器体中的分号会被误认为是语句结束,导致解析错误。delimiter//createtrigger...begin...逻辑...end//delimiter;案例1:医务人员信息插入触发器案例描述定义一个触发器,当医务人员信息表(doctors)有新记录插入时,在控制台上显示新增医务人员的姓名。这是一个典型的数据验证和日志记录场景。触发器类型AFTERINSERT触发器-在数据插入后执行核心逻辑使用NEW临时表获取新插入记录的doctorName字段值,赋值给用户变量@nameNew应用场景数据插入确认、自动记录日志、实时数据监控完整代码delimiter//createtriggertri_insertafterinsertondoctorsforeachrowbeginset@nameNew=new.doctorName;end//delimiter;涉及的表主表:doctors(医务人员表)•DoctorID(主键)•DoctorName•Gender•Specialization•WorkingYears学习目标:通过这个简单案例,理解CREATETRIGGER的基本语法、NEW临时表的使用方法、delimiter命令的作用,以及触发器的创建和验证流程。案例1:代码逐行解析delimiter//createtriggertri_insertafterinsertondoctorsforeachrowbeginset@nameNew=new.doctorName;end//delimiter;第1行:delimiter命令临时将语句分隔符从分号(;)改为双斜杠(//),避免触发器体中的分号被误解析为语句结束第2-4行:CREATETRIGGER语句定义触发器名称(tri_insert)、触发时机(AFTER)、触发事件(INSERT)、关联表(doctors)、行级触发机制第5-7行:触发器执行体使用BEGIN...END块包裹执行逻辑,通过NEW.doctorName访问新插入的医生姓名,赋值给用户变量@nameNew第8行:恢复分隔符将语句分隔符恢复为默认的分号,不影响后续SQL命令的执行执行流程图1INSERT事件发生向doctors表插入新记录2数据插入执行新记录写入doctors表3AFTER触发器激活检测到AFTERINSERT事件4NEW临时表创建包含新插入的记录数据5触发器逻辑执行提取NEW.doctorName赋值给@nameNew6资源清理NEW表销毁,操作完成案例1:验证过程与结果展示验证步骤1插入测试数据insertintodoctorsvalues('d006','周晴','F','眼科',5);2查询用户变量select@nameNewas新增医务人员;3确认触发器执行检查@nameNew变量是否包含新插入的医生姓名执行结果MySQL命令行输出mysql>insertintodoctors->values('d006','周晴','F',->'眼科',5);QueryOK,1rowaffectedmysql>select@nameNew->as新增医务人员;++|新增医务人员|++|周晴|++结果分析INSERT语句成功执行触发器自动激活并执行@nameNew变量正确获取值"周晴"触发器逻辑验证成功学习要点:这个案例展示了触发器的自动执行特性。只要向doctors表插入数据,触发器就会自动执行,无需手动调用。通过用户变量可以实现触发器与外部环境的简单数据传递。案例2:删除记录备份触发器案例描述定义一个触发器,当医务人员信息被删除时,将删除记录自动添加到doctors_del备份表中。这是一个典型的数据备份和审计追踪场景。触发器类型AFTERDELETE触发器-在数据删除后执行备份操作核心逻辑使用OLD临时表获取被删除记录的所有字段值,通过INSERTINTO语句将这些值插入到doctors_del备份表中应用场景防止数据误删除、审计追踪、数据恢复、合规性要求完整代码delimiter//createtriggertri_addDelInfoafterdeleteondoctorsforeachrowbegininsertintodoctors_delvalues(old.DoctorID,old.DoctorName,old.Gender,old.Specialization,old.WorkingYears);end//delimiter;涉及的表主表:doctors(医务人员表)备份表:doctors_del(删除记录备份表)结构和doctors表完全相同学习目标:理解DELETE触发器的创建方法、OLD临时表的使用技巧、跨表插入操作、数据备份的实现原理,以及createtable...like...语句的用法。案例2:关键实现细节OLD临时表的应用在DELETE触发器中,OLD临时表是访问被删除记录的唯一途径。作用:保存被删除记录的完整数据快照访问方式:使用OLD.columnName获取字段值生命周期:仅在触发器执行期间存在备份表创建技巧使用CREATETABLE...LIKE...语法快速创建结构完全相同的备份表。createtabledoctors_dellikedoctors;优势:自动复制原表的所有列定义、数据类型、约束,无需手动定义INSERT语法详解insertintodoctors_delvalues(old.DoctorID,old.DoctorName,...);VALUES子句中使用OLD.columnName获取被删除记录的字段值跨表操作能力触发器可以操作其他表✓INSERT到其他表✓UPDATE其他表✓DELETEfrom其他表✗不能操作所在表数据备份的重要性•防止误操作导致数据永久丢失•满足审计和合规性要求•支持数据恢复和回滚•追踪数据变更历史最佳实践:备份表建议添加额外字段,如deleted_time记录删除时间、deleted_by记录删除操作者,以便更好地追踪数据变更。案例2:验证与数据一致性检查验证步骤1创建备份表createtabledoctors_dellikedoctors;2删除测试数据deletefromdoctorswhereDoctorID='d001';3查询备份表select*fromdoctors_del;4数据一致性验证对比删除前和备份后的数据是否一致执行结果doctors_del表查询结果mysql>select*fromdoctors_del;+++|DoctorID|DoctorName|+++|d001|李明|+++数据一致性对比DoctorID:d001✓DoctorName:李明✓其他字段完整备份✓验证结论被删除的记录已成功备份到doctors_del表,数据完整性得到保障,触发器工作正常关键洞察:DELETE触发器结合OLD临时表,可以实现自动化的数据备份机制。这种方案不仅保证了数据安全,还满足了审计和合规性要求,是企业级数据库管理的最佳实践。案例3:患者ID级联更新触发器案例描述定义一个触发器,当患者信息表(patients)中的患者ID(PatientID)更新时,自动同步更新预约表(Appointments)中对应患者的ID。这是一个典型的维护参照完整性场景。业务背景患者ID变更时,需要同步更新所有关联表中的外键引用,维护数据一致性触发器类型AFTERUPDATE触发器-在患者ID更新后同步更新关联表核心逻辑使用NEW.PatientID获取新ID,使用OLD.PatientID定位需要更新的记录,通过UPDATE...SET...WHERE语句批量更新Appointments表完整代码delimiter//createtriggertri_updateInfoafterupdateonpatientsforeachrowbeginupdateAppointmentssetPatientID=new.PatientIDwherePatientID=old.PatientID;end//delimiter;涉及的表主表:patients(患者表)关联表:Appointments(预约表)通过PatientID建立外键关系学习目标:理解UPDATE触发器的创建方法、NEW和OLD临时表的联合使用、跨表更新操作、参照完整性的维护机制,以及级联更新的实现原理。案例3:级联更新核心逻辑NEW与OLD的联合使用在UPDATE触发器中,NEW和OLD临时表分别代表更新前后的数据状态。NEW临时表包含更新后的新值,用于获取新的PatientIDOLD临时表包含更新前的旧值,用于定位需要更新的记录UPDATE语句分析updateAppointmentssetPatientID=new.PatientIDwherePatientID=old.PatientID;SET子句:使用NEW.PatientID设置新值WHERE子句:使用OLD.PatientID定位记录参照完整性维护确保外键引用的有效性•父表更新时自动更新子表•避免孤立记录的产生•维护业务逻辑一致性sql_safe_updates设置setsql_safe_updates=0;关闭安全更新限制,允许UPDATE语句在没有主键条件的表中执行批量更新机制WHERE子句匹配多条记录•一次性更新所有关联记录•避免循环处理开销•保证原子性操作核心要点:NEW和OLD临时表的联合使用是UPDATE触发器的关键。通过NEW获取新值进行设置,通过OLD获取旧值进行条件匹配,实现精准的级联更新操作。这种机制可以有效维护数据库的参照完整性。案例3:验证与关联数据检查验证步骤1关闭安全更新限制setsql_safe_updates=0;2更新患者IDupdatepatientssetPatientID='p101'wherePatientID='p001';3查询Appointments表select*fromAppointments;4验证数据一致性确认预约表中的PatientID已同步更新执行结果更新前数据|AppointmentID|PatientID||1|p001||2|p003||3|p002||4|p004|更新后数据|AppointmentID|PatientID||1|p101|✓|2|p003||3|p002||4|p004|验证结论患者p001成功更新为p101预约表同步更新,无孤立记录其他患者记录保持不变参照完整性得到维护关键洞察:UPDATE触发器结合NEW和OLD临时表,可以实现精确的级联更新操作。这种机制是维护数据库参照完整性的重要手段,特别是在外键约束不够灵活的场景下。通过触发器自动化处理,可以避免手动更新遗漏,保证数据一致性。三个案例的共性模式与差异分析案例1:插入触发器类型:AFTERINSERT临时表:NEW核心:数据验证与日志提取NEW.doctorName赋值给变量案例2:删除触发器类型:AFTERDELETE临时表:OLD核心:数据备份与审计使用OLD备份被删除记录案例3:更新触发器类型:AFTERUPDATE临时表:NEW+OLD核心:级联更新与完整性NEW设置新值,OLD定位记录共性模式触发时机一致三个案例都采用AFTER触发时机,在数据操作完成后执行逻辑行级触发机制都使用FOREACHROW,确保每行记录都执行触发器逻辑数据操作核心都围绕数据的增删改操作,实现自动化业务逻辑临时表访问都依赖NEW或OLD临时表访问操作前后的数据状态差异对比事件类型差异•INSERT:关注NEW数据•DELETE:关注OLD数据•UPDATE:同时关注NEW和OLD应用场景差异•数据验证与监控•数据备份与审计•级联更新与完整性复杂度差异•案例1:简单,单变量赋值•案例2:中等,单表插入•案例3:复杂,多表级联设计模式总结:触发器设计遵循"事件识别→时机选择→逻辑编写→验证测试"的标准流程。根据业务需求选择合适的事件类型和触发时机,使用NEW/OLD临时表访问数据,实现自动化业务逻辑。触发器设计模式总结通用设计模式1事件识别明确需要响应的数据操作类型:INSERT、UPDATE、DELETE2时机选择确定触发时机:BEFORE(验证预处理)或AFTER(级联日志)3逻辑编写使用NEW/OLD临时表访问数据,编写业务逻辑SQL语句4验证测试执行数据操作,验证触发器是否正确执行,检查数据一致性最佳实践命名规范使用统一格式:tri_表名_操作_时机,便于识别和管理注释习惯为触发器添加详细注释,说明用途、作者、创建时间错误处理在BEFORE触发器中使用SIGNAL语句抛出有意义的错误信息性能优化避免复杂查询,合理使用索引,控制触发器数量和嵌套深度测试策略测试边界条件、异常场景、并发情况,确保触发器稳定可靠重要提醒:触发器虽然强大,但不应滥用。对于复杂业务逻辑,优先考虑在应用层实现;对于强制性的数据约束和审计需求,适合使用触发器。保持触发器逻辑简单清晰,避免过度依赖。查看触发器的多种方法SHOWTRIGGERSSHOWTRIGGERS;查看当前数据库中所有的触发器列表适用场景:快速查看所有触发器的基本信息information_schema查询SELECT*FROMinformation_schema.triggers;查询系统表获取详细的触发器元数据适用场景:需要详细的触发器定义和属性信息条件查询SELECTTRIGGER_NAME,EVENT_MANIPULATIONFROMinformation_schema.triggersWHERETRIGGER_NAME='tri_updateInfo';通过WHERE条件查询特定触发器适用场景:精确定位和查看特定触发器的信息SHOWTRIGGERS输出字段Trigger触发器名称Event触发事件Table关联表名Timing触发时机Statement触发器执行体Created创建时间information_schema优势信息更全面包含触发器的详细定义、权限、字符集等元数据查询更灵活支持复杂的WHERE条件和JOIN操作跨数据库查询可以查询所有数据库的触发器信息权限控制需要有相应权限才能访问information_schema表information_schema.triggers表结构解析TRIGGER_SCHEMA触发器所在的数据库名称TRIGGER_NAME触发器名称EVENT_MANIPULATION触发事件:INSERT、UPDATE、DELETEEVENT_OBJECT_SCHEMA触发器关联表的数据库名称EVENT_OBJECT_TABLE触发器关联的表名ACTION_TIMING触发时机:BEFORE、AFTERACTION_STATEMENT触发器执行体的SQL语句CREATED触发器创建时间SQL_MODE创建触发器时的SQL模式DEFINER创建触发器的用户CHARACTER_SET_CLIENT客户端字符集COLLATION_CONNECTION连接排序规则查询示例:通过查询information_schema.triggers表,可以获取触发器的完整元数据,包括创建者、创建时间、字符集等详细信息,便于触发器的管理和审计。触发器状态监控与诊断监控指标基本信息监控•触发器总数统计•按表分组的触发器数量•按事件类型分组的统计•触发器创建时间分布性能监控指标•触发器平均执行时长•触发器执行频率统计•慢查询触发器识别•触发器对主操作的影响依赖关系监控•触发器与表的依赖关系•跨表操作的影响范围•触发器调用链分析•循环触发风险识别诊断方法执行计划分析使用EXPLAIN分析触发器中SQL语句的执行计划识别全表扫描、索引使用情况、JOIN效率慢查询日志开启慢查询日志,识别执行时间过长的触发器分析慢查询的原因,优化SQL逻辑和索引性能计数器监控触发器相关的性能计数器包括触发次数、平均执行时间、错误率等调试日志在触发器中添加调试信息记录记录触发时机、数据状态、执行结果性能优化建议:定期审查触发器的执行情况,识别性能瓶颈。对于高频操作的表,谨慎使用触发器;对于复杂逻辑,考虑在应用层实现或异步处理。保持触发器逻辑简单高效,避免长时间运行。删除触发器的正确姿势DROPTRIGGER语法DROPTRIGGER[IFEXISTS]tri_name;IFEXISTS选项可选参数,防止在触发器不存在时抛出错误,返回警告信息tri_name要删除的触发器名称,必须是当前数据库中存在的触发器权限要求需要具有TRIGGER权限或SUPER权限才能删除触发器删除示例示例1:删除存在的触发器DROPTRIGGERtri_insert;QueryOK,0rowsaffected成功删除触发器,返回确认信息示例2:删除不存在的触发器DROPTRIGGERtri_not_exist;ERROR1360(HY000):Triggerdoesnotexist触发器不存在时抛出错误示例3:使用IFEXISTSDROPTRIGGERIFEXISTStri_not_exist;QueryOK,0rowsaffected,1warning(0.00sec)触发器不存在时返回警告而非错误删除前备份使用SHOWCREATETRIGGER获取定义并保存依赖关系检查确认没有其他对象依赖该触发器不可逆操作删除后触发器定义无法恢复,需谨慎操作触发器维护的最佳实践定期审查触发器列表每月或每季度审查一次触发器列表,识别不再需要的触发器•检查是否有重复功能的触发器•识别长期未使用的废弃触发器•评估触发器的业务价值文档化触发器逻辑为每个触发器创建详细的文档,包括用途、逻辑、依赖关系•触发器业务用途说明•SQL逻辑详细注释•依赖的表和字段清单建立命名规范制定并执行统一的触发器命名规范•格式:tri_表名_操作_时机•使用有意义的名称•避免使用缩写和拼音监控性能影响持续监控触发器对数据库性能的影响•监控触发器执行时长•追踪慢查询和死锁•评估对主操作的影响版本控制管理将触发器定义纳入版本控制系统•使用Git/SVN管理触发器脚本•记录每次变更的原因和影响•建立回滚机制建立变更管理流程•变更前进行影响分析•测试环境充分验证•生产环境灰度发布触发器常见问题排查指南触发器未执行排查步骤:1.确认触发器是否存在:SHOWTRIGGERS2.检查事件类型是否匹配3.验证触发时机设置4.检查权限是否足够触发器执行报错排查步骤:1.查看错误信息和错误码2.检查SQL语法是否正确3.验证表和字段是否存在4.检查数据类型是否匹配性能下降排查步骤:1.分析触发器中的SQL语句2.检查是否缺少索引3.监控触发器执行时长4.评估触发器数量和复杂度死锁问题排查步骤:1.检查是否存在递归触发2.分析锁等待和锁竞争3.优化触发器执行顺序4.减少触发器中的复杂操作权限错误排查步骤:1.检查用户权限是否足够2.验证DEFINER设置3.检查表级权限4.确认SQLSECURITY设置通用排查原则:遇到问题时,首先查看错误信息,然后检查触发器定义和相关表结构,接着分析数据状态和权限设置,最后通过日志和监控工具定位根本原因。建立系统的问题排查文档,记录解决方案。事件:MySQL的定时任务执行器核心定义在数据库中,事件(Event)是一种定时任务执行机制,又称事件调度器。它基于时间触发,可精确到秒级别,可预订单次执行任务或周期性执行任务。时间精确性精确到秒级的时间控制,满足大多数定时任务需求执行灵活性支持单次执行和周期性执行两种模式任务多样性可执行DDL、DML、调用存储过程等多种操作自动化管理减少外部程序干预,提高数据管理效率事件的核心价值定时执行无人值守任务多样执行模式单次任务ATtimestamp在指定的时间点执行一次,适用于定时启动、延迟执行等场景周期性任务EVERYtimeInterval每隔一段时间执行一次,适用于定期备份、数据统计等场景对比说明:与操作系统定时任务(如crontab)相比,MySQL事件调度器具有数据库原生支持、无需外部依赖、时间精度更高、可直接操作数据库等优势。适合处理数据密集型定时任务。事件的应用场景与价值典型应用场景证券股票交易数据处理定时汇总交易数据、计算技术指标、生成K线图数据线上购票系统定时任务自动释放超时未支付的订单、更新票务库存、发送提醒通知数据汇总统计每日销售统计、月度报表生成、实时数据聚合定期数据维护清理过期数据、重建索引、更新统计信息、优化表结构数据同步跨库数据同步、ETL数据抽取、增量数据加载备份任务定期数据备份、导出数据文件、创建快照核心价值主张减少外部依赖无需借助操作系统定时任务或第三方调度工具,数据库内部即可完成定时任务提高管理效率通过数据库系统机制完成定期数据维护、数据同步等任务,降低运维复杂度保证数据一致性在数据库层面执行定时任务,避免跨系统数据传输带来的延迟和不一致风险时间精度高支持秒级精度的定时调度,满足对时间精度要求较高的业务场景易于维护管理使用标准的SQL语法创建和管理事件,便于版本控制和文档化选择建议:对于数据密集型的定时任务,优先考虑使用MySQL事件;对于需要跨系统协调的复杂任务,可以考虑操作系统定时任务配合数据库操作。事件特别适合处理数据归档、统计报表、数据清理等场景。事件调度器的启用与状态检查事件调度器管理机制默认状态事件调度器默认状态为关闭出于性能和安全考虑,MySQL默认不启用事件调度功能启用方法通过设置@@event_scheduler系统变量启用可设置为1、ON或TRUE来开启事件调度器持久化配置在f配置文件中添加配置event_scheduler=ON,确保MySQL重启后自动启用状态检查与启用步骤步骤1:查看当前状态SHOWVARIABLESLIKE'event_scheduler';步骤2:启用事件调度器SET@@GLOBAL.event_scheduler=1;步骤3:验证启用成功SHOWVARIABLESLIKE'event_scheduler';预期结果+++|Variable_name|Value|+++|event_scheduler|ON|+++重要提醒:使用SET命令启用事件调度器是临时性的,MySQL重启后会失效。如需永久启用,必须在f配置文件中设置event_scheduler=ON。生产环境建议配置持久化,确保事件调度器持续可用。事件调度器的工作原理核心组件事件调度器线程由数据库服务器负责管理,独立线程处理事件调度事件队列管理维护待执行事件的优先队列,按时间排序时间触发器基于时间戳的触发机制,精确到秒级执行线程池管理事件执行线程,支持并发事件处理执行流程1事件注册CREATEEVENT创建事件,加入事件队列2时间检查调度器定期检查事件队列3事件触发到达执行时间,激活事件4任务执行分配线程执行事件体中的SQL5结果处理处理执行结果,更新事件状态6循环调度周期性事件重新计算下次执行时间关键特性:事件调度器采用多线程架构,支持并发执行多个事件。调度器每秒检查一次事件队列,确保时间精度。事件执行失败不会影响调度器运行,下次仍会正常尝试执行。事件的时间精度与调度策略时间特性秒级精度事件调度可精确到秒级别满足绝大多数业务场景的时间精度要求时间间隔单位支持15种时间单位•year•quarter•month•week•day•hour•minute•second时间表达式支持NOW()、CURRENT_TIMESTAMP等函数可以使用INTERVAL进行时间计算时区处理使用系统时区或会话时区需要考虑夏令时变更的影响调度策略单次执行ATtimestamp在指定时间点执行一次,执行后自动删除或禁用周期性执行EVERYinterval[STARTStimestamp][ENDStimestamp]按指定间隔重复执行,可设置开始和结束时间时间窗口支持设置STARTS和ENDS时间精确定位事件的生效时间范围完成策略ONCOMPLETION[NOT]PRESERVE控制事件执行完毕后是否保留状态管理ENABLE|DISABLE可以启用或禁用事件,暂停调度最佳实践:合理设置事件的执行间隔,避免任务过于频繁导致系统负载过高。对于耗时较长的任务,建议错峰执行。使用STARTS和ENDS精确定位时间窗口,避免不必要的事件触发。事件vs触发器:两种不同的自动化机制触发器特点触发机制基于数据操作事件(INSERT/UPDATE/DELETE)执行时机BEFORE或AFTER数据操作响应速度实时响应,毫秒级延迟适用场景数据验证、级联更新、审计日志资源消耗与数据操作耦合,影响事务性能管理复杂度分散在各表,调试困难事件特点触发机制基于时间调度(秒级精度)执行时机按预定时间或时间间隔响应速度秒级精度,可能有延迟适用场景定时备份、数据统计、数据清理资源消耗独立执行,不影响实时操作管理复杂度集中管理,易于监控选择建议:触发器适合处理与数据操作紧密耦合的强制性业务逻辑,如数据验证和审计;事件适合处理独立的定时任务,如备份和统计。两者可以结合使用,发挥各自优势,构建完整的数据库自动化管理体系。MySQL事务机制与锁机制主讲:何广赢时间:2026/01/01目录01事务机制概述事务的定义、ACID特性和应用场景02事务管理自动提交模式、保存点和实战案例03并发调度事务调度类型和四类并发异常04隔离级别四种隔离级别的特点和配置05锁机制锁的粒度、类型和锁定操作06死锁问题死锁成因、检测和预防策略本章重点:理解事务机制和锁机制的基本原理和控制操作,掌握MySQL数据库中事务机制和锁机制的工作原理01事务机制基础01TRANSACTIONOVERVIEW事务机制概述事务的定义在MySQL中,事务是一组数据操作命令序列的集合,它的执行作为一个不可分割的工作单位。事务确保所有操作要么全部完成,要么全部不执行,中间不会被打断。在数据库系统常见的并发处理环境下,事务的目的是简化编程模型,确保数据的一致性和完整性。事务的核心价值1数据完整性保障确保数据库从一个一致性状态转移到下一个一致性状态2编程模型简化开发者无需处理复杂的数据恢复和并发冲突3错误恢复机制事务执行过程中发生差错可自动回滚到开始前的状态事务的基本特征原子性所有操作要么全部成功,要么全部失败一致性保持数据库的完整性约束不被破坏隔离性并发事务之间互不干扰持久性事务提交后数据永久保存为什么需要事务?在并发处理环境下,多个用户同时操作同一数据资源时,没有事务机制就会导致数据混乱和不一致。事务机制为数据库操作提供了可靠的保障,特别是在金融、电商等对数据准确性要求极高的场景中。ACIDPROPERTIES事务的ACID特性事务的四大特性是事务机制的理论基础,确保数据库操作的可靠性和一致性A原子性Atomicity事务中的操作是一个基本工作单位,要么全部完成,要么全部不执行。在事务执行过程中若发生差错,本次执行会被回滚到事务开始前的状态。START→Op1→Op2→...→COMMIT/ROLLBACKC一致性Consistency事务在开始之前和完成后,数据库是从上一个稳定性状态到下一个稳定性状态,其完整性不会被破坏。所有数据约束和业务规则在事务执行前后都保持一致。ConsistentState→Transaction→ConsistentStateI隔离性Isolation多个事务并发操作时,隔离性会使得各个事务在相对独立的环境中执行,期间不会相互干扰。执行的结果才能被访问,可以防止事务交叉执行而导致数据不一致。Tx1:[———]Tx2:[———](互不干扰)D持久性Durability事务完成后,数据的状态是稳定的,对数据的修改是永久的,即使系统故障也不会造成影响。数据已经被写入持久化存储介质。COMMIT→PersistentStorage→SystemCrash→DataSafeACID特性的协同作用:四大特性相辅相成,共同构成了事务机制的理论基础。原子性确保操作完整,一致性维护数据约束,隔离性处理并发冲突,持久性保证数据安全。ATOMICITY原子性:不可分割的工作单位原子性确保事务中的所有操作要么全部成功,要么全部失败,不存在中间状态核心概念事务中的操作是一个基本工作单位,要么全部完成,要么全部不执行。在事务执行过程中若发生差错,本次执行会被回滚到事务开始前的状态。原子性保证了事务的"全有或全无"特性,避免了部分操作成功、部分操作失败导致的数据不一致问题。没有原子性的风险部分操作成功转账时扣款成功但存款失败,导致资金丢失数据不一致订单创建成功但库存未扣减,导致超卖系统崩溃恢复困难无法确定哪些操作已执行,哪些需要回滚事务执行流程STARTTRANSACTION事务开始,系统记录起始状态1执行操作1UPDATEtable1SET...2执行操作2UPDATEtable2SET...N执行更多操作...继续执行其他SQL操作COMMIT-全部成功所有操作永久生效或ROLLBACK-全部失败所有操作撤销,回到开始状态CONSISTENCY一致性:数据状态的稳定转换一致性确保数据库从一个稳定状态转移到另一个稳定状态,维护数据完整性约束不被破坏核心概念事务在开始之前和完成后,数据库是从上一个稳定性状态到下一个稳定性状态,其完整性不会被破坏。所有数据约束和业务规则在事务执行前后都保持一致。一致性是数据库内部状态的正确性保证,确保数据始终满足所有定义的约束条件。一致性约束类型实体完整性主键不能为NULL,且必须唯一参照完整性外键必须引用存在的记录域完整性数据类型、范围、格式约束业务规则账户余额不能为负数等自定义规则1事务开始前数据库处于一致性状态,所有约束得到满足。账户A:1000元,账户B:500元总余额:1500元✓2事务执行中数据库可能处于临时不一致状态,但事务内部可见。账户A:800元,账户B:500元总余额:1300元✗(临时)3事务完成后数据库再次处于新的一致性状态,所有约束重新得到满足。账户A:800元,账户B:700元总余额:1500元✓ISOLATION隔离性:并发事务的独立执行隔离性确保多个并发事务在独立环境中执行,互不干扰,防止数据不一致核心概念多个事务并发操作时可能会同时对其数据进行读写,隔离性会使得各个事务在相对独立的环境中执行,期间不会相互干扰,执行的结果才能被访问,可以防止事务交叉执行而导致数据不一致。隔离性通过锁机制和MVCC(多版本并发控制)来实现,确保每个事务看到的数据都是一致的。没有隔离性的风险丢失更新两个事务同时更新同一数据,后提交的事务覆盖了先提交的事务的更新脏读事务读取了另一个未提交事务的临时数据,后者随后回滚不可重复读同一事务中两次读取同一数据得到不同结果并发事务执行示意T1事务1BEGIN;UPDATEaccountsSETbalance=balance-100WHEREid='A';UPDATEaccountsSETbalance=balance+100WHEREid='B';COMMIT;T2事务2BEGIN;--等待事务1释放锁SELECTbalanceFROMaccountsWHEREid='A';--读取已提交的数据COMMIT;隔离级别通过设置不同的隔离级别(READUNCOMMITTED、READCOMMITTED、REPEATABLEREAD、SERIALIZABLE),可以在数据一致性和系统性能之间找到平衡。DURABILITY持久性:永久性的数据变更持久性确保事务完成后,数据修改是永久的,即使系统故障也不会丢失核心概念事务完成后,数据的状态是稳定的,对数据的修改是永久的,即使系统故障也不会造成影响。数据已经被写入持久化存储介质(如硬盘、SSD)。持久性通过事务日志(redolog、undolog)机制实现,确保已提交事务的数据不会丢失。持久化机制RedoLog(重做日志)记录事务对数据的修改,用于崩溃恢复时重放已提交事务UndoLog(回滚日志)记录事务前的数据状态,用于事务回滚和MVCCCheckpoint(检查点)定期将内存中的脏页刷新到磁盘,加快恢复速度数据持久化流程1执行UPDATE操作修改内存中的数据页(BufferPool)2写入RedoLog记录修改内容到重做日志缓冲区3事务提交RedoLog刷写到磁盘,确保持久性4后台刷新修改的数据页异步刷新到磁盘持久性保证系统崩溃:已提交事务的数据可通过RedoLog恢复断电故障:重启后自动进行崩溃恢复,数据不丢失介质故障:结合备份和日志可实现时间点恢复USECASESCENARIO事务应用场景:银行转账案例通过银行转账业务场景,生动说明事务的必要性和核心价值业务场景描述事务的应用举例,比如银行转账业务中,数据操作需要一组特定流程来实现。张三给李四转账1000元,这一组操作流程分为减少张三账户金额和增加李四账户金额两步完成。张三转出账户转账1000元李四转入账户操作流程分解1查询张三账户余额SELECTbalanceFROMaccountsWHEREname='张三';2扣减张三账户金额UPDATEaccountsSETbalance=balance-1000WHEREname='张三';3增加李四账户金额UPDATEaccountsSETbalance=balance+1000WHEREname='李四';如果没有事务机制如果其中一个环节失败,就会导致数据不一致。例如:扣减张三账户金额成功,但增加李四账户金额失败,这1000元就"消失"了!数据不一致的严重后果资金丢失:转账金额在系统中凭空消失账目不平:系统总资金量发生变化客户投诉:用户体验极差,信任度下降法律风险:金融数据错误可能涉及法律责任事务的完美解决方案通过事务机制,可以确保这两步操作要么同时成功,要么同时失败,从而保持数据的一致性。成功场景扣款和存款都成功→COMMIT→数据永久生效失败场景任一步骤失败→ROLLBACK→回到初始状态RISKANALYSIS银行转账:没有事务的风险分析没有事务机制时银行转账可能出现的数据不一致情况及其严重后果场景一扣款成功+存款失败UPDATEaccountsSETbalance=balance-1000WHEREname='张三';✓执行成功UPDATEaccountsSETbalance=balance+1000WHEREname='李四';✗执行失败最终结果:张三少了1000元,李四没有增加,1000元凭空消失场景二扣款失败+存款成功UPDATEaccountsSETbalance=balance-1000WHEREname='张三';✗执行失败UPDATEaccountsSETbalance=balance+1000WHEREname='李四';✓执行成功最终结果:张三没少钱,李四多了1000元,银行资金凭空增加场景三系统崩溃中断UPDATEaccountsSETbalance=balance-1000WHEREname='张三';✓执行成功系统崩溃!操作中断最终结果:张三少了1000元,李四未收到,数据永久损坏关键启示金融系统对数据一致性的要求极高,必须使用事务机制来保证操作的原子性和一致性。原子性:扣款和存款必须同时成功或同时失败一致性:转账前后总资金量保持不变持久性:转账成功后数据永久保存TRANSACTIONSOLUTION银行转账:事务的解决方案展示事务如何完美解决银行转账问题,确保数据一致性事务包装转账操作--使用事务确保原子性STARTTRANSACTION;--1.查询张三账户余额SELECTbalanceINTO@zhang_balanceFROMaccountsWHEREname='张三';--2.检查余额是否充足IF@zhang_balance>=1000THEN--3.扣减张三账户金额UPDATEaccountsSETbalance=balance-1000WHEREname='张三';--4.增加李四账户金额UPDATEaccountsSETbalance=balance+1000WHEREname='李四';COMMIT;--提交事务,数据永久生效ELSEROLLBACK;--回滚事务,撤销所有操作ENDIF;END;事务执行流程图STARTTRANSACTION开启事务,准备执行转账操作↓验证余额检查张三账户余额是否充足↓执行扣款扣减张三账户1000元↓执行存款增加李四账户1000元↓COMMIT余额充足,提交事务ROLLBACK余额不足,回滚事务02事务管理操作02TRANSACTIONMANAGEMENTMySQL事务管理基础介绍MySQL中事务的默认设置和常用管理命令默认设置:自动提交模式在MySQL中,事务默认的设置是自动提交或回滚。这意味着每执行一条SQL语句,MySQL会自动将其作为一个独立的事务提交。--查看自动提交设置SHOWVARIABLESLIKE'autocommit';结果:ON(默认开启)手动控制事务的必要性自动提交的问题每条SQL独立提交,无法实现多个操作的原子性手动控制的优势可以将多个SQL操作组合成一个完整的事务事务管理命令STARTTRANSACTION显式开启一个新的事务COMMIT提交事务,使所有修改永久生效ROLLBACK回滚事务,撤销所有未提交的修改SAVEPOINT设置保存点,实现部分回滚重要提示用户可根据需要修改数据库系统的自动提交模式,并根据业务逻辑设置事务保存点。如有需要可回滚至指定保存点,提供更大的灵活性。AUTOCOMMITCONTROL关闭事务自动提交模式详细说明两种关闭自动提交的方式及其适用场景1显式关闭ExplicitClose通过设置系统变量@@autocommit为0,显式关闭当前会话的自动提交模式。--显式关闭自动提交SET@@autocommit=0;--验证设置结果SELECT@@autocommit;全局影响:当前会话的所有后续操作都需要手动提交持久性:设置在当前会话生命周期内有效注意:需要记得手动提交或回滚,否则可能导致锁问题2隐式关闭ImplicitClose通过执行STARTTRANSACTION命令,隐式关闭当前事务的自动提交模式。--隐式关闭自动提交STARTTRANSACTION;--或(MySQL扩展语法)BEGIN;临时影响:仅影响当前事务,完成后恢复自动提交推荐:更符合事务使用习惯,不易忘记提交清晰:代码意图明确,易于理解和维护重要提示事务不允许嵌套,启动新的事务前,要确保前一个事务已提交或回滚。隐式关闭方式更常用,更符合事务使用习惯,推荐使用。EXPLICITCLOSE显式关闭自动提交:命令与示例通过SET命令显式关闭自动提交模式的详细说明SET命令语法--关闭自动提交模式SET@@autocommit=0;--或(会话级)SETSESSIONautocommit=0;--或(使用别名)SETautocommit=0;验证设置结果--查看当前自动提交设置SELECT@@autocommit;--或SHOWVARIABLESLIKE'autocommit';结果:0(表示自动提交已关闭)使用示例--1.关闭自动提交SET@@autocommit=0;QueryOK,0rowsaffected(0.00sec)--2.执行数据操作INSERTINTOpatients(patientID,patientName)VALUES('p011','王测试');QueryOK,1rowaffected(0.01sec)--3.手动提交COMMIT;QueryOK,0rowsaffected(0.00sec)--或回滚--ROLLBACK;注意事项会话级设置SET命令只影响当前会话,不影响其他会话的自动提交设置需要手动提交关闭自动提交后,必须显式执行COMMIT或ROLLBACKIMPLICITCLOSE隐式关闭自动提交:StartTransaction使用STARTTRANSACTION命令隐式关闭自动提交,更符合事务使用习惯STARTTRANSACTION语法--标准SQL语法STARTTRANSACTION;--SQL语句SQL_statement_1;SQL_statement_2;...--结束事务COMMIT;--或ROLLBACK;MySQL扩展语法--MySQL的BEGIN语法(更简洁)BEGIN;--或(带修饰符)STARTTRANSACTIONWITHCONSISTENTSNAPSHOT;完整示例--1.隐式关闭自动提交STARTTRANSACTION;QueryOK,0rowsaffected(0.00sec)--2.执行多个SQL操作INSERTINTOpatients(patientID,patientName)VALUES('p011','王测试');QueryOK,1rowaffected(0.01sec)INSERTINTOpatients(patientID,patientName)VALUES('p012','李测试');QueryOK,1rowaffected(0.00sec)--3.验证数据SELECT*FROMpatientsWHEREpatientIDIN('p011','p012');+++|patientID|patientName|+++|p011|王测试||p012|李测试|+++--4.提交事务COMMIT;QueryOK,0rowsaffected(0.01sec)推荐使用隐式关闭方式更常用,更符合事务使用习惯,推荐在应用开发中使用。作用范围明确:只影响当前事务自动恢复:事务结束后自动恢复自动提交代码清晰:事务边界明确,易于维护SAVEPOINT设置事务保存点(Savepoint)介绍保存点的概念,实现事务的部分回滚功能保存点的概念事务除了完全回滚,还可部分回滚,即可回滚到某个保存点(savepoint)。保存点允许在事务内部设置标记点,回滚时只撤销保存点之后的操作。应用场景:长事务中的阶段性检查点复杂业务逻辑的分步回滚错误恢复和异常处理基本语法--设置保存点SAVEPOINTsavepoint_name;--回滚到保存点ROLLBACKTOSAVEPOINTsavepoint_name;--释放保存点RELEASESAVEPOINTsavepoint_name;完整语法结构--启动事务STARTTRANSACTION;--执行SQL语句1sql_statement1;--设置第一个保存点(可选)SAVEPOINTsp1;--执行SQL语句2sql_statement2;--设置第二个保存点(可选)SAVEPOINTsp2;--执行更多SQL语句...sql_statement3;--选择:提交、完全回滚或部分回滚COMMIT;--提交所有操作--ROLLBACK;--回滚所有操作--ROLLBACKTOSAVEPOINTsp1;--回滚到sp1重要规则保存点覆盖当事务回滚到某个保存点,该保存点之后的保存点将被删除无效保存点当某个保存点不存在时,回滚到这个保存点会报错SAVEPOINTOPERATIONS保存点操作详解详细说明保存点的创建、回滚和释放操作及其实现机制创建保存点语法:SAVEPOINTsp_name;在事务中设置一个标记点,可以创建多个保存点形成保存点链。回滚到保存点语法:ROLLBACKTOSAVEPOINTsp_name;撤销保存点之后的所有操作,但保留保存点之前的操作。释放保存点语法:RELEASESAVEPOINTsp_name;主动删除保存点,释放相关资源,通常不需要手动调用。保存点回滚机制1创建保存点系统在事务日志中记录保存点标记2继续执行操作后续操作继续记录到事务日志中3执行部分回滚撤销保存点之后的所有操作4保留之前操作保存点之前的操作保持不变,可以继续执行EXAMPLE7-1示例7-1:新增记录验证Rollback和Commit通过实际案例演示关闭自动提交后,事务回滚和提交的效果步骤1:关闭自动提交--查看当前自动提交设置SHOWVARIABLESLIKE'%autocommit%';+++|Variable_name|Value|+++|autocommit|ON|+++--关闭自动提交SET@@autocommit=0;QueryOK,0rowsaffected(0.00sec)步骤2:启动事务并新增记录--启动事务STARTTRANSACTION;QueryOK,0rowsaffected(0.00sec)--新增两条记录INSERTINTOpatients(patientID,patientName)VALUES('p011','王测试');QueryOK,1rowaffected(0.01sec)INSERTINTOpatients(patientID,patientName)VALUES('p012','李测试');QueryOK,1rowaffected(0.00sec)--查询验证SELECT*FROMpatientsWHEREpatientIDIN('p011','p012');步骤3:执行回滚操作--执行回滚ROLLBACK;QueryOK,0rowsaffected(0.00sec)--再次查询验证SELECT*FROMpatientsWHEREpatientIDIN('p011','p012');Emptyset(0.00sec)--结果:两条新增记录被撤销执行ROLLBACK后,前面新增的两条记录('p011'和'p012')被撤销,数据库回到事务开始前的状态。步骤4:提交操作--重新启动事务并更新STARTTRANSACTION;UPDATEpatientsSETpatientName='张雯雯'WHEREpatientID='p001';QueryOK,1rowaffected(0.01sec)--提交事务COMMIT;QueryOK,0rowsaffected(0.01sec)--验证更新结果SELECTpat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服装销售财务制度
- 法人股东财务制度
- 教育辅导机构财务制度
- 分层产权登记制度
- 内部资料编审制度
- 养老院老人紧急联络通讯制度
- 养老院老人安全教育培训制度
- 泉眼加固施工方案(3篇)
- 托管积分活动方案策划(3篇)
- 生产企业员工安全管理制度(3篇)
- 工程款纠纷专用!建设工程施工合同纠纷要素式起诉状模板
- 地坪漆施工方案范本
- 2026湖北武汉长江新区全域土地管理有限公司招聘3人笔试备考题库及答案解析
- 【《自适应巡航系统ACC的SOTIF风险的识别与评估分析案例》4100字】
- 阿坝州消防救援支队2026年面向社会公开招聘政府专职消防员(69人)笔试备考试题及答案解析
- 2025宁波市甬北粮食收储有限公司公开招聘工作人员2人笔试参考题库及答案解析
- 供应链年底总结与计划
- 院区病房改造提升项目节能评估报告
- 2025年美国心脏病协会心肺复苏和心血管急救指南(中文完整版)
- 2026年中考语文一轮复习:阅读理解万能答题模板
- 增殖放流效果评估体系
评论
0/150
提交评论