zoukankan      html  css  js  c++  java
  • mysql的存储过程与事务入门

    存储过程是:
    通过一系列的SQL语句, 根据传入的参数(也可以没有), 通过简单的调用, 
    完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译。主要对存储的过程进行控制。

    事务是一系列的数据更改操作组成的一个整体。一旦事务中包含的某操作失败或用户中止,用户可以控制将事务体中所有操作撤消,返回事务开始前的状态。
    事务中的操作是一个整体,要么整体完成,要么全部不做。从而保证了数据的完整性。
    Mysql中,MyISAM存储引擎不支持事务,InnoDB支持。

    两者都是数据库中非常重要的知识。

    一、存储过程

    创建一张test1表的存储过程
    mysql> delimiter $ -- delimiter $是设置 $为命令终止符号,代替默认的分号,因为分号有其他用处.
    mysql> create procedure sp_test1()
    -> begin
    -> create table test1(id int,name varchar(100));
    ->insert into test1 values(1,'lilei');
    -> select * from test1;
    -> end
    -> $
    Query OK, 0 rows affected (0.00 sec)
    mysql> delimiter ; //恢复分号作为分隔终止符号
    
    调用存储过程
    mysql> call sp_test1();
    
    
    
    创建带参数的存储过程
    mysql> delimiter $ -- delimiter $是设置 $为命令终止符号,代替默认的分号,因为分号有其他用处.
    mysql> create procedure sp_test(IN pi_id int, OUT po_name varchar(10))
    -> begin
    -> select * from test.tb_test;
    -> select tb_test.name into po_name from test.tb_test where tb_test.id = pi_id;
    -> end
    -> $
    Query OK, 0 rows affected (0.00 sec)
    mysql> delimiter ; -- 恢复分号作为分隔终止符号
    
    5.调用存储过程
    mysql> set @po_name='';
    Query OK, 0 rows affected (0.00 sec)
    mysql> call sp_test(1,@po_name);
    

      

    二、事务处理

    mysql中如果是不支持事务的引擎,如myisam,则是否commit都没有效的。

    如果是支持事务的引擎,如innodb,则有系统参数设置是否自动commit,查看参数如下:
    mysql> show variables like '%autocommit%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit | ON |
    +---------------+-------+
    1 row in set (0.00 sec)

    mysql>

    显示结果为on表示事务自动提交,也即不用手工去commit。
    当然,你可以设置其为OFF,然后自己手工去commit。

    使用了commit后你不可以回退,它会永久改变你的数据,而不使用只是临时改变,它把改变后的内容备份了一份在日志中,你可以rollback还原回来,看情况而用了。

    PHP中使用事务实例

    <?php
    $handler=mysql_connect("localhost","root","password");
    mysql_select_db("task");
    mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行
    mysql_query("BEGIN");//开始事务定义
    if(!mysql_query("insert into trans (id) values('2')"))
    {
    mysql_query("ROLLBACK");//判断当执行失败时回滚
    }
    if(!mysql_query("insert into trans (id) values('4')"))
    {
    mysql_query("ROLLBACK");//判断执行失败回滚
    }
    mysql_query("COMMIT");//执行事务
    mysql_close($handler);
    ?>
    

      

    Mysql控制台事务处理

    mysql> use test;
    Database changed
    mysql> CREATE TABLE `dbtest`(
         -> id int(4)
         -> ) TYPE=INNODB;
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    
    mysql> select * from dbtest
         -> ;
    Empty set (0.01 sec)
    
    mysql> begin;  //开启事务
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into dbtest value(5);//插入数据,表中数据临时改变,可回滚
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into dbtest value(6);//插入数据,表中数据临时改变,可以回滚
    Query OK, 1 row affected (0.00 sec)
    
    mysql> commit;   //提交,表中临时数据不可回滚
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from dbtest;
    +------+
    | id    |
    +------+
    |     5 |
    |     6 |
    +------+
    2 rows in set (0.00 sec)
    
    mysql> begin;  //开启事务
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into dbtest values(7);  //插入数据,表中数据临时改变
    Query OK, 1 row affected (0.00 sec)
    
    mysql> rollback;   //回滚到事务开始前数据
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from dbtest;
    +------+
    | id    |
    +------+
    |     5 |
    |     6 |
    +------+
    2 rows in set (0.00 sec)
    

      

  • 相关阅读:
    (4.25)Sqlserver中 登录用户只能看到自己拥有权限的库
    【查阅】mysql配置文件/参数文件重要参数笔录(my.cnf)
    【监控笔记】【2.5】DML(CDC)、DDL(DDL触发器)跟踪数据更改,数据库审计
    SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑
    【监控笔记】【2.4】SQL Server中的 Ring Buffer 诊断各种系统资源压力情况
    【监控笔记】【2.3】扩展事件——慢查询SQL(执行超过3S的SQL)
    【监控笔记】【2.2】扩展事件——死锁监控
    最小配置启动SQL SERVER,更改SQL Server最大内存大小导致不能启动的解决方法
    【监控笔记】【2.1】扩展事件
    【扩展事件】跟踪超过3秒的SQL
  • 原文地址:https://www.cnblogs.com/lisuyun/p/5600155.html
Copyright © 2011-2022 走看看