MySQL锁与事务的隔离级别

概念
锁是计算机协调多个进程或线程并发访问某一资源得机制。
数据是一种共享的资源,如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
锁对于数据库来所尤其重要,也更加复杂。
锁的分类
1.从概念上分为:乐观锁(用版本对比来实现)和悲观锁
2.从数据库操作类型分:读锁和写锁(都属于悲观锁)

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
	加读锁:lock table 表名 read;
	当前session和其他session都可以读该表,但当session中插入或者更新锁定的表都会报错,其他session插入或更新则在等待。
写锁(排它锁):当前写锁没有释放,其他事务无法再对该行由任何操作。
	加写锁:lock table 表名 write;
	当前session对该表的增删改查都没有问题,其它session对该表的所有操作被阻塞

3.从数据操作的粒度分:表锁和行锁

表锁(偏读):表锁偏向MyISAM存储引擎,开销小,加锁快,无思索,锁定粒度大,发生锁冲突的概率最高,并发度最低。
行锁(偏写):行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突概率最低,并发度最高。

MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

行锁支持事务

事务是由一组SQL语句组成的逻辑处理单元,事务具有ACID实现即:
	原子性:事务是一个原子操作单元,其对数据的操作要么全执行,要么都不执行。
	一致性:在事务开始和完成时,数据都必须保持一致状态。
	隔离性:数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行。
	持久性:事务完成之后,它对数据的修改是永久性的,即使出现系统故障也能够保持。

并发事务处理带来的问题

1.更新丢失
	当两个或多个事务选择同一行,然后基于最初选定的值更新该行,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题——最后的更新覆盖了其他事务所做的更新。
2.脏读
	一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致的状态;这时,另外一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些"脏"数据,并据此作进一步处理,就会产生未提交的数据依赖关系。这种现想被称为"脏读"。
	一句话:事务A读取到了事务B已经修改但尚未提交的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求
3.不可重复读
	一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变,或某些记录已经被删除!这种现象叫做"不可重复读"。
	一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性。
4.幻读
	一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现想就称为"幻读"。
	一句话:事务A读取到了事务B提交的新数据,不符合隔离性

脏读就是:事务A读到了事务B里面修改但未提交的数据
不可重复读:就是事务A在不同的时间段读取到的数据不一致
幻读就是:事务A读到了事务B里面增加的数据

事务隔离级别

“脏读”,“不可重复读"和"幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。如图:
在这里插入图片描述
  可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。

间隙锁在某些情况下可以解决幻读问题:。
  要避免幻读可以用间隙锁在Session_1下面执行update account set name = ‘zhuge’ where id > 10 and id <=20;,则其他Session没法插入这个范围内的数据

查看当前数据库的事务隔离级别:show variables like ‘tx_isolation’;
设置事务隔离级别:set tx_isolation=‘REPEATABLE-READ’;
查看表的存储引擎:SHOW TABLE STATUS
设置表的存储引擎:ALTER TABLE mylock ENGINE = INNODB;

案例结论
  Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MYISAM的表级锁定的。当系统并发量高的时候,Innodb的整体性能和MYISAM相比就会有比较明显的优势了。
  但是,Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MYISAM高,甚至可能会更差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值