MySQL之事务以及锁机制
文章目录
- MySQL之事务以及锁机制
- 事务
- 事务的操作
- 1、开启事务:start Transaction
- 2、提交事务:commit Transaction
- 3、回滚事务:Rollback Transaction
- set命令
- 事务的特性---ACID
- 事务的隔离级别
- 1.READ UNCOMMITTED 读未提交
- 2.READ COMMITTED 读提交
- 3.REPEATEABLE READ 可重复度
- 4.SERIALIZABLE 序列化
- 锁机制
- 对数据操作粒度分
- 对数据操作类型分
- MyISAM---表级锁
- InnoDB---行级锁
- 行锁特点
- 行锁模式
事务
在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