MySQL数据库8(二十一)事务

Wesley13
• 阅读 713

事务安全

事务概念

l  Transaction

l  事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)

l  一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成

l  事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同

事务由事务开始到事务结束之间执行的全体操作组成。

  • 开启事务:Start Transaction
  • 事务结束:End Transaction
  • 提交事务:Commit Transaction
  • 回滚事务:Rollback Transaction

事务基本原理

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

 MySQL数据库8(二十一)事务

事务在mysql中通常是自动提交的,但是也是可以使用手动事务

自动事务

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

证明:打开两个客户端,一个客户端执行SQL指令,另一个客户端查看执行结果。

 MySQL数据库8(二十一)事务

MySQL数据库8(二十一)事务

自动事务:系统做了额外的步骤来帮助用户操作,系统是通过变量来控制的。autocommit

 MySQL数据库8(二十一)事务

关闭自动事务:关闭之后系统就不在帮助用户提交结果了。

set autocommit = off;

 MySQL数据库8(二十一)事务

查看执行结果

 MySQL数据库8(二十一)事务

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

Commit:提交(同步到数据表,事务会被清空)

Rollback:回滚(清空之前的操作,不要了)

事务没有提交的对比查看:在执行事务端的客户端中,系统在进行数据查看的时候会利用事务日志进行数据加工。

 MySQL数据库8(二十一)事务

事务提交

 MySQL数据库8(二十一)事务

通常,我们不会关闭自动事务,这样操作麻烦。因此只会在需要使用事务处理的时候,才会进行操作(手动事务)

手动事务

手动事务:不管是开始还是过程还是结束,都需要用户(程序员)手动发送对应的事务操作指令来实现。

手动事务的命令:

1、start transaction; 开启事务:从这条语句开始,后面的所有语句都不会直接写入到数据表(保存在事务日志中)

2、事务处理:多个指令构成

3、事务提交:commit/rollback,到这个时候所有的事务才算结束

开始事务

 MySQL数据库8(二十一)事务

执行事务

将多个连续的但是是一个整体的SQL指令,逐一执行。

提交事务

确认提交:commit,数据写到数据表,清空事务日志

回滚操作:rollback,所有数据无效并清空

回滚点

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

回滚点在自动事务关闭后才能使用。set autocommit = off;

1、增加回滚点:savepoint 回滚点名字; //字母数字和下划线构成

2、回到回滚点:rollback to 回滚点名字;  //那个记号(回滚点)之后的所有操作没有了

注意:如果在一个事务处理汇总,如果有很多步骤,那么可以设置多个回滚点。但是如果回到了前面的回滚点,后面的回滚点就失效。

事务特点

事务具有4个属性:原子性、一致性、隔离线持久性。这四个属性通常称为ACID特性

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做

       事务从事务开始起到事务提交,要么所有操作都成功,要么所有操作都失败。

一致性(consistency):事务必须是使数据库从一致性状态变到另一个一致性状态,一致性和原子性是密切相关的。

数据表中的数据修改,要么是所有操作一次性都修改,要么根本不动。

隔离性(isloation):

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

一个客户端在使用事务操作一个数据(可能是一行或者整表)的时候,另外一个客户端不能对该数据进行操作。

 MySQL数据库8(二十一)事务

MySQL数据库8(二十一)事务

什么时候是行被隔离?什么时候是整表被隔离?

说明:如果条件中使用了索引(主键),那么系统是根据主键直接找到某条记录,这个时候与其他记录无关,那么只隔离条记录;反之,如果说系统是通过全表检索(每一条记录都去检查,没有索引),被检索的所有数据都会被锁定(整表)

持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这