MySQL---事务及锁机制

MySQL之事务以及锁机制



事务

在MYSQL中的事务(Transaction)是由存储引擎实现的,在MySQL中,只有lnnoDB存储引擎才支持事务。

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。

事务用来管理DDL、DML、DCL操作,比如insert,update,delete语句,默认是自动提交的。

在这里插入图片描述


事务的操作

1、开启事务:start Transaction

任何一条DML语句(insert、update,delete)执行,标志事务的开启

命令BEGIN或START TRANSACTION;

2、提交事务:commit Transaction

成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步

命令:COMMIT;

3、回滚事务:Rollback Transaction

失败的结束,将所有的DML语句操作历史记录全部清空

命令:ROLLBACK;

set命令

之前的所有SQL操作其实也有事务,只是MYSQL自动帮我们完成的,每执行一条SQL时MYSQL就帮我们自动提交事务,因此如果想要手动控制事务,则必须关闭MYSQL的事务自动提交。在MYSQL中直接用SET来改变MYSQL的自动提交模式。

set autocommit=0;  禁止自动提交
set autocommit=1;  开启自动提交

在这里插入图片描述

事务的特性—ACID

原子性(Atomicity):事务是一个不可分割的整体,事务开始后的所有操作,要么全部完成,要么全部不做

一致性(Consistency):系统从一个正确的状态,迁移到另一个正确的状态

隔离性(Isolation):每个事务的对象对其他事务的操作对象互相分离,事务提交前对其他事务不可见

持久性(Durability):事务一旦提交,则其结果是永久性的

事务的隔离级别

1.READ UNCOMMITTED 读未提交

一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证,会造成脏读

2.READ COMMITTED 读提交

一个事务要等另一个事务提交后才能读取诗句,可皮面脏读的发生,会造成不可重复读

3.REPEATEABLE READ 可重复度

就是在开始读取数据(事务开启时),不再允许修改操作,可避免脏读,不可重复读的发生,但是会造成幻读

4.SERIALIZABLE 序列化

是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读,不可重复读与幻读。但是这种事务隔离级别低下,比较耗数据库性能,一般不使用

mysql的默认隔离级别是 repeatable read

一查看隔离级别
show variables like '%isolation%';
—设置隔离级别
1.设置read uncommitted
set session trancton isolation level read uncommitted;
2.设置read committed
set session transaction isolation level read committed;
3.设置repeatable read
set session transaction isolation level repeatable read;
4.设置serializable
set session transaction isolation level serializable;

在这里插入图片描述


锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。
在数据库中,除传统的计算资源(如CPU,RAM,I/0等)的争用以外,数据也是一种供许多用户共享的资源。
如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

对数据操作粒度分

表锁:操作时,会锁定整个表
行锁:操作时,会锁定当前操作行

在这里插入图片描述

对数据操作类型分

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而互不影响
写锁(排他锁):当前操作没有完成之前,它会阻断他写锁和读锁

在这里插入图片描述

MyISAM—表级锁

加读锁: lock table table_name read;
加写锁: lock table table_name write;
解锁:unlock tables;

InnoDB—行级锁

行锁特点

行锁持点:偏向InnoDB存储引擎,开销大加锁慢;会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

InnoDB与MYISAM的最大不同有两点:一是支持事务;二是采用了行级锁。

行锁模式

InnoDB实现了以下两种类型的行锁。

共享锁(S):又称为读锁,简称s锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁(X):又称为写锁,简称×锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

对于UPDATE、DELETE和INSERTE语句,InnoDB会自动给涉及数据集加排他锁(x)
对于普通SELECT语句,InnoDB不会加任何锁

共享锁(s):select * from table_name where····lock in share mode
排它锁(x):select * from table_name where····for update
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值