大家肯定都打过游戏,对于一个游戏通关来说,通了就是通了,没通就是没通。
那对于事务来讲,一组SQL
语句全部执行成功才是成功,只要有一个SQL
语句执行失败,整个就崩掉了。
1)事务的概念
2)事务的特性
3)事务的隔离级别
4)锁
5)一些事务相关的SQL
语句
6)MySQL
中常使用的引擎
1、什么是事务
事务是有一条或者是多条对数据库操作的SQL组成的一个不可分割的单元,
只有当事务中的所有的操作都正常执行时,整个事务才提交给数据库
1)事务是一组SQL语句的执行,要么全部执行成功,要么全部执行失败,
不能出现部分成功和失败,保证原子操作
2)事务中所有的数据执行成功,才能提交(commit
)事务,把结果写入磁盘
3)事务在执行过程中,有的SQL出现了错误,那么事务必须回滚(rollback
)
到最初的状态
当一个事务正确提交后,那个值才会刷新到磁盘上。
2、事务的一些性质
事务的ACID特征:
一个事务必须满足以下4个特征:
A(Atomic):原子性
事务是一个不可分割的整体,事务必须具有原子特性,当数据发生变更时,要么全部成功,要么全部失败,不存在部分成功和失败
通关与未通关
C(Consistency):一致性
一个事务的执行前后,数据库中的数据必须保持一致性的特征。
I(Isolation):隔离性
当两个或者多个事务进行并发操作时,为了保证数据的安全性,将一个事务的内部操作与其他的事务隔离起来,不被其他正在执行的事务所看到。
在实际使用过程中,隔离级别使用不当会造成脏数据的问题。
D(Durability):持久性
事务执行完成后,数据库保证修改是永久性的,即使数据库发生故障,故障排除后也能恢复数据。
3、事务的隔离级别
事务的隔离级别:
事务处理隔离级别使用不当,会引起以下问题:
脏读(Dirty Dead): 一个事务读取了另一个事务未提交的数据
例:当事务A和事务B并发执行时,当事务A更新后,事务B读取到事务A
尚未提交的数据,此时事务A回滚,则事务B读取到则是无效的脏数据
(事务B读取到事务A尚未提交的数据)
不可重复读(NonRepeatable Read): 一个事务的操作导致
另一个事务前后两次读取到不同的数据
例:当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作并更改事务读到的数据,此时事务B再次去读该数据,发现前后两次读取的数据不一致
(事务B读取事务A已提交的数据)
幻(虚)读(Phantom Read): 一个事务的操作导致另一个事务前后两次查询的结果数据量不同
例:当事务A和事务B并发执行时,当事务B插叙读取数据后,事务A新增或者删除了
一条满足事务B查询要求的数据,此时事务B再次去读数据,发现查询到的前一次不存在的记录,或者查询的数据不见了(事务B读取到了事务A新增或者删除的数据)
MySQL中存在的隔离级别:
1)Transaction_Read_Uncommitted
:未提交读
说明在提交前一个事务可以看到另一个事务的变化,会有脏读,不可重复读,虚读都会存在
2)Transaction_Read_committed
:已提交读
说明在提交之前的数据其他事务是不允许看到。不可重复读和虚读的问题还是会存在
3)Transaction_Repeatable_Read
:可重复读
保证能够再次读取相同的数据而不会失败。虚读还是会存在
4)Transaction_Serializable
:可序列化/串行化
是最高的事务隔离级别,他能够防止脏读、不可重复读、幻读的问题
隔离级别 | 脏读 | 不可重复读 | 幻读
未提交读 | 可以 | 可以 | 可以
已提交读 | 不可以 | 可以 | 可以
可重复读 | 不可以 | 不可以 | 可以
串性化 | 不可以 | 不可以 | 不可以
注意:事务隔离级别越高,为避免冲突所花费的性能也就越多
事务并不是越高越好
4、MySQL
中锁的一些概念
MySQL
的默认引擎是InnodB
引擎
1)InnodB行锁:
InnodB支持事务,支持外键,重要的是支持行级锁(同时支持行锁和表锁,默认使用行锁),并发程度高
InnodB实现两种类型的行锁:
共享锁(S):允许一个事务去读一行,阻止其他的事务获取相同的数据集的排他锁。
排它锁(X):允许获得排他锁的事务更新数据,阻止其他事务获取相同数据集的共享读锁和排他写锁
InnodB中行锁是通过给索引上的索引项加锁实现的,而不是给表中的行记录加锁
意味着,如果表中的行不存在索引,InnodB使用表锁
2)Myisam表锁:
Myisam存储存储引擎支持表锁,不支持事务处理,不支持外键
Myisam并发比较简单,只支持表锁粒度,锁的粒度比较大
并发能力,但是不会引起死锁,它支持表共享的读锁和表互斥的写锁
对Myisam表的读操作,不会阻塞其他用户对同一张表的读操作,但是会阻塞其他用户
对同一张表的写操作
对Myisam表的写操作,则会阻塞其他用户对同一个表的读和写操作
Myisam的读与写之间互斥,写与写之间互斥,读与读之间共享
表锁和行锁的特点:
表锁:开销小、加锁快、不会出现死锁、锁粒度比较大、发生锁冲突的概率是比较高的,并发程度低
开销小,要加锁的时候只需要看这张表加没加锁;
不会出现死锁,有锁就走,没锁就可以使用资源,一旦别使用,别的线程或进程就只能悻悻而离去;
锁粒度大,对整表进行加锁;
锁冲突的概率是比较高,一张表50%几率加锁;
并发程度低,这张表一次只允许一个线程或进程使用。
行锁:开销大,加锁慢,会出现死锁,锁粒度比较小,发生锁的冲突概率比较小,并发程度高
开销大,对表中索引项的每一行进行加锁;
会出现死锁,访问某一行时,使用到其他行的资源;
锁粒度小,对行加锁;
锁冲突概率低,那么多行,你就偏偏要用我这一行?
并发度高,可以同时对表中索引项的多行进行操作。
5、一些事务相关的SQL
语句
1)查看事务提交方式
首先,1->自动提交,提交SQL
语句,系统就会更新到磁盘。
0->手动提交,提交后才能更新到磁盘上。
查看select @@autocommit;
2)设置事务提交方式set autocommit = 1;
,自动提交set autocommit = 0;
,手动提交
3)流程begin;
,开启事务,没有使用这个语句也不要紧,形式主义commit;
,提交一个事务rollback;
,回滚到上一次提交的状态savapoint t1;
,设置一个保存点为t1
的位置rollback to t1;
,回滚到t1
的保存点
4)展示存储引擎show engines;
5)创建表时指定存储引擎create table table_name( 属性名 类型 完整性约束) engine = innodb;
6)在已存在的表中修改存储引擎:alter table table_name engine = innodb;
7)如果对整个MySQL的存储引擎做修改,直接修改配置文件
建议百度
6、MySQL
中常使用的引擎及其特点
MySQL最大的特点在于支持插拔式的存储引擎
MySQL中存储引擎使用比较多的Myisam
,InnodB
,memory
存储引擎
1)Myisam
不支持事务,不支持外键,索引采用的的非聚集索引,其优势是访问速度快
Myisam的表在磁盘上存在三个文件:
.frm(定义的表结构)
.MYD(表中的数据记录)
.MYI(表中的索引)
2)InnodB
MySQL默认的存储引擎,具有事务特征,支持外键,支持自动增长列,索引采用聚集索引
InnodB在表中存在两个文件
.frm(定义的表结构)
.ibd(存储数据和索引)
3)Memory
访问比较快,将数据存储在内存中,默认采用的是哈希结构
存储(不适用于范围查询)一旦数据库关闭,表中的数据就会丢失)
MYSQL不同的存储引擎有哪些区别时?
种类 | 锁机制 | B-树索引 | 哈希索引 |外键 |事务 | 索引缓存 | 数据缓存
MYISAM| 表锁 | 支持 | 不支持 |不支持 |不支持 | 支持 | 不支持
INNODB| 行锁 | 支持 | 不支持 |支持 |支持 | 支持 | 支持
memory| 表锁 | 支持 | 支持 |不支持 | 不支持| 支持 | 支持
来源:CSDN
作者:穆煲汤
链接:https://blog.csdn.net/weixin_44501074/article/details/103949109