MYSQL

文章目录

  • 数据库
    • 数据库的基本组成部分包括
    • 数据库的类型包括
    • 数据库技术的发展史
  • SQL的发展史
  • MySQL
    • MySQL的特点包括:
      • RDBMS 关系数据库管理系统的特点
      • RDBMS 关系数据库管理系统的相关术语
      • MySQL 安装
      • Navicat安装
        • MySQL 创建数据库的语法
        • MySQL 创建表的语法
        • MySQL 删除表的语法
        • MySQL 插入数据的语法
        • MySQL SELECT子句的语法--查询
        • MySQL WHERE 子句的语法--条件查询
        • MySQL UPDATE 语句的语法--更新
        • MySQL DELETE 语句的语法
        • MySQL LIKE 子句的语法-- 模糊匹配
        • MySQL UNION 操作符的语法-- 合并两个或多个 SELECT 语句的结果集
        • MySQL ORDER BY 子句的语法 -- 排序
        • GROUP BY 子句的语法--分组
        • GROUP BY 子句的语法--分组
        • MySQL limit -- (分页)
    • MySQL 事务
      • 什么是事务?
        • (1)原子性
        • (2)一致性
        • (3)隔离性
        • (4)持久性
      • 事务引发的问题
        • (1)脏读(Dirty Reads)
        • (2)幻读(Phantom Reads)
        • (3)不可重复读(Non-Repeatable Reads)
        • (4)更新丢失(Lost Update)
      • 事务的隔离级别
        • (1)未授权读取(Read Uncommitted)
        • (2)授权读取(Read Committed)
        • (3)可重复读取(Repeatable Read)(mysql默认级别)
        • (4)序列化(Serializable)

数据库

数据库(Database)是一个按照数据结构来组织、存储和管理数据的仓库。它不仅存储数据本身,还存储数据之间的关系,以便于数据的检索和管理。数据库的概念是计算机科学中的一个核心概念,广泛应用于各种信息系统中,如企业资源规划(ERP)、客户关系管理(CRM)、电子商务、网站、移动应用等。

数据库的基本组成部分包括

  1. 数据模型:定义了数据的结构和数据之间的关系。常见的数据模型有层次模型、网状模型、关系模型等。关系模型是最为广泛使用的数据模型,它将数据表示为一系列的二维表(称为关系),每个表由行(记录)和列(字段)组成。
  2. 数据库管理系统(DBMS):是用于创建、维护和管理数据库的软件系统。DBMS提供了数据定义语言(DDL)、数据操作语言(DML)和数据控制语言(DCL)等工具,使得用户可以方便地定义、查询、更新和控制数据库中的数据。
  3. 数据库语言:包括SQL(结构化查询语言),它是用于与数据库进行交互的标准语言,用于数据查询、更新、插入和删除等操作。
  4. 数据库模式:定义了数据库的逻辑结构,包括数据的类型、关系、约束等。数据库模式分为三个层次:概念模式(也称为逻辑模式)、外模式(也称为子模式或视图模式)和内模式(也称为物理模式)。
  5. 数据完整性:确保数据的准确性和一致性。包括实体完整性、参照完整性、域完整性等。
  6. 数据安全性:保护数据库不受未授权访问和数据泄露的威胁。包括用户认证、权限控制、数据加密等。
  7. 数据备份与恢复:确保数据在发生故障时能够恢复,减少数据丢失的风险。

数据库的类型包括

关系型数据库:基于关系模型,使用SQL语言进行操作,如MySQL、PostgreSQL、Oracle、SQL Server等。
非关系型数据库(NoSQL):不遵循传统的关系模型,适用于处理大量、多变的数据,如文档型数据库(MongoDB)、键值存储(Redis)、列存储(Cassandra)等。
分布式数据库:数据分布在多个物理位置,通过网络连接在一起,如Google的Spanner、Amazon的DynamoDB等。
对象数据库:存储对象及其关系,如对象关系映射(ORM)技术。

数据库技术的发展史

  1. 早期数据库系统(1960年代)层次数据库:在1960年代,随着计算机技术的发展,出现了层次数据库系统,如IBM的IMS(Information Management System)。这些系统基于层次模型,数据以树状结构组织,适合处理具有明确层级关系的数据。
  2. 网状数据库(1960年代)
    网状数据库:网状数据库模型在层次数据库之后出现,它允许数据之间存在多对多的关系,比层次数据库更加灵活。代表性的网状数据库系统有CODASYL(Conference on Data Systems Languages)开发的DBTG(Data Base Task Group)模型。
  3. 关系型数据库(1970年代)
    关系模型:1970年,IBM研究员E.F. Codd提出了关系模型的概念,这是数据库技术的一个重大突破。关系模型将数据表示为表格形式,通过关系代数进行操作,为数据库的理论和实践奠定了基础。
    SQL语言:1974年,IBM的Donald Chamberlin和Ray Boyce开发了结构化查询语言(SQL),用于操作关系型数据库。SQL语言的出现极大地简化了数据库的查询和管理。
  4. 分布式数据库(1980年代)
    分布式数据库:随着网络技术的发展,数据库开始向分布式方向发展,数据可以存储在不同的地理位置,通过网络进行访问和管理。分布式数据库系统提高了数据的可用性和可靠性。
  5. 面向对象数据库(1990年代)
    面向对象数据库:随着面向对象编程语言的流行,面向对象数据库(OODBMS)开始出现。这些系统将面向对象的概念引入数据库领域,支持对象的封装、继承和多态。
  6. NoSQL数据库(2000年代)
    NoSQL数据库:随着互联网的快速发展,数据量急剧增长,传统的关系型数据库在处理大规模、高并发、分布式数据时遇到了挑战。NoSQL(Not Only SQL)数据库应运而生,它们通常不使用固定的表结构,支持水平扩展,适合处理非结构化或半结构化数据。
  7. 云数据库和大数据(2010年代)
    云数据库:随着云计算技术的发展,数据库开始向云服务模式转变,用户可以按需使用数据库服务,无需自己维护硬件和软件。
    大数据数据库:为了处理大数据,出现了专门设计的数据库系统,如Hadoop生态系统中的HBase、Cassandra等,它们能够处理PB级的数据量,并支持复杂的分析任务。
  8. 人工智能与数据库(2010年代至今)
    智能数据库:随着人工智能技术的发展,数据库系统开始集成机器学习和人工智能技术,以提高数据处理的智能化水平,如智能优化查询执行、自动化的数据管理等。
    数据库技术的发展是随着计算机技术的进步和应用需求的变化而不断演进的。未来,数据库技术将继续朝着更加智能化、分布式、云原生和大数据处理的方向发展,以满足不断增长的数据管理和分析需求。

SQL的发展史

  1. SQL的起源(1970年代)关系模型的提出:1970年,IBM研究员E.F. Codd发表了《A Relational Model of Data for Large Shared Data Banks》一文,首次提出了关系模型的概念,为SQL的诞生奠定了理论基础。
  2. SQL的标准化(1980年代)
    SQL-86:1986年,美国国家标准协会(ANSI)和国际标准化组织(ISO)发布了SQL的第一个标准版本,即SQL-86。这个版本定义了SQL的基本语法和结构,为后续的标准化工作奠定了基础。
  3. SQL的成熟(1990年代)
    SQL-92:1992年,ANSI和ISO发布了SQL-92标准,也被称为SQL2。这个版本对SQL-86进行了扩展和改进,增加了许多新的功能,如子查询、外连接、事务控制等,使得SQL更加完善和强大。
  4. SQL的扩展(2000年代)
    SQL:1999:1999年,ANSI和ISO发布了SQL:1999标准,也被称为SQL3。这个版本引入了更多高级特性,如递归查询、用户定义的数据类型、触发器等,进一步增强了SQL的表达能力和灵活性。
    SQL:2003:2003年,ANSI和ISO发布了SQL:2003标准,这个版本对SQL:1999进行了小幅度的修订和补充。
    SQL:2008:2008年,ANSI和ISO发布了SQL:2008标准,这个版本主要对SQL:2003进行了进一步的完善和标准化。
  5. SQL的现代化(2010年代至今)
    SQL:2011:2011年,ANSI和ISO发布了SQL:2011标准,这个版本对SQL语言进行了进一步的现代化,包括对XML数据的支持、窗口函数的引入等。
    SQL:2016:2016年,ANSI和ISO发布了SQL:2016标准,这个版本引入了JSON数据类型和操作,反映了现代数据处理中对非结构化数据处理的需求。
    SQL:2019:2019年,ANSI和ISO发布了SQL:2019标准,这个版本继续扩展了SQL的功能,包括对数据仓库和大数据处理的支持。

MySQL

MySQL是一个流行的开源关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,后来被Sun Microsystems公司收购,最终被Oracle公司收购。MySQL使用结构化查询语言(SQL)进行数据库管理,广泛应用于Web应用程序,如WordPress、Joomla、Drupal等。

MySQL的特点包括:

1.开源:MySQL遵循GPL(GNU通用公共许可证),这意味着用户可以免费使用、修改和分发MySQL软件。
2.高性能:MySQL设计用于处理大量数据和高并发的数据库操作,适合于Web应用。
3.跨平台:MySQL可以在多种操作系统上运行,包括Linux、Windows、Mac OS X等。
4.支持多种存储引擎:MySQL支持多种存储引擎,如InnoDB、MyISAM、Memory等,用户可以根据应用需求选择合适的存储引擎。
5.安全性:MySQL提供了多种安全特性,如用户权限管理、数据加密、SSL连接等。
6.可扩展性:MySQL支持大型数据库,可以处理大量数据和高并发请求。
7.社区支持:MySQL拥有庞大的用户和开发者社区,提供了丰富的文档和资源。
MySQL的使用非常广泛,是许多网站和应用程序的首选数据库解决方案。如果你需要进行MySQL数据库的管理、查询、优化等操作,可以使用MySQL提供的命令行工具或图形界面工具,如phpMyAdmin、MySQL Workbench等。

RDBMS 关系数据库管理系统的特点

1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

RDBMS 关系数据库管理系统的相关术语

1.数据库:数据库是一些表或者其它对象的集合。
2.数据表:表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
3.列:又称为字段。一列数据包含了相同类型的数据,例如邮政编码的数据。
4.行:又称为记录。一行数据是一组相关的数据,例如一条用户订阅的数据。
5.冗余:存储多份数据,冗余虽然浪费了空间,降低了性能,但提高了数据的安全性。
6.主键:一个数据表中只能包含一个主键。表中每一行数据(一条记录)的主键是唯一的,你可以使用主键来查询数据。
7.外键:外键用于关联两个表。其中一个表A的字段取之于表B的主键,那么B的主键称为A的外键。
8.复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
9.索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
10.参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

MySQL 安装

MySQL 官网地址为:地址
下载地址为:MySQL 下载 。挑选你需要的 MySQL Community Server 版本及对应的平台。

MYSQL_第1张图片
这里我们使用已经下载好的低版本 mysql-5.6.37-winx64
下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 D:\mysql-5.6.37-winx64
接下来我们需要配置下 MySQL 的配置文件
打开刚刚解压的文件夹D:\mysql-5.6.37-winx64 ,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信 息:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

[mysqld]
#设置3306端口
port=3306
#设置mysql的安装目录(存放地址可以更改)
basedir=D:\mysql
#设置mysql数据库的数据的存放目录(存放地址可以更改)
datadir=D:\mysql
#允许最大连接数
max_connections=200
#允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]

#设置mysql客户端默认字符集
default-character-set=utf8
[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
innodb_force_recovery = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

接下来我们来启动下 MySQL 数据库:
以管理员身份打开 cmd 命令行工具,切换目录:

cd D:\mysql-5.6.37-winx64 \bin

初始化数据库:

mysqld --initialize --console

执行完成后,会输出 root 用户的初始默认密码,如:A temporary password is generated for root@localhost: APWCY5ws&hjQ
APWCY5ws&hjQ 就是初始密码,后续登录需要用到,你也可以在登陆后修改密码。
输入以下安装命令:

 mysqld install

启动输入以下命令即可:

 net start mysql

注意: 在 5.7 需要初始化 data 目录:

cd D:\mysql-5.6.37-winx64 \bin
mysqld --initialize-insecure

初始化后再运行

net start mysql 

即可启动 mysql。
. 登录 MySQL

 mysql -h 主机名 -u 用户名 -p

-h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
-u : 登录的用户名;
-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

mysql -u root -p

指令 USE 数据库名 :

 use wzry;

列出 MySQL 数据库管理系统的数据库列表。

 SHOW DATABASES:

显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。

SHOW TABLES:

可视化根据 使用客户端 Navicat 连接登录 MySQL
创建 MySQL 数据库的语法

CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校对规则名>];

mysqladmin -u root -p create wzrydata

使用 drop 命令删除数据库

drop database <数据库名>;

MySQL 数据类型
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT1 byte (-128,127) (0,255) 小整数值
SMALLINT2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0, (1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

Navicat安装

navicat是一款强大的数据库可视化操作工具,支持各种不同的数据库,支持不同的平台。
官网地址:地址
文档地址:地址
navicat安装

navicat premium 16 科学安装版本下载地址:		https://pan.baidu.com/s/1xg5dJcaqv6cTw_opWJG9AQ?		pwd=8888
MySQL 创建数据库的语法
CREATE DATABASE `wzry` CHARACTER SET 'armscii8' COLLATE 'armscii8_general_ci';
MySQL 创建表的语法
 CREATE TABLE table_name (column_name column_type);
CREATE TABLE `hero` (
  `id` int(11) NOT NULL COMMENT '主键',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `hurt` float DEFAULT NULL COMMENT '伤害',
  `hp` float DEFAULT NULL COMMENT '血量',
  `armor` float DEFAULT NULL COMMENT '护甲',
  `moveSpeed` int(11) DEFAULT NULL COMMENT '移动速度',
  `death` int(11) DEFAULT NULL COMMENT '死亡数量',
  `kill` int(11) DEFAULT NULL COMMENT '击杀数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=armscii8;

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主键',
  `hero_id` int(20) DEFAULT NULL COMMENT '英雄id',
  `name` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
  `phone` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '手机号',
  `sex` varchar(2) COLLATE utf8_bin DEFAULT NULL COMMENT '性别',
  `id_number` varchar(18) COLLATE utf8_bin DEFAULT NULL COMMENT '身份证号',
  `avatar` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '头像',
  `status` int(11) DEFAULT '0' COMMENT '状态 0:禁用,1:正常',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPACT COMMENT='用户信息';
MySQL 删除表的语法
DROP TABLE table_name ;
DROP TABLE hero;
MySQL 插入数据的语法
INSERT INTO `wzry`.`hero`(`id`, `name`, `hurt`, `hp`, `armor`, `moveSpeed`, `death`, `kill`) VALUES (1, '鲁班', 1, 1, 1, 1, 1, 1);
INSERT INTO `wzry`.`user`(`id`, `hero_id`, `name`, `phone`, `sex`, `id_number`, `avatar`, `status`) VALUES (1, 1, '狂魔哥', '13112345678', NULL, NULL, NULL, 1);
INSERT INTO `wzry`.`user`(`id`, `hero_id`, `name`, `phone`, `sex`, `id_number`, `avatar`, `status`) VALUES (2, 2, '吕德华', '13812345678', NULL, NULL, NULL, 1);
MySQL SELECT子句的语法–查询
SELECT * FROM `wzry`.`hero`
MySQL WHERE 子句的语法–条件查询
SELECT * from hero WHERE id ='1';
MySQL UPDATE 语句的语法–更新
UPDATE hero SET hurt='100' WHERE id=1;
MySQL DELETE 语句的语法
DELETE FROM hero WHERE id=1;
MySQL LIKE 子句的语法-- 模糊匹配
SELECT * from hero  WHERE name LIKE '%鲁班';

SELECT * from hero  WHERE name LIKE '%鲁班%';
MySQL UNION 操作符的语法-- 合并两个或多个 SELECT 语句的结果集
SELECT name FROM hero
UNION
SELECT name FROM user
ORDER BY name;
MySQL ORDER BY 子句的语法 – 排序
SELECT * from hero ORDER BY name ASC;
GROUP BY 子句的语法–分组
SELECT name, COUNT(*) FROM hero GROUP BY name;

####MySQL INNER JOIN – (内连接,或等值连接)

GROUP BY 子句的语法–分组
SELECT a.id, a.name ,b.name as heroName FROM user a INNER JOIN hero b ON a.hero_id = b.id;
MySQL limit – (分页)
-- 使用limit做分页 0 = (当前页 - 1) * 每页显示条数 
select * from hero limit 0,4;

MySQL 事务

什么是事务?

MySQL 数据库中的事务是用户一系列的数据库操作,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

(1)原子性

一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

(2)一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

(3)隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

(4)持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务引发的问题

(1)脏读(Dirty Reads)

事务A读取到了事务B已经修改但尚未提交的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。

(2)幻读(Phantom Reads)

事务A读取到了事务B提交的新增数据,不符合隔离性。

(3)不可重复读(Non-Repeatable Reads)

事务A读取到了事务B已经提交的修改数据,不符合隔离性。

(4)更新丢失(Lost Update)

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新。

事务的隔离级别

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。

(1)未授权读取(Read Uncommitted)

也称为读未提交(Read Uncommitted):会引发脏读取、不可重复读和虚读,但避免了更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

(2)授权读取(Read Committed)

也称为读提交(Read Committed):会引发不可重复读取和虚读,但避免脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

(3)可重复读取(Repeatable Read)(mysql默认级别)

可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据和虚读。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

(4)序列化(Serializable)

序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

你可能感兴趣的:(java学习,java,mysql,开发语言)