事务与存储过程

事务管理

  事务的概念

    谓的事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,即事务中的语句要么都执行,要么都不执行。

  事务的使用

    开启事务START TRANSACTION;

    执行SQL语句

    提交事务COMMIT;

    取消事务(回滚)

  事务的提交

    事务中的操作语句都需要使用COMMIT语句手动提交,只有事务提交后其中的操作才会生效。

  事务的回滚

    如果不想提交当前事务,可使用ROLLBACK语句取消当前事务。

    ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的。

  事务的隔离级别

    REPEATABLE READ(可重复读)

    READ UNCOMMITTED(读未提交)

    READ COMMITTED(读提交)

    SERIALIZABLE(可串行化)

事务的定义特性

  原子性

  原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功

  一致性

   一致性是指事务将数据库从一种状态转变为下一种一致的状态。

  隔离性

   隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。  

  持久性

  事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。

  事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。

存储过程的创建

  什么是存储过程

    存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。

  创建存储过程

    CREATE PROCEDURE sp_name([proc_parameter])

    [characteristics…]routine_body

    CREATE PROCEDURE:为用来创建存储过程的关键字。

    sp_name:为存储过程的名称。

    proc_parameter:为指定存储过程的参数列表。

    characteristics:用于指定存储过程的特性。

  变量的使用

    定义

      在MySQL中,变量可以在子程序中声明,用于保存数据处理过程中的值,这些变量的作用范围在BEGIN…END程序中。

      DECLARE var_name[,varname]…date_type[DEFAULT value];

      var_name:为局部变量的名称。

      DEFAULT value:子句给变量提供一个默认值,该值可以被声明为一个常数或一个表达式。如果没有DEFAULT子句,变量的初始值为NULL。

    使用SET语句为变量赋值

      SET var_name =

      expr[,var_name = expr]…;

    使用SELECT…INTO为一个或多个变量赋值

      SELECT col_name[…]

      INTO var_name[…] table_expr;

  定义条件和处理程序

    定义条件是指事先定义程序执行过程中遇到的问题

      DECLARE condition_name CONDITION FOR [condition_type];

      // condition_type的两种形式:

      [condition_type]:

      SQLSTATE[VALUE] sqlstate_value|mysql_error_code

    处理程序定义了在程序执行过程中遇到问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行处理过程使用DECLARE语句定义

      DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement

      handler_type:

      CONTINUE|EXIT|UNDO

      condition_value:

      |condition_name

      |SQLWARNING

      |NOT FOUND

      |SQLEXCEPTION

      |mysql_error_code

      handler_type:为错误处理方式,参数取值

      有3个:CONTINUE、EXIT和UNDO。

     CONTINUE:表示遇到错误不处理,继续执行;

     EXIT:遇到错误马上退出。

     UNDO:表示遇到错误后撤回之前的操作,MySQL中暂时不支持这样的操作。sp_statement:参数为程序语句段,表示在遇到定义的错误时,需要执行的存储过程。

      condition_value:表示错误类型。

  光标的使用

    在编写存储过程时,查询语句可能会返回多条记录,如果数据量非常大,则需要使用光标来逐条读取查询结果集中的记录。光标是一种用于轻松处理多行数据的机制。

    声明

      语法:DECLARE cursor_name CURSOR FOR select_statement

      示例:DECLARE cursor_student CURSOR FOR select s_name,s_gender FROM student;

    使用

      语法:OPEN cursor_name FETCH cursor_name INTO var_name[,var_name]…

      示例:FETCH cursor_student INTO s_name, s_gender;

    关闭

      CLOSE cursor_name

流程控制的使用

  存储过程中的流程控制语句用于将多个SQL语句划分或组合成符合业务逻辑的代码块,MySQL中的流程控制语句有7个

  1、 IF语句

    语法格式如下:

    IF expr_condition THEN statement_list

    [ELSEIF expr_condition THEN statement_list]

    [ELSE statement_list]

    END IF

  2、CASE语句

    语法格式如下:

    CASE case_expr

WHEN when_value THEN statement_list

[WHEN when_value THEN statement_list]…

[ELSE statement_list]

    END CASE

  3、 LOOP语句

    语法格式如下:

    [loop_label:]LOOP

    statement_list

    END LOOP [loop_label]

4、LEAVE语句

    语法格式如下:

    LEAVE lable

  5、ITERATE语句

    语法格式如下:

    ITERATE lable

6、REPEAT语句

    语法格式如下:

    [repeat_lable:] REPEAT

    statement_list

    UNTIL expr_condition

    END REPEAT[repeat_lable]

  7、WHILE语句

    语法格式如下:

    [[while_lable:] WHILE expr_condition DO

    Statement_list

    END WHILE [while_lable]

存储过程的使用

  调用存储过程

    CALL sp_name([parameter[,…]])

    CALL:为调用存储过程的关键字。

    sp_name:为存储过程的名称。

    Parameter:为存储过程的参数。

  查看存储过程

    1、使用SHOW STATUS语句

      CALL sp_name([parameter[,…]])

    2、使用SHOW CREATE语句

      SHOW CREATE{PROCEDURE|FUNCTION} sp_name

    3、information_schema.Routines表中查看

      SELECT * FROM  information_schema.Routines

      WHERE ROUTINE_NAME='CountProc1'

      AND ROUTINE_TYPE='PROCEDURE'\G

  修改存储过程

    ALTER {PROCEDURE|FUNCTION} sp_name[characteristic…]

    sp_name:表示存储过程或函数的名称。characteristic:表示要修改存储过程的哪个部分, characteristic 的取值分为8部分。

  删除存储过程

    DROP{ PROCEDURE|FUNCTION }[IF EXISTS] sp_name

    综合案例--存储过程应用

MySQL<事务与存储过程>的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. BAT-SVN自动更新代码目录

    1.安装“TortoiseSVN-1.7.15.25753-x64-svn-1.7.18.msi”. 2.“运行”->“cmd”->输入“svn help”->出现用说明代表正常,提 ...

  2. JDBC的介绍

    JDBC详解   1.JDBC是什么? JDBC(JAVA DataBase Connection)即JAVA数据库连接技术,JDBC API是一个Java API,可以访问任何类型表列数据,特别是存 ...

  3. 应用层timer_libc_posix timer

    应用层除了通过setitimer/getitimer设置获取timer外,还可通过timer_create()等一系列函数实现应用层timer功能. 应用流程 The timers created b ...

  4. shell中执行hive命令错误:delimited by end-of-file (wanted `EOF')

    错误信息: warning: here-document at line 58 delimited by end-of-file (wanted `EOF') 业务场景,使用hive对数据进行批量清洗 ...

  5. nodejs 模块以及加载机制,主要讨论找不到模块的问题

    最主要的一个思想,加载模块无非就是找到模块在哪,只要清楚了模块的位置以及模块加载的逻辑那么找不到模块的问题就迎刃而解了.本文只是综合了自己所学的知识点进行总结,难免出现理解错误的地方,请见谅. nod ...

  6. 上手并过渡到PHP7(4)——取代fatal error的engine exceptions

    上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了 ...

  7. JS实现点击表头表格自动排序(含数字、字符串、日期)

    这篇文章主要介绍了利用JS如何实现点击表头后表格自动排序,其中包含数字排序.字符串排序以及日期格式的排序,文中给出了完整的示例代码,并做了注释,相信大家都能看懂,感兴趣的朋友们一起来看看吧. < ...

  8. 关于Cocos2d-x对象的定义和创建

    游戏可以包含很多个场景,每个场景又包含很多的层,每个层又包含很多的节点,这些节点,层,场景都可以看成一个一个的对象,我们把每一个彼此不同但又是同类型的对象归为一个类,为它创建一个单独的类,这个类有这些 ...

  9. selenium测试(Java)--元素操作(五)

    元素的操作有 1. 清除文本 2. 模拟按键输入 3. 单击元素 4. 返回元素尺寸 5. 获取文本 6. 获取属性值 7. 判断是否可见 8. 提交 下面通过操作新浪邮箱的注册界面的脚本来展示使用方 ...

  10. apt-get强制使用Ipv4

    sudo apt-get -o Acquire::ForceIPv4=true update 永久解决办法: 创建文件 /etc/apt/apt.conf.d/99force-ipv4 加入代码: A ...