MySQL事务,存储引擎,锁及机制

事务

什么是事务?

事务是由一条或者多条对数据库操作的SQL组成的一个不可分割的一个单元。
只有当事务中的所有操作都正常执行的情况下整个事务才提交给数据库。

1)事务是一组SQL语句的执行,要么全部执行成功,要么全部执行失败,不能出现部分成功和失败,保证原子操作。
2)事务中所有的数据执行成功才能提交到数据库。
3)事务在执行过程中,如果有SQL出现了错误,那么其他SQL操作必须回滚到操作前的状态,且不会提交到数据库。

事务的四个特征?

一个事务必须满足以下四个特征:
A(Atomic)原子性:事务是一个不可分割的整体,必须具有原子性,当数据变更时,要么全部成功要么全部失败,不允许部分成功部分失败。
C(Consistency)一致性:一个事务的执行前后,数据库中的数据总量必须保持一致。
I(Isolation)隔离性:当两个或者多个事务并发操作时,为了保证数据的安全性,将一个事务内部操作与其他事务隔离起来,不被其他执行的事务所看到。
D(Durability)持久性:事务执行完成后,数据库保证修改是永久性的,即使数据库发生故障,故障排除后也能恢复数据。

事务的隔离级别?

事务处理隔离级别使用不当,会引起以下问题:
1)脏读(dirty read):一个事务读取了另一个事务未提交的数据。
2)不可重复读(Nonrepeatable read)一个事务的操作导致另一个事务前后两次读取到不同的数据。
3)幻读(Phantom read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

MySQL中存在的隔离级别:
1)Transaction_Read_UNcommitted 未提交读:在提交前一个事务可以看到另一个事务的变化,会发生脏读,不可重复读,虚读等情况,不安全。
2)Transaction_Read_committed 已提交读:在提交之前的数据其他事务是不允许看到的,解决了脏读,但是不可重复读,虚读还存在。
3)Transaction_Repeatable_Read 可重复读:保证能够再次读取相同的数据而不失败,解决了不可重复读,但是虚读还存在。
4)Transaction_Serializable 可序列化/串行化:隔离级别最高,能够防止脏读,不可重复读,虚读等情况。

事务的隔离级别越高,数据安全性越好,但是处理花费时间越长(效率越低)。

MySQL中事务处理的SQL

1)查看事务是否是自动提交的:
select @@autocommit; 0是手动提交,1是自动提交,默认值是1。
2)设置事务的提交方法:
set autocommit = 0; 0是手动提交,1是自动提交。
3)begin:开启事务。
4)commit:提交事务。
5)rollback:回滚事务到初始状态。
6)savepoint t1:设置一个保存点为t1的位置。
7)rollback to t1:回滚到t1的保存点。

存储引擎

什么是存储引擎?

存储引擎是数据库中数据的具体组织方式。
MySQL最大的特点在于支持插拔式的存储引擎,MySQL中存储引擎使用比较多的是MYISAM,InNoDB,memory存储引擎。

MYISAM不支持事务,不支持外键,索引采用的是非聚集索引,其优势是访问速度快。
它的表在磁盘上存在三个文件:
.frm:定义表的结构
.MYD:表中的数据记录
.MYI:表中的索引存储

InNoDB是MySQL默认的存储引擎,具有事务特征,支持外键,支持自动增长列。
它的表在磁盘上存在两个文件:
.frm:定义表的结构
.ibd:存储数据和索引

memory类型的存储引擎访问比较快,将数据存储在内存中,采用哈希结构,(不适用于范围查询,一旦数据库关闭,表中数据就会丢失。)

存储引擎涉及到的SQL

1)查看存储引擎:
show engines;
2)创建表时可以指定存储引擎:
create table table_name(属性名 属性类型) engine = innodb;
3)在已经存在的表中修改存储引擎:
alter table table_name engine = innodb;
4)如果对整个MySQL的存储引擎做修改,直接修改配置文件:
windows是my.ini,linux是my.cof
5)在[mysqld]下添加MySQL的存储引擎默认配置:
default-storage-engine = MYISAM;

锁及机制

在MySQL中锁分为表锁,行锁,共享锁,排它锁和死锁。
表锁即加锁时是给整张表加锁,那么只要有一个线程在操作这张表,那么其他线程是无法操作这张表的。
行锁即加锁时是给表的某一行数据加锁,只要有一个线程在操作一行数据,那么其他线程无法操作这一行数据,但是可以操作其他行数据。

所以表锁的加锁开销小,加锁快,不会出现死锁,锁的粒度比较小,发生锁冲突的概率也比较小,并发程度低。行锁的加锁开销大,加锁慢,会出现死锁,锁的粒度比较大,发生锁冲突的概率较大,并发程度高。

默认存储引擎的锁机制

MySQL默认的存储引擎是InNoDB,InNoDB是支持行锁的,但是并不是不支持表锁。
其实InNoDB的行锁是基于索引实现的,即它们加锁是给索引加锁。
那么如果表上没有索引,它就会退化成表锁。

自动检测死锁

两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。
发生死锁后,InnoDB 一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。
这样的死锁问题,一般都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题,因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按相同的顺序进行更新操作,以防止锁冲突导致死锁问题。

InnoDB在实现事务隔离级别的时候,采用的是一种叫做数据多版本并发控制(MultiVersion Concurrency Control,
简称 MVCC 或MCC)机制(当然串行化除外),也经常称为多版本数据库。
MVCC机制会生成一个数据请求时间点的一致性数据快照 (Snapshot), 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。
从用户的角度来看,好象是数据库可以提供同一数据的多个版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值