MySQL事务(四大特性)-存储过程
一:事务
1.四大特性(ACID)
A:原子性
每个事务都是不可分割的最小单位(同一个事务内的多个操作要么同时成功要么同时失败)
C:一致性
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
I:隔离性
事务与事务之间彼此不干扰
D:持久性
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
2.事物存在的必要性(真实比喻)
比如银行ATM机,转账功能比喻:
人物介绍:
小明
交通银行ATM机
小花
1.小明使用工行 通过交行ATM机给小花转账100元
2.交行向数据库发出请求,将小明的工行卡减去1000元。
3.数据库在向建设银行发出的请求,途中出现了信息错乱(断电\断网\不可抗力)出现了网络终断,导致请求没发出去
总结:
小明的钱减了,小花的钱没有加,导致信息错误(无法进行正常转账)

- 解决方法:
事务的必要性,就是(要么同时成功,要么同时失败)
3.如何使用事务
先介绍事物的三个关键字 再去用表实际展示效果
4.开启事务-回滚-确认
开启事务
start transaction;
回滚
rollback;
确认
commit;
二:事务案例实战
1.模拟消费
2.创建
create table user(
id int primary key auto_increment,
name char(32),
balance int # 存款
);
3.插入数据
insert into user(name,balance)
values
('jason',1000),
('tony',1000),
('oscar',1000);
4.开启事务
start transaction;
5.修改操作(同时事务)
update user set balance=900 where name='jason'; # 买支付
update user set balance=1010 where name='tony'; # 中介拿走10元
update user set balance=1090 where name='oscar'; # 卖家拿到90元
6.查询消费后的结果
select * from user;

7.但是在事物里边这个数据还没有到硬盘中,在内存中,还没有保存。
但是在事物里边这个数据还没有到硬盘中,在内存中,还没有保存。
现在这个状态还可以回退,我反悔了我不买了(双方同时失败)
回滚操作:rollback;

8.确认事物,确认支付成功不反悔(双方同时成功)
commit;

9.总结事物:
1.开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘。
2.开启事务检测操作是否完整,不完整主动滚回上一个状态,如果完整就应该执行commit操作。
10.使用python代码,来完善的伪代码的逻辑
try: # 异常捕获(判断一旦以下代码出现一行报错则执行)
update user set balance=900 where name='jason'; # 买家支付100元
update user set balance=1010 where name='egon'; # 中介拿走10元
update user set balance=1090 where name='tank'; # 卖家拿到90元
except 异常: # 如果有异常就滚回去
rolback;
else: # 无异常则保存解释事务
commit;
三:存储过程
1.什么是存储过程?
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,类似于python中的自定义函数。
2.存储过程格式
关键字: procedure
格式:
create procedure 函数名(参数)
begin
功能体代码
end
调用其内部sql代码格式
call 函数名()
- 类似于python中的自定义函数
3.无参存储过程
delimiter $$ # 修改结束符
create procedure p1()
begin
select * from user;
end $$
delimiter ; # 修改回来结束符
# 通过p1()调用其内部sql代码
call p1();

4.有参存储过程
delimiter $$
create procedure p2(
in m int, # in表示这个参数必须只能是传入不能被返回出去
in n int,
out res int # out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去
)
begin
select * from user where id > m and id < n;
set res=0; # 用来标志存储过程是否执行
end $$
delimiter ;
# 针对res需要提前定义
set @res=10; # 定义/赋值 # 指定res=10
select @res; # 查看
call p2(1,3,@res); # 调用
select @res; # 调用

5.查看存储过程-查看所有存储过程-删除存储过程
查看存储过程具体信息
show create procedure status;
查看所有存储过程
show procedure status;
删除存储过程
drop procedure pro2;
6.pyMySQL代码调用存储过程
import pymysql
# 创建链接
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='123',
db='db6',
charset='utf8',
autocommit=True # 涉及到增删改,二次确认
)
# 生成一个游标对象(操作数据库)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 调用存储过程固定语法callproc('p2',(1,3,10))
cursor.callproc('p2',(1,3,10)) # 内部原理 @_p1_0=1,@_p1_1=3,@_p1_2=10;
# 查看结果
print(cursor.fetchall())

四:隔离级别
1.事务隔离级别介绍
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改
InnoDB支持所有隔离级别
set transaction isolation level 级别
2.read uncommitted(未提交读)
事务中的修改即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,这一现象也称之为"脏读"
- 解析:
事务中数据修改即使没有提交,在内存中,没有提交到硬盘,别人可能也是引用的我内存中的数据,读的是修改的但是没有提交的,该现象称之为“脏读”
3.read committed(提交读)
大多数数据库系统默认的隔离级别
一个事务从开始直到提交之前所作的任何修改对其他事务都是不可见的,这种级别也叫做"不可重复读"
- 解析:
该事务修改了,只要没有提交,别人是不可读的,其他人用的就是没有改之前原表里面的数据,两者之间不会发生冲突,该现象称之为“不可重复读”
4.repeatable read(可重复读) # MySQL默认隔离级别
能够解决"脏读"问题,但是无法解决"幻读"
所谓幻读指的是当某个事务在读取某个范围内的记录时另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录会产生幻行,InnoDB和XtraDB通过多版本并发控制(MVCC)及间隙锁策略解决该问题
4.serializable(可串行读)
强制事务串行执行,很少使用该级别
一个个排队执行,效率太低,不可能使用
MySQL事务(四大特性)-存储过程的更多相关文章
- mysql事务四大特性
本篇讲诉数据库中事务的四大特性(ACID)和简单操作 ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务 ...
- mysql进阶(二十三)数据库事务四大特性
数据库事务四大特性 原子性.一致性.分离性.持久性 原子性 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行.这种特性称为 ...
- 【MySQL】:事务四大特性与隔离级别
目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...
- mysql 事物四大特性和事物的四个隔离
1.事物四大特性(ACID) 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部 ...
- Java数据库事务四大特性以及隔离级别
四大特性ACID 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.失败回滚的操作事务,将不能对数据库有任何影响 一致性(Consistency) 一致性是指事 ...
- 事务四大特性(ACID)
事务的概念:事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成. 事务的管理:默认情况下,数据库会自动管理事务,管理的方式是一条语句就独占一个事务. 如果需要自己控制事务也可以通过如下命令开 ...
- 粗谈MySQL事务的特性和隔离级别
网上对于此类的文章已经十分饱和了,那还写的原因很简单--作为自己的理解笔记. 前言 此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb.首先先讲讲事务的概念,在<高性能 ...
- mysql事务,视图,触发器,存储过程与备份
.事务 通俗的说,事务指一组操作,要么都执行成功,要么都执行失败 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上1000元, 我给朋友转账100元(无手续费), 如果,我的钱刚扣,而朋友 ...
- mysql的高级特性-存储过程
定义: 存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令. 语法: DELIMITER // 声明语句结束符,用于区分; CEATE PROCED ...
- mysql事务的特性?
1.原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执 行. 2.一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的 ...
随机推荐
- centos7中配置java + mysql +jdk +使用jar部署项目
centos7中配置java + mysql +jdk +使用jar部署项目 思维导图 1. 配置JDK環境 1.1下载jdk安装包 Java Downloads | Oracle 1.2 将下载j ...
- 欢迎来到ktq_cpp的cnblog
欢迎来到ktq_cpp的cnblog 初学html,可能排版有一些问题,望指教 我的洛谷博客 我的AtCoder账号
- C言语语法总结(随时更新)
一.gcc1. gcc xxx.c -o xxx #把原代码编译成可执行文件xxx2. gcc -c xxx.c #编译: 把原代码编译xxx.o后辍的目标文件3. gcc xxx.o -o xxx ...
- for循环小九九乘法表
for(int i=1;i<=9;i++) { for(int j=1;j<=i;j++) { System.out.print(i+"*"+j+"=&quo ...
- python字典推导&&列表推导&&输出随机数
字典推导: x = ['A', 'B', 'C', 'D'] y = ['Alice', 'Bob', 'Cecil', 'David'] print({i:j for i,j in zip(x,y) ...
- ElasticSearch之Windows中环境安装
ElasticSearch 说明 本章,我们主要以在 Windows 中对ElasticSearch 安装进行介绍! 1. 下载 ElasticSearch 这里我们下载的版本为7.17.4为例进行介 ...
- 前端JS模板引擎Mustache.js的用法
Mustache.js在前端是一个非常强大的模板 Mustache用法参考
- 上下文管理器 context managet
定义:实现了上下文管理协议的对象,主要用于保存和恢复各种全局状态,关闭文件等,它本身就是一种装饰器. with语句 with语句就是为支持上下文管理器而存在的
- 重新整理 .net core 实践篇 ———— dotnet-dump [外篇]
前言 本文的上一篇为: https://www.cnblogs.com/aoximin/p/16861797.html 该文为dotnet-dump 和 procdump 的实战介绍一下. 正文 现在 ...
- AGC007C Pushing Balls —— 期望的神题
Problem Link 题意: 序列上按顺序交错有 \(n\) 个球和 \(n+1\) 个洞,即 \(hole_1,ball_1,hole_2,ball_2,\dots,ball_n,hole_{n ...