MySQL事务,视图,用户管理学习笔记【事务概念 | 事务隔离级别 | 设置级别 | 视图 | 用户管理】

   博客主页:花果山~程序猿-CSDN博客

文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客

关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!

在这里插入图片描述

目录

一,事务初识

二,支持事务的引擎

三,事务的提交方式

自动提交

手动提交

四,事务隔离级别

读未提交

读已提交

可重复读

穿行化

查看并设置隔离级别

设置隔离级别

五,视图

创建视图

其他规则

删除视图


嗨!收到一张超美的图,愿你每天都能顺心!

一,事务初识

        在MySQL中,事务(Transaction)是一个非常重要的概念,它用于保证数据的一致性和完整性。事务可以看作是一组操作的集合,这些操作要么全部成功执行,要么全部不执行,是一个不可分割的工作单位。这四个特性通常被总结为ACID原则:

1. 原子性(Atomicity):事务中的所有操作被视为一个整体,不可分割。事务的所有改变要么全部完成,要么全部不起作用。
2. 一致性(Consistency):事务执行前后,数据库从一个一致状态转换到另一个一致状态。也就是说,事务应该保证数据库的完整性约束不被破坏。
3. 隔离性(Isolation):多个事务并发执行时,彼此之间不应互相影响。一个事务内部的操作对其他事务是隔离的,直到该事务完成并提交。
4. 持久性(Durability):一旦事务提交,其结果就是永久性的,即使系统发生故障也不会丢失。

### 例子

假设有一个银行转账的场景,张三需要向李四转账100元。这个过程可以分为两个关键的数据库操作:

1. 从张三的账户中减去100元。
2. 给李四的账户加上100元。

如果不使用事务,这两个操作可能会因为某种原因(比如系统崩溃、网络问题)而只完成其中一个,导致数据不一致(比如张三的钱减少了,但李四的钱没有增加)。

使用事务处理这个问题的方式如下:

start transaction;  --也可以使用 begin

savepoint s1; --创建保存点s1
-- 操作1: 从张三账户减去100元
UPDATE accounts SET balance = balance - 100 WHERE user = '张三';

savepoint s2; --创建保存点2;
-- 操作2: 给李四账户加上100元
UPDATE accounts SET balance = balance + 100 WHERE user = '李四';
commit;

在这个例子中,start transaction / begin 开始一个新的事务,然后执行两个更新操作,最后用 commit 提交事务。

如果在执行这两个操作的过程中发生了错误,可以通过rollback命令回滚事务

rollback to s1;

撤销所有已经执行的操作,确保数据的一致性。

二,支持事务的引擎

mysql并不是所有引擎都支持事务,可以通过下面指令来查看引擎信息:

show engines;

三,事务的提交方式

自动提交

        我们可以通过下面指令来查看事务提交方式状态

show variables like 'autocommit';

当然我们也可以手动关闭set   autocommit=0;  --打开=1

手动提交

        情况一:当我们autocommit关闭后,每次完成一条mysql语句的输入,这时需要我们手动commit,否则一旦进程退出,或者网络崩溃数据就会回滚。

        情况二:一旦手动使用 start  transaction /  begine ,就必须手动使用commit手动提交

我们需要知道曾经我们在mysql指令上本质上就是一条条开了自动提交的事务

四,事务隔离级别

        mysql服务端会面临同一份数据库,多个客户端并发的读写这时,我们就需要考虑数据如何安全的处理。在MySQL中,事务的隔离级别决定了一个事务在处理数据时能够看到其他事务修改数据的程度,这直接影响到事务并发性能数据的一致性。事务的隔离级别主要有四种:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。下面通过例子来解释这些概念:

读未提交

在这个隔离级别下,一个事务可以读取另一个事务尚未提交的数据。这种情况下容易出现“脏读”现象。

例子

  • 事务A开始,并更新了一条记录但未提交。
  • 事务B开始,并读取了事务A更新但未提交的记录。
  • 事务A决定回滚,之前更新的内容被撤销。
  • 这时,事务B读取的就是无效的数据,即所谓的“脏读”。

读已提交

在此级别,事务只能读取已经提交的变更。避免了脏读,但可能出现不可重复读。

例子

  • 事务A读取了一条记录。
  • 事务B开始,更新了这条记录并提交。
  • 在事务A中,再次读取同一条记录,会发现数据已经改变,即使它自己没有做任何修改。这就是不可重复读

可重复读

这是MySQL的默认事务隔离级别。在这个级别下,同一个事务内多次读取同一数据结果是一致的,不会受到其他事务的影响。但可能会遇到幻读现象。

例子

  • 事务A开始,查询出所有状态为 'available' 的商品。
  • 事务B开始,将其中一个商品的状态改为 'sold' 并提交。
  • 事务A(在一个事务中)再次查询相同条件的商品列表,结果集仍然包含那个已被B修改状态的商品,仿佛B的修改从未发生过,实现了重复读的特性。但是,如果A尝试根据ID单独查询那个商品的状态(或者结束A事务后查询商品时),会发现状态已经变为'sold',这种差异可能引起幻读。

穿行化

        这是最严格的隔离级别(公司一般都不会使用该级别,效率太低了),通过完全序列化事务的执行来避免所有的并发问题。实际上,这意味着事务会按照一定的顺序依次执行,而不是并发执行。

例子

  • 假设有两个事务T1和T2,都试图修改同一条记录。
  • 在串行化隔离级别下,T1先开始执行,T2必须等待T1完成(包括提交或回滚)后才能开始执行。
  • 这样彻底避免了脏读、不可重复读和幻读的问题,但牺牲了并发性能。

查看并设置隔离级别

查看:

select @@global.tx_isolation;  --查看全局隔离级别,同时也是客户端的默认级别
select @@session.tx_isolation; --当前mysql会话(登录)级别
select @@tx_isolation;         --当前会话级别

 区别:

tx_isolationsession_tx_isolation 控制的是单个数据库连接(会话)的事务隔离行为,而 global_tx_isolation 则影响服务器层面,控制新创建会话的默认事务隔离级别。前者是局部作用域,后者是全局作用域。

设置隔离级别

语法:

set [SESSION | GLOBAL] transaction isolation level  {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

如以下例子: 

set session transaction isolation level serializable;

五,视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 (学习目标是认识一下,一般的大型公司对于数据库的操作有着严格的限制,一般不会开放)

知道基表,与虚拟表什么意思即可。

基表:原始的数据表

虚拟表: 创建产生的视图

创建视图

create   view  view_name   as   select ....

案例:

那基表与虚拟表是否有联系呢?

答:通过上面这张图,我们可以知道视图(虚拟表),只有表结构文件(.frm),并没有数据文件(.ibd)我们不难猜测,基表与虚拟表共享数据,事实也是如此。如果我们修改内容,基表与虚拟表信息也将改变。

其他规则

与表一样,必须唯一命名(不能出现同名视图或表名)
创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响(as 后面的select 效率需要考虑)
视图不能添加索引,也不能有关联的触发器或者默认值
视图可以提高安全性,必须具有足够的访问权限(但是一般公司不开放
order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by , 那么该视图中的order by 将被覆盖(就近原则
视图可以和表一起使用(支持内连接,多表查询

删除视图

drop  view  视图名;

六,用户管理 

      mysql是一款网络服务,有客户端,服务端,是一对多的情况,每一个客户有着自己的资源,也不希望别的客户对自己的资源进行随意的访问,修改,删除那么作为服务端就要对用户进行权限的管理。

我们知道曾经是通过免密进入mysql,那mysql的账号是在哪儿?

在root下,进入mysql库,后找到user表即可,这里我们需要先了解这三个数据:userhost(登录的主机)authentication_string(经过哈希加密的密码)

创建新用户

create user  '用户名'@'登录主机' identified by '密码';

create user 'afeng_test'@'localhost' identified by '210764';

注:1. 登录主机,localhost等价于127.0.0.1,外网想连接的化一般指定主机IP或者是极不推荐的'%'表示任意IP,因为数据库都是公司内网用的不会端口暴露给外网。

           2.我们可以知道user本质上是表结构,完全是可通过表的insert into 进行创建,只是填参数填的有些费劲。 

           3. 如果设置了免密登录,我们是无法创建用户的,一般需要我们通过root登录,才能创建新用户)

删除用户

drop   user   '用户名'@'主机IP';

修改密码

用户修改自己密码

 set password=password('新的密码');

root修改用户密码 

方法一:set password for ' 用户名 ' @ ' 主机名 ' =password( ' 新的密码 ' )

 方法二:update user  set   authentication_string=password('密码')where  user='用户名';

(修改完后别忘记重启)

对用户权限管理

下面是mysql提供的权限列表:

增加权限(同时创个号)

语法: 

grant 权限名1, 权限名2... on  .对象名  to  '用户名'@'登陆位置'   [identified by  '密码'];

identified by 可选。 如果用户存在,赋予权限的同时修改密码 , 如果该用户不存在,就是创建用户

如:

grant select on ...
grant select, delete, update ...
grant all privileges on --权限全部添加
grant ... on '*' ...  --代表本系统中的所有数据库 + 所有对象
grant ... on '库.*' ... --代表本系统中某个库的所有对象

回收权限

revoke 权限1,权限2  on   . 对象名    from   ' 用户名 '@' 登陆位置 '

如:

revoke all privileges on ...  --回收全部权限

最后刷新权限

flush privileges; 

如何设置mysqld初始密码

首先我们是通过设置了免密登录的,查看mysql配置文件.

vim  /etc/my.cnf

我们会看到我们安装时,添加的免密登录配置:

然后进入 mysql库中,找到里面的user表,然后修改root用户的密码。

updata user set authentication_string=password('密码') where user='root';

成功后退出mysql,然后回到配置文件中,将免密登录代码关闭,接着重启mysqld。

systemctl restart mysqld;

用我们刚才设置的密码登录后,我们可以使用 一下指令 show  databases;

如果出现这样的情况:

通过生成的临时密码登录后操作mysql时会报如下错误 

 解决方法:

1.alter user 'root'@'localhost' identified by '123'; 
2.或set password for 'root'@'localhost'=password('123');
3.旧sql版本: set password=password('密码');

 如果密码过于简单,会报以下错误:

修改好后,我们退出重新登录mysql即可

结语

   本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获,请动动你发财的小手点个免费的赞,你的点赞和关注永远是博主创作的动力源泉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

109.网络游戏逆向分析与漏洞攻防-装备系统数据分析-商店与捨取窗口数据的处理

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包…

使用 Scapy 库编写 TCP ACK 洪水攻击脚本

一、介绍 TCP ACK洪水攻击是一种分布式拒绝服务攻击(DDoS),攻击者通过向目标服务器发送大量伪造的TCP ACK(确认)数据包,使目标服务器不堪重负,无法正常处理合法请求。虽然ACK包通常用于确认接收…

【上海大学计算机组成原理实验报告】七、程序转移机制

一、实验目的 学习实现程序转移的硬件机制。 掌握堆栈寄存器的使用。 二、实验原理 根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当LDPC有效时,如果此时DUBS上的值就是转移的目标地址,则此目标地址被打入PC&am…

【数据分析基础】实验三 文件操作、数组与矩阵运算

一.实验目的 掌握上下文管理语句with的使用方法。掌握文本文件的操作方法。了解os、os.path模块的使用。掌握扩展库Python-docx、openpyxl的安装与操作word、Excel文件内容的方法。熟练掌握numpy数组相关运算和简单应用。熟练使用numpy创建矩阵,熟悉常用…

Python | Leetcode Python题解之第135题分发糖果

题目: 题解: class Solution:def candy(self, ratings: List[int]) -> int:n len(ratings)ret 1inc, dec, pre 1, 0, 1for i in range(1, n):if ratings[i] > ratings[i - 1]:dec 0pre (1 if ratings[i] ratings[i - 1] else pre 1)ret p…

27-LINUX--I/O复用-poll

一.poll概述 poll是一个多路复用的I/O模型&#xff0c;一个进程监视多个文件描述符&#xff0c;当文件描述符就绪时&#xff0c;poll返回可读并做相应处理。 1.poll的模型 #include <poll.h>struct pollfd {int fd; //文件描述符short events; //事件类型 s…

codesys【CAN总线】

1下载设备描述文件&#xff1a; 必须下载设备描述文件&#xff0c;要不然编程软件无法正确组态。 根据实际设备【品牌】去官网搜索下载。 以 DMA882-CAN 为例 CAN的设备描述文件是【.eds】的扩展名 安装设备描述文件。 2添加CAN总线&#xff1a; 1添加【CAN总线】&#xff1a…

Chroium 源码目录结构分析(1):源码目录体积一栏

获取源码 首先&#xff0c;我们拉一份最新的源代码&#xff08;笔者是2024.6.6日拉取的&#xff09;&#xff1a; fetch --nohistory chromium 源码预处理 如果运行build&#xff0c;会生成许多生成的代码&#xff0c;因此我们不运行build。 然后&#xff0c;把干扰后续分析…

Map深度学习

Map Map是一个键值对的集合&#xff0c;和object类似&#xff0c;Map作为构造函数&#xff0c;可以通过全局对象获取到。需要通过new操作创建实例对象&#xff0c;直接调用会报错。Map构造函数接受一个iterable类型的函数&#xff0c;用来初始化Map。 var m new Map([[1, &qu…

centos7安装字体

1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体&#xff08;注意权限问题&#xff09; 进入目录 /usr/share/fonts &#xff0c;该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp &#xff08;名字…

理解我的积木编程思想

1 学习教程&#xff0c;至少7139手册2 编程实践&#xff0c;遇到实际问题后&#xff0c;在技术资料中查找关键词3 选择适合的条目找到代 码。修正&#xff0c;组合。

封装了一个简单理解的iOS竖直文字轮播

效果图 原理 就是持有两个视图&#xff0c;并且两个视图同时改变origin.y 动画结束之后&#xff0c;判断哪个视图是在上面并且看不到的&#xff0c; 则将该视图移动到底部&#xff0c;并且该视图展示下一跳内容 在开始下一轮动画 代码 - (void)startAnimationWithDuration:(…

若依项目部署(Linux2.0)

解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 配置Java环境变量&#xff1a; vim /etc/profile export JAVA_HOME/root/soft/jdk1.8.0_151 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/bin:$PATH 设置环境…

WordPress 高级缓存插件 W3 Total Cache Pro 详细配置教程

说起来有关 WordPress 缓存插件明月已经发表过不少文章了,但有关 W3 Total Cache Pro 这个 WordPress 高级缓存插件除了早期【网站缓存插件 W3 Total Cache,适合自己的才是最好的!】一文后就很少再提及了,最近因为明月另一个网站【玉满斋】因为某些性能上的需要准备更换缓存…

MySQL基础---库的操作和表的操作(配着自己的实操图,简单易上手)

绪论​ 勿问成功的秘诀为何&#xff0c;且尽全力做您应该做的事吧。–美华纳&#xff1b;本章是MySQL的第二章&#xff0c;本章主要写道MySQL中库和表的增删查改以及对库和表的备份处理&#xff0c;本章是基于上一章所写若没安装mysql可以查看Linux下搭建mysql软件及登录和基本…

解密Spring Boot:深入理解条件装配与条件注解

文章目录 一、条件装配概述1.1 条件装配的基本原理1.2 条件装配的作用 二、常用注解2.1 ConditionalOnClass2.2 ConditionalOnBean2.3 ConditionalOnProperty2.4 ConditionalOnExpression2.5 ConditionalOnMissingBean 三、条件装配的实现原理四、实际案例 一、条件装配概述 1…

办公风云颜值背后的职场正能量

办公风云&#xff1a;颜值背后的职场正能量当我们提到职场&#xff0c;脑海中浮现的往往是严肃的面孔、忙碌的身影和堆积如山的文件。但在这个看似单调的舞台上&#xff0c;总有一些人&#xff0c;用他们的颜值和才华&#xff0c;为我们上演了一场场别开生面的“大戏”。今天&a…

68. UE5 RPG 处理多个角色后续bug

我们现在已经有了四个敌人角色&#xff0c;接下来&#xff0c;处理一下在战斗中遇到的问题。 处理角色死亡后还会攻击的问题 因为我们有角色溶解的效果&#xff0c;角色在死亡以后的5秒钟才会被销毁掉。所以在这五秒钟之内&#xff0c;角色其实还是会攻击。主要时因为AI行为树…

Gh-ost让MySQL在线表结构变更不再是难题

Gh-ost&#xff1a;无缝迁移&#xff0c;效率与安全并行- 精选真开源&#xff0c;释放新价值。 概览 gh-ost是由GitHub团队精心打造的在线MySQL表结构迁移工具&#xff0c;它以一种无需触发器的方式&#xff0c;实现了对数据库表结构变更的在线操作。gh-ost的设计初衷是解决现…

NetSuite精益实施 之 系统切换作业标准化

这个题目为近日所思&#xff0c;一直没有落笔。今天是端午假日&#xff0c;得空卸货。 标准化是精益实施的三个基础之一&#xff0c;在我们的项目实践中没有须臾忘记。在此我们不再赘述标准化为啥这么重要&#xff0c;更多来分享如何标准化。 在项目实施的各阶段中&#xff0…