mysql高级:触发器、事务、存储过程、调用存储过程
一、触发器
二、pymysql事务测试
三、存储过程
四、pymysql调用存储过程
一、触发器
在某个时间发生了某个事件时 会自动触发一段sql语句
begin
if new.success = "no" then
insert into errlog values(null,new.cmd,new.sub_time);
end if;
end
delimiter //
二、pymysql事务测试
事务*****
是逻辑上的一组sql语句 他们要么都成功 要么都失败 今后只要执行sql就会有事务
start transaction
rollback 出现错误则执行回滚
commit 没有错误则提交
四个特性 原子性 一致性 隔离性 持久性
四个隔离级别 读未提交 读已提交 可重复读 序列化执行(串行)
import pymysql conn = pymysql.connect(
user="root",
password="root",
database="day48",
charset="utf8"
) cursor = conn.cursor(pymysql.cursors.DictCursor)
# cursor.execute("delete from account where id =1")
# conn.commit() sql = "update account set money = money - 100 where id = 2"
sq2 = "update account set moneys = money + 100 where id = 3"
try:
cursor.execute(sql)
cursor.execute(sq2)
conn.commit()
print("提交了!")
except:
print("回滚了!")
conn.rollback() # 把你需要放在同一事务的sql执行 放在try中 最后加上commit
# 如果捕获到异常则执行rollback # 在mysql客户端中 如果遇到了sql语句异常 能回滚吗? """
脏读?
读取到另一个事务未提交的数据
不可重复读
一个事务在查询 一个在update 第一次查 和第二次查有可能数据不一样
幻读
一个事务在查 另一个insert 或 delete 第一次查 和第二次查有可能记录不一样 """ # 什么是事务
# # 逻辑上的一组操作,
# # 事务的特点
# # 原子性
# # 一致性
# # 隔离性
# # 持久性
# # 什么时候使用事务
# # 当需要保证一堆sql 要么都成功 要么都失败时
三、存储过程
1.数据库操作全都放到mysql中,应用程序不需要编写sql语句 直接调存储过程
优点:
应用程序开发者,工作量降低,
提高程序的执行效率 因为网络io减少了
缺点:学习成本高,扩展性 维护性差
部门间沟通成本 2.应用程序完全自己编写sql语句
优点:
扩展性 维护性高
部门间沟通成本
缺点:工作量大,sql语句的优化需要应用程序开发者完成 今后常用的
3.使用ORM(对象关系映射 )框架 可以直接使用面向对象的方式完成对数据库的CRUD
简单的说就是帮你封装了sql语句的生成
优点:
不需要写sql语句,开发效率高
不需要考虑sql优化问题 缺点:执行效率比第二种方式略低 完全可以忽略 delimiter //
create procedure p1(in start int,in stop int,out res int)
begin
select *from student where id >= start and id <= stop;
select *from student;
set res = 1;
end//
delimiter ; delimiter //
create PROCEDURE p5(OUT p_return_code tinyint)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
set p_return_code = 1;
rollback;
END;
# exit 也可以换成continue 表示发送异常时继续执行
DECLARE exit handler for sqlwarning
BEGIN
set p_return_code = 2;
rollback;
END;
START TRANSACTION;
update account set money = money - 1000 where id = 1;
update account set money = money - 1000 where id = 1; # moneys字段导致异常
set p_return_code = 0; #0代表执行成功
COMMIT;
END //
delimiter ;
四、pymysql调用存储过程
import pymysql conn = pymysql.connect(
user="root",
password="root",
database="day48",
charset="utf8"
) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc("p1",(2,5,1)) #pymysql 会给参数全都创建对应的变量
# 命名方式 @_p1_0 @_p1_1 @_p1_2
print(cursor.fetchall()) # 如果过程中包含多个查询语句 得到的是第一条查询语句的结果 cursor.execute("select @_p1_2")
print(cursor.fetchone()) i = 0
五、6备份与恢复***
mysqldump -u -p (库名 [表名] | --all--databases --databases 库名1 库名2) > 文件路径
恢复
1.mysql -u -p < 文件路径
2.source 文件路径
mysql高级:触发器、事务、存储过程、调用存储过程的更多相关文章
- ADO.NET系列之事务和调用存储过程
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...
- Mysql高级之事务
原文:Mysql高级之事务 通俗的说事务: 指一组操作,要么都成功执行,要么都不执行.---->原子性 在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-->隔离性 事务发生 ...
- SQL 存储过程调用存储过程
研究一个别人做的项目代码看到数据库里有一段存储过程调用存储过程的代码,原来的代码比较复杂. 于是自己打算写一个简单的例子学习一下. 一.首先创建了被需要被调用的存储过程. USE [MSPetShop ...
- sqlserver存储过程里传字段、传字符串,并返回DataTable、字符串,存储过程调用存储过程。
经常需要查一些信息, 想写视图来返回数据以提高效率,但是用试视图不能传参,只好想到改存储过程.记录一下语法,方便以后做项目时候想不起来了用. 1:传字段返回datatable 2: 传字段回一串字符 ...
- MySQL视图,触发器,事务,存储过程,函数
create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...
- MySQL 视图触发器事务存储过程函数
事务 致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...
- MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...
- MySQL——视图/触发器/事务/存储过程/函数/流程控制
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- Mysql 简单的使用定时器调用存储过程
1.创建测试的表 CREATE TABLE mytable ( id INT auto_increment NOT NULL, NAME VARCHAR (100) NOT NULL DE ...
- MySQL 开启事件 使用定时器调用存储过程
mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表:create table mytable (id int auto_incremen ...
随机推荐
- C#创建windows服务(一:初识windows服务)
一 . 服务简介 Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序. 这些服务可在计算机启动时自动启动,可以暂 ...
- 一台物理机器一个IP配置多个域名多套程序的方法
1.安装nginx cd /usr/local/ wget http://nginx.org/download/nginx-1.2.8.tar.gz tar -zxvf nginx-1.2.8.tar ...
- 【计算机视觉】极限优化:Haar特征的另一种的快速计算方法—boxfilter
这种以Boxfilter替代integral image 的方法很难使用到haar.LBP等特征检测中,因为像下面说的,它不支持多尺度,也就是说所提取的特征必须是同一个大小,最起码同一个宽高比的,这一 ...
- Linux文件属性之Linux文件删除重要原理详解
Linux下文件删除的原理 只要dongdaxiafile(源文件).服务进程.dongdaxiaflie_hard_link(硬链接文件)三个中的任意一个存在文件不会被删除.
- Javascript学习笔记二——操作DOM
Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...
- POJ3450最长公共子串【kmp】
题目链接:http://poj.org/problem?id=3450 题目大意:给定n个长度不超过200的字符串,n < 4000.求这些字符串的最长公共子串,若没有,则输出 “IDENTIT ...
- 【转帖】我以为我对Kafka很了解,直到我看了这篇文章
我以为我对Kafka很了解,直到我看了这篇文章 2019-08-12 18:05 https://www.sohu.com/a/333235171_463994?spm=smpc.author.fd- ...
- 【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例
类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”, ...
- 怎么将本地项目放到码云(gitee)上面?图文详解
git的好处什么的,在此就不多赘述.现在很多公司都在用git了. 那么怎么将本地已经有的项目放到码云(gitee)上呢? 前置条件说明: 1:原来项目所在位置:D:\workspace01\class ...
- JZOJ.1002【USACO题库】1.1.3 Friday the Thirteenth黑色星期五
每日一博第一天! 保持你的决心 题目描述 13号又是星期五是一个不寻常的日子吗? 13号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在n年里13 日落在星期一,星期二......星期日的 ...