zoukankan      html  css  js  c++  java
  • python学习笔记 day45 存储过程---事务

     1. 事务

    就是执行的一对操作(很多sql语句)是原子性的,要么执行正确被一次性提交,要么就是执行过程发生错误直接回滚到原始状态,这样可以保证数据的安全性;

    伪代码:

    delimiter \
    create procedure p4()
    begin 
      声明出现异常则执行{
      set status=1;
      rollback -- 如果执行失败 则回滚到原始状态;
    }
    开始事务
      执行一些列sql语句
      commit
      set status =2; -- success
    END

    2. 实现

    注意:每一条语句都得加上 ; 否则会报错~

    delimiter \
    create procedure p4(
      out p_return_code tinyint) -- 存储过程中的参数 是out 也就是可以返回给外部使用(主要是用来标记存储过程中sql语句执行状态)
    
    BEGIN
      declare exit handler for sqlexception
      BEGIN
        set p_return_code=1; -- 如果存储过程的事务(一系列sql语句执行发生异常,状态码变为1)
        rollback; -- 并且回滚到原始状态
      END;
    
      start TRANSACTION;
        insert into student(name,tname) values("尝试","此条信息不会被插入") ;
        delete from student where tid=100; -- 会发生异常(student表没有tid字段)
      commit;
      set p_return_code=0;  -- 如果事务部分的sql语句正常执行, 则状态码就是0 否则为1 且会回滚 保持原始状态
    END\
    
    delimiter ;
    set @v1=2; -- 设置存储过程的out参数 为一个变量,为这个变量设置初始值
    call p4(@v1); -- 将变量v1传递给out参数p_return_code
    select @v1;

    运行结果:

    delimiter \
    create procedure p4(
      out p_return_code tinyint)
    
    begin 
      declare exit handler for SQLEXCEPTION
      begin
        set p_return_code=1;
        rollback;
      end;
      
      start transaction;
        insert into student(name,tname) values("尝试一下","不会出错的");
        delete from teacher where id=1;
      commit;
      
      set p_return_code=0;
    
    end\
    
    delimiter ;
    
    set @v1=100;
    call p4(@v1);
    select @v1;
    select * from teacher;
    select * from student;

    运行结果:
                                        

    如果存储过程中事务部分的sql语句有执行错误的,就会触发执行rollback 回滚到原始状态,从而一定程度上保证了数据的安全操作;

    import pymysql
    conn=pymysql.connect(host="localhost",user="root",password="123",database="db666",charset="utf8")
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.callproc("p4",(2,))  # 给存储过程的参数传值,由于只有一个out p_return_code tinyint 类型的参数,所以后续可以使用cursor.execute("select @_p4_0")获取参数的值
    conn.commit()  # 因为存储过程的事务中sql语句有增删改操作,需要提交
    result=cursor.fetchall()
    print(result)
    
    cursor.execute("select @_p4_0")  # 获取存储过程的out类型的参数p_return_code  根据该参数的值,可以判断事务中的sql语句执行的状态,p_return_code=0表明成功执行 =1表明执行失败,回滚到原始状态;
    result=cursor.fetchall()
    print(result)
    if result[0]["@_p4_0"]==1:
        print("操作失败,回滚到原始数据状态")
    else:
        print("存储过程的事务中sql语句执行成功")

    运行结果:

    talk is cheap,show me the code
  • 相关阅读:
    CentOS7 时间设置与网络同步
    CentOS7 系统升级,删除centos7开机界面多余选,升级至最新的内核
    Docker 编排工具Rancher 2.0
    Docker 编排工具Rancher 1.6.18
    通过WSL在Windows下安装子Linux系统
    Docker 使用Dockerfile构建redis镜像
    初探PHP多进程
    nginx转发
    mime类型
    socket php
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9989257.html
Copyright © 2011-2022 走看看