MySQL transaction事务安全示例讲解


Posted in MySQL onJune 21, 2022

事务安全 transaction

事务 transaction 访问可能更新数据库中各种数据项的一个程序执行单元unit

事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成

事务基本原理

MySQL允许将事务统一进行管理(存储引擎innodb),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用户确认结果之后再进行操作

事务通常是自动提交,也可以手动提交

自动事务

当客户端发送一条SQL指令(写操作,增删改)给服务器的时候,服务器在执行后,不用等待用户反馈结果,会自动将结果同步到数据表

两个客户端,一个客户端执行SQL指令,另一个客户端查看执行结果

通过变量控制自动事务

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
-- 关闭自动事务
set autocommit = off;

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+

关闭自动事务之后,一个客户端修改数据,另个一客户端看不到修改的结果

一旦关闭自动事务,就需要用户提供是否同步的命令

  • commit 提交 (同步到数据表,事务会被清空)
  • rollback 回滚 (清空之前的操作,不要了)
-- 客户端A关闭自动事务后操作数据
mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
+----+--------+
2 rows in set (0.01 sec)
mysql> insert into my_class (name) values('四班');
Query OK, 1 row affected (0.00 sec)

mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
|  5 | 四班   |
+----+--------+
3 rows in set (0.00 sec)
-- 客户端B看不到新增的 四班数据, 
mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
+----+--------+
2 rows in set (0.00 sec)

客户端A执行commit 提交事务之后,客户端B就可以看到新增的数据了

通常不需要关闭自动事务,需要使用事务的时候,使用手动事务

手动事务

开始、过程、结束,都要用户手动发送事务操作指令来实现

手动事务指令

-- 1、开启事务,从这条语句开始,后面所有的语句都不会直接写入到数据表,保存在事务日志中
start transaction 
-- 2、事务处理,多个指令构成
-- 3、事务提交,结束事务
commit / rollback

事务的使用

mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
|  5 | 四班   |
+----+--------+
3 rows in set (0.04 sec)
mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 刘备   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |     NULL |   20 |      2 |
|  4 | 张飞   |     NULL |   21 |      1 |
|  5 | 关羽   |     NULL |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+
6 rows in set (0.00 sec)
-- 开启事务
start transaction;
-- 执行事务操作,多个修改操作
insert into my_class (name)values ('六班');
insert into my_student (name, class_id, age, gender)values ('司马懿', 6, 26, 1);
-- 提交事务
commit;
-- 或者回滚操作,所有数据无效清空
rollback;

回滚点

当有一系列事务操作是,而其中的步骤如果成功了,没有必要重新来过,可以在某个点,设置一个记号(回滚点),然后如果后面有失败,那么可以回到这个记号的位置

-- 增加回滚点
savepoint 回滚点名字;
-- 回到回滚点 清空之后所有操作
rollback to 回滚点名字;

一个事务处理过程中,如果有很多步骤,可以设置多个回滚点

事务的特点

ACID:

  • 原子性 automicity 一个事务是不可分割的工作单元,要么都做,要么都不做
  • 一致性 consistency 事务必须是使数据库从一个一致性状态变到另一个一致性状态
  • 隔离性 isolation 一个事务的执行,不能被其他事务干扰,操作数据的时候会锁住该条数据
  • 持久性 durability 一个事务一旦提交,他对数据库中的数据改变就是永久的

如果条件中使用了索引,会隔离一条记录;反之,通过全表检索,会锁定整个表

到此这篇关于MySQL transaction事务安全示例讲解 的文章就介绍到这了,更多相关MySQL transaction 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
关于mysql中时间日期类型和字符串类型的选择
Nov 27 MySQL
SQL注入详解及防范方法
Dec 06 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
Jun 28 MySQL
MySQL详细讲解变量variables的用法
Jun 21 #MySQL
mysql sql常用语句大全
Jun 21 #MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 #MySQL
mysql幻读详解实例以及解决办法
Jun 16 #MySQL
mysql数据库隔离级别详解
Jun 16 #MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 #MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 #MySQL
You might like
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
Python matplotlib可视化实例解析
2020/06/01 Python
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
工作失误检讨书范文大全
2014/01/13 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
双语教学实施方案
2014/03/23 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
公司总经理岗位职责
2015/04/01 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
毕业论文致谢范文
2015/05/14 职场文书
小学语文国培研修日志
2015/11/13 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Python制作春联的示例代码
2022/01/22 Python
MySql分区类型及创建分区的方法
2022/04/13 MySQL