MySQL数据库入门第6章事务与存储过程·事务管理·存储过程的使用·存储过程的创建·综合案例—存储过程应用✎掌握事务的开启、提交、回滚以及存储过程的创建和使用12熟悉事务的四种隔离级别3了解事务的概念掌握学习目标✎事务管理☞点击查看本小节知识架构存储过程的创建☞点击查看本小节知识架构存储过程的使用综合案例—存储过程应用☞点击查看本小节知识架构知识架构✎6.1事务管理返回目录6.1.1事务的概念6.1.2事务的提交6.1.3事务的回滚事务的隔离级别6.1.4知识架构✎6.2存储过程的创建返回目录6.2.1创建存储过程6.2.2变量的使用6.2.3定义条件和处理程序6.2.4光标的使用6.2.5流程控制的使用知识架构✎6.3存储过程的使用返回目录6.3.1调用存储过程6.3.2查看存储过程6.3.3修改存储过程6.3.4删除存储过程知识架构✎−事物的使用:6.1事务管理STARTTRANSACTION;COMMIT;什么是事务?SQL语句开启事务执行SQL语句提交事务事务中的操作语句都需要使用COMMIT语句手动提交,只有事务提交后其中的操作才会生效。如果不想提交当前事务,可使用ROLLBACK语句取消当前事务。ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的。取消事务(回滚)ROLLBACK;所谓的事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,即事务中的语句要么都执行,要么都不执行。✎6.1事务管理−通过一个转账的案例演示事务的使用。案例代码✎6.1事务管理事务的定义特性!事务特性原子性一致性隔离性持久性原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功一致性是指事务将数据库从一种状态转变为下一种一致的状态。隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。✎6.1事务管理−由于事务中的操作都是手动提交的,因此在操作完事务时,一定要使用COMMIT语句提交事务,否则事务操作会失败。案例代码✎6.1事务管理−在操作一个事务时,如果发现当前事务中的操作是不合理的,此时只要还没有提交事务,就可以通过回滚来取消当前事务。案例代码✎6.1事务管理事务的隔离级别REPEATABLEREAD(可重复读)READUNCOMMITTED(读未提交)READCOMMITTED(读提交)SERIALIZABLE(可串行化)✎6.2存储过程的创建什么是存储过程创建存储过程的基本语法格式如下:CREATEPROCEDUREsp_name([proc_parameter])[characteristics…]routine_body存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。CREATEPROCEDURE:为用来创建存储过程的关键字。sp_name:为存储过程的名称。proc_parameter:为指定存储过程的参数列表。characteristics:用于指定存储过程的特性。通过一个案例演示存储过程的创建,如例6-2所示。案例代码✎6.2存储过程的创建变量的定义DECLAREvar_name[,varname]…date_type[DEFAULTvalue];定义变量的语法格式如下:DECLAREmyvariableINTDEFAULT100;在MySQL中,变量可以在子程序中声明,用于保存数据处理过程中的值,这些变量的作用范围在BEGIN…END程序中。var_name:为局部变量的名称。DEFAULTvalue:子句给变量提供一个默认值,该值可以被声明为一个常数或一个表达式。如果没有DEFAULT子句,变量的初始值为NULL。定义一个名称为myvariable的变量,类型为INT类型,默认值为100案例代码✎6.2存储过程的创建变量的使用使用SET语句为变量赋值语法如下:示例如下:SETvar_name=expr[,var_name=expr]…;使用SELECT…INTO为一个或多个变量赋值语法如下:示例如下:SELECTcol_name[…]INTOvar_name[…]table_expr;✎6.2存储过程的创建定义条件−定义条件是指事先定义程序执行过程中遇到的问题。定义条件使用DECLARE语句,语法格式如下:DECLAREcondition_nameCONDITIONFOR[condition_type];//condition_type的两种形式:[condition_type]:SQLSTATE[VALUE]sqlstate_value|mysql_error_codecondition_name:表示所定义的条件的名称;condition_type:表示条件的类型;sqlstate_value和mysql_error_code:表示MySQL的错误,sqlstate_value是长度为5的字符串类型错误代码,mysql_error_code为数值类型的错误代码。例如:ERROR1142(42000)中,sqlstate_value的值是42000,mysql_error_code的值是1142。定义条件示例如下:案例代码✎−处理程序定义了在程序执行过程中遇到问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行处理过程使用DECLARE语句定义,语法格式如下:6.2存储过程的创建定义处理程序DECLAREhandler_typeHANDLERFORcondition_value[,…]sp_statementhandler_type:CONTINUE|EXIT|UNDOcondition_value:|condition_name|SQLWARNING|NOTFOUND|SQLEXCEPTION|mysql_error_codehandler_type:为错误处理方式,参数取值有3个:CONTINUE、EXIT和UNDO。CONTINUE:表示遇到错误不处理,继续执行;EXIT:遇到错误马上退出。UNDO:表示遇到错误后撤回之前的操作,MySQL中暂时不支持这样的操作。sp_statement:参数为程序语句段,表示在遇到定义的错误时,需要执行的存储过程。condition_value:表示错误类型。✎6.2存储过程的创建定义处理程序的示例如下:演示定义条件和处理程序的执行过程:案例代码✎6.2存储过程的创建光标的声明语法:DECLAREcursor_nameCURSORFORselect_statementDECLAREcursor_studentCURSORFORselects_name,s_genderFROMstudent;示例:光标的使用语法:示例:OPENcursor_nameFETCHcursor_nameINTOvar_name[,var_name]…FETCHcursor_studentINTOs_name,s_gender;CLOSEcursor_name语法:光标的关闭在编写存储过程时,查询语句可能会返回多条记录,如果数据量非常大,则需要使用光标来逐条读取查询结果集中的记录。光标是一种用于轻松处理多行数据的机制。✎6.2存储过程的创建流程控制−存储过程中的流程控制语句用于将多个SQL语句划分或组合成符合业务逻辑的代码块,MySQL中的流程控制语句有7个:1、IF语句−语法格式如下:IFexpr_conditionTHENstatement_list[ELSEIFexpr_conditionTHENstatement_list][ELSEstatement_list]ENDIF2、CASE语句−语法格式如下:CASEcase_exprWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list]…[ELSEstatement_list]ENDCASE✎6.2存储过程的创建流程控制3、LOOP语句−语法格式如下:4、LEAVE语句−语法格式如下:[loop_label:]LOOPstatement_listENDLOOP[loop_label]LEAVElable✎6.2存储过程的创建流程控制5、ITERATE语句−语法格式如下:6、REPEAT语句−语法格式如下:ITERATElable[repeat_lable:]REPEATstatement_listUNTILexpr_conditionENDREPEAT[repeat_lable]✎6.2存储过程的创建流程控制7、WHILE语句−语法格式如下:[[while_lable:]WHILEexpr_conditionDOStatement_listENDWHILE[while_lable]✎6.3存储过程的使用调用存储过程−调用存储过程的语法如下:CALLsp_name([parameter[,…]])CALL:为调用存储过程的关键字。sp_name:为存储过程的名称。Parameter:为存储过程的参数。−创建一个存储过程并调用这个存储过程,示例如下:案例代码✎6.3存储过程的使用查看存储过程的状态使用SHOWSTATUS语句使用SHOWCREATE语句语法结构如下:CALLsp_name([parameter[,…]])123语法结构如下:SHOWCREATE{PROCEDURE|FUNCTION}sp_nameinformation_schema.Routines表中查看语法结构如下:SELECT*FROMinformation_schema.RoutinesWHEREROUTINE_NAME='CountProc1'ANDROUTINE_TYPE='PROCEDURE'\G✎6.3存储过程的使用修改存储过程−在MySQL中使用ALTER语句修改存储过程,语法如下:ALTER{PROCEDURE|FUNCTION}sp_name[characteristic…]sp_name:表示存储过程或函数的名称。characteristic:表示要修改存储过程的哪个部分,characteristic的取值分为8部分。修改存储过程示例如下案例代码✎6.3存储过程的使用删除存储过程−在MySQL中使用DROP语句修改存储过程,语法如下:−删除存储过程示例如下:DROP{PROCEDURE|FUNCTION}[IFEXISTS]sp_name✎6.4综合案例—过程应用−通过前面的学习,读者应该已经掌握了如何创建和使用存储过程。−下面通过一个应用案例让读者熟悉在实际开发中,创建并使用存储过程的完整过程。案例代码✎本章小结本章主要讲解了事务管理、存储过程的创建和存储过程的使用。通过本章的学习,初学者可以掌握如何处理事务,以及如何使用存储过程。在实际开发中事务管理非常重要,而存储过程可以简化操作,提高效率,所以初学者应该多加练习,熟练掌握事务的处理和存储过程的编写。