mySQL-事务隔离级别以及锁机制

事务隔离级别

为什么使用事务:在多线程下数据会因为抢夺cpu资源而产生数据异常问题

为什么不每个都使用事务:效率低(加锁,与IO的关系)

公司大楼,分4个等级,1,大门 2,保安 3,进自己部门的门禁卡 4,进总监办公事敲门

mySQL:默认隔离级别是RR级别,
查询事务级别
mySQL-事务隔离级别以及锁机制
修改事务隔离级别:set @@global tx-isolation=(1,2,3,4)

隔离级别(1——2——3——4依次加强)
性能(1——2——3——4依次降低)
安全(1——2——3——4依次增加)

1、未授权读取:(未提交读取)RU

好处:
解决的是没有使用事务的时候数据不一致的问题;就是做到所有的sql一起成功,一起回滚
问题:
可以读取其他事务执行的Sql的结果(也就是脏读)

2、授权读取:(已提交读取)RC

没有提交,另一事物也执行了操作,然后都提交,最后总会多执行一次

3、可重复读取:RR

可以解决脏读和不可重复读

4、序列化:Serializable

序列化是一个单线程的操作,产生的问题会最小,本质是把多线程改变为单线程,所以并发量特别低,(在高并发情况下不会产生超卖)

锁机制

死锁:

死锁产生的根本原因:两个或多个县城共同抢占资源,官方话就是线程之间交替等待的结果

处理死锁:回滚小事务

在我项目中使用到的场景是订单,该订单属于交易状态,然后当用户在下订单的同时,商家也在修改订单,(对同一订单修改信息)就产生了死锁的状态,锁就会产生冲突,mysql自身有对锁产生冲突的应对机制

如果锁产生了冲突,mysql会选择让事务大的继续执行,会数百事务小的

事物的大小(写的数据量来判断事务大小,也就是操作数据的数据量的多少)

MVCC

是mySQL里Innodb中的多版本并发控制,这算是一种思想,oracle,失去了server,redis中都可以有

我的理解就是乐观锁就是MVCC的一种典型实现

乐观锁

就是当数据进来的时候,先让数据操作,等数据出问题了再加上锁
问题:在大批量高并发时会产生问题(主要用于修改)

悲观锁

就是不管在什么情况下,数据想要进来就必须通过锁才能进来
主要用于查询

如何解决秒杀(超卖)简单产生原因

在秒杀时,会有大量数据请求进来,然而在秒杀时一般商品信息都是存在redis里,没有对mySqljinxing操作,就会出现超卖的操作,
其实就是出现了脏读问题,它以为mySql数据库里还有库存还存在数据,然而因为出现了脏读,其实mySql数据库里其实库存已经不够了,所以就造成了超卖

间隙所

会锁住一个区间,通过where——between 来实现的。其中where条件中没有索引字段,就必然会行锁升级成表锁,,也就是其他数据不能进行操作当前的数据
id 1=30之间,可通过间隙所锁住9-12之间的数据,

解决方法:尽量与携带索引字母表示

事务使用建议

1、控制事务大小
2、范围查询,尽量减少基于范围查询的事务大小
3、使用锁时,尽量配合与携带索引字母使用,避免升级成表锁
4、如果业务必须使用锁,的尽量避免所冲突特别高的场景
5、可以根据项目具体情况调节事务的innodb_flush_log_at_tre_commit