1.安装下载
关于MySQL的安装与配置在之前的博客已经发表过文章了,具体详情请看:
2.用户管理
三种权限,三个环境
在这里和大家分享一下我们一般的在公司中的实际操作人员会分为哪些权限才能够保证我们数据的安全性以及公司的利益:
1、项目经理: 数据库而言:增删改查,Create、drop等权限,一般具备所有权限
2、项目组长: 数据库而言:只具备增删改查
3、开发人员:数据库而言:查询(select)
一般来说会分为这三种开发人员分为三种不同的操作权限
对于实际我们的操作人员来说,三个环境
线网、生产环境:系统开发完毕,客户使用的那个环境
测试环境:公司内部模拟客户现场,搭建而成的环境
开发环境:本地电脑
不同的权限的划分,针对的是生产环境
3.MySQL数据库引擎
★★★MySQl的核心就是数据库引擎★★★
3.1定义
★★MySQL数据库引擎是指存储和管理数据的核心组件,它决定了如何组织、存储和操作数据库中的数据。MySQL支持多种数据库引擎,每个引擎都有自己的特点和适用场景。★★
以下是几种常见的MySQL数据库引擎:
- ★InnoDB引擎★:InnoDB是MySQL默认的事务型引擎,它支持事务、行级锁和外键约束等特性,适合处理并发读写操作和大量的事务处理。InnoDB引擎还提供了崩溃恢复和数据完整性的保护机制。
- ★MyISAM引擎★:MyISAM是MySQL最早的数据库引擎,它不支持事务和行级锁,但在处理大量读操作时性能较高。MyISAM引擎适用于读密集型应用,例如数据仓库、日志记录等。
- Memory引擎:Memory引擎(也叫作Heap引擎)将数据存储在内存中,因此读写速度非常快。但是,由于数据存储在内存中,一旦MySQL服务器关闭,数据将丢失。Memory引擎适用于临时表、缓存和计数器等场景。
- Archive引擎:Archive引擎用于存储和查询大量的归档数据,它采用高度压缩的存储格式,具有极高的写入性能和较低的存储空间需求,但查询性能相对较低。
除了上述引擎之外,MySQL还支持其他引擎如CSV引擎、Blackhole引擎等。根据应用的需求和特点,选择合适的数据库引擎对于实现高性能和数据一致性非常重要。
下面是我navicat下的引擎列表以及是否支持引擎的状态:
然后Support右边则是描述,比如支持事务,回滚,外键等......
InnoDB是事务型数据的首选引擎,支持事务安全表(ACID),支持锁定和外键。InnoDB是默认的MySQL引擎。
3.2ACID事务
ACID是指数据库事务的四个基本特性,它们分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些特性确保了数据库事务的正确性和可靠性。
- ★原子性(Atomicity)★:原子性要求一个事务中的所有操作要么全部执行成功,要么全部不执行,即是一个不可分割的操作单元。如果事务执行过程中发生错误,系统会将事务中的所有修改操作全部回滚,使数据保持一致状态。
- ★一致性(Consistency)★:一致性确保了在事务开始和结束时数据的完整性和一致性。事务执行前后,数据库必须处于一致的状态,即满足事先定义的完整性约束条件。
- ★隔离性(Isolation)★:隔离性指在多个事务并发执行时,每个事务都应该感受不到其他事务的存在。每个事务的操作都应该像是在独立运行,给用户带来了一种串行执行的错觉。通过隔离性,可以避免并发事务执行时出现各种数据并发问题(如脏读、不可重复读、幻读)。
- ★持久性(Durability)★:持久性指一旦事务提交成功,其所做的修改将被永久保存在数据库中,即使在系统发生故障或重启时也能够恢复。数据库通过将事务的操作记录到日志文件中,保证了数据的持久性。
ACID事务保证了数据库操作的一致性和可靠性,使得多个并发事务能够协同工作而不会产生数据冲突或错误。开发人员可以依靠ACID属性来设计和实现可靠的数据库应用程序。然而,ACID事务的强一致性和隔离性也可能会对性能产生一定的影响,因此在实际应用中需要权衡事务的粒度和性能需求。
3.3四种隔离级别
在MySQL中,有四种常见的隔离级别,用于控制并发事务的隔离程度。这些隔离级别是:
- 读未提交(Read Uncommitted):最低的隔离级别,事务可以读取其他事务未提交的数据,可能导致脏读(Dirty Read)问题,即读到了未提交事务的数据。
- 读提交(Read Committed):事务只能读取已经提交的数据,解决了脏读问题。但是,由于其他事务可能会在当前事务中查询之前提交,所以会出现不可重复读(Non-repeatable Read)问题,即在同一事务中,多次查询同一数据,结果可能不一致。
- 可重复读(Repeatable Read):MySQL的默认隔离级别。保证在同一事务中多次读取同一个数据时,结果始终一致。其他事务的插入、更新操作在当前事务结束前不可见,避免了不可重复读问题。但是,仍然存在幻读(Phantom Read)问题,即在同一事务中多次查询同一条件的记录,结果可能不一致。
- 串行化(Serializable):最高的隔离级别,使用了悲观并发控制,对数据进行加锁,确保事务之间完全隔离,避免了脏读、不可重复读、幻读的问题。但是,由于锁竞争可能导致性能下降,并发性较低。
可以使用以下语句设置隔离级别:
SET TRANSACTION ISOLATION LEVEL <隔离级别>;
需要根据具体的业务需求和并发情况选择合适的隔离级别,权衡事务的隔离程度和性能要求。
3.4何为脏读,幻读和不可重复读
在MySQL中,脏读(Dirty Read)、幻读(Phantom Read)和不可重复读(Non-repeatable Read)是指在并发事务中可能出现的数据访问问题。
- 脏读(Dirty Read):脏读是指一个事务读取了另一个事务未提交的数据。当一个事务读取到另一个事务尚未提交的数据时,如果这个事务最终回滚,那么读取到的数据就是无效的(脏数据)。脏读可能会导致事务读取到不一致、不正确的数据。
- 幻读(Phantom Read):幻读是指在同一事务的两次查询中,由于其他事务插入或删除了符合第一次查询条件的数据,导致第二次查询返回不同的结果集。幻读一般发生在并发事务中的插入和删除操作,破坏了事务之间的一致性。
- 不可重复读(Non-repeatable Read):不可重复读是指在同一事务中,多次读取同一个数据,在多次读取之间,其他事务修改或删除了该数据,导致多次读取的结果不一致。不可重复读一般发生在并发事务中的更新操作,破坏了事务内部的一致性。
为了能让大家更加理解。下面是对脏读、幻读和不可重复读问题的图解说明:
假设有两个事务:事务A和事务B。
- 脏读(Dirty Read):
事务A: ------------- | 读取数据X | ------------- 事务B: -------------- | 修改数据X | -------------- 事务B修改了数据X,但还没有提交。 此时,事务A读取到了事务B未提交的数据X,即脏读。
- 幻读(Phantom Read):
事务A: ----------------- | 查询条件1的数据 | ----------------- 事务B: --------------------- | 插入符合条件1的数据 | --------------------- 事务A继续查询条件1的数据,发现有新插入的数据,导致结果集发生变化。此时,就发生了幻读。
- 不可重复读(Non-repeatable Read):
事务A: ----------------- | 读取数据X | ----------------- 事务B: -------------- | 修改数据X | -------------- 事务B修改了数据X,但还没有提交。 事务A再次读取相同的数据X,发现数据发生了变化。此时,就发生了不可重复读。
上述示例说明了脏读、幻读和不可重复读在并发事务中的情况。为了避免这些问题,可以通过设置合适的隔离级别来控制并发事务之间的数据访问和操作。
4.数据库授权
在进行新增用户以及后面的一系列操作之前我们需要查看一下我们的数据库版本,因为版本不同,语句也可能发生改变。博主这边的是8.0版本的。如下:
4.1新增用户
新增一个用户的步骤如下:
新增用户,只有mybatis_ssm的使用权限(组长权限):
1.创建用户
2.用户设置密码
3.用户要赋权
4.删除用户
5.增加权限
6.收回部分权限
4.1.1创建用户
CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]
结果如下:
我们在创建完后测试连接,如下:
可以看到我们列表里已经有了’zuzhang‘,如下:
4.1.2赋权用户
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user[IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option]...]
如下:
执行之后的效果:
成功赋权。
4.1.3收回权限
语法如下:
REVOKE priv_type [(column_list)]... ON database.table FROM user [, user]...
代码如下:
执行之后的效果:
4.1.4删除用户
语法如下:
DROP USER <用户1> [ , <用户2> ]…
代码如下:
效果图:
ok列表里找不到我们的zuzhang用户了。
最后MySQL的基本使用就到这里,祝大家在敲代码的路上一路通畅!