Mysql锁与事务
2020-03-23 本文已影响0人
hcq0514
锁
1 锁的分类
- 从性能上分为乐观锁(用版本对比来实现)和悲观锁
- 从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁)
读锁(共享 锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁 - 从对数据操作的粒度分,分为表锁和行锁
- 表锁(偏读)
表锁偏向MyISAM存储引擎,开销小,加锁快,无思索,锁定粒度大,发生锁冲突的概率最高,并发度最低。
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
1、对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
2、对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作
总结:
简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
-
行锁(偏写)
行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
InnoDB与MYISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。
3.1 事务特性ACID -
并发事务会带来的问题
- 脏读:事务A修改的数据还未提交,就被事务B读取到了,这时候事务A回滚了,事务B读取到的就是脏数据
- 不可重复读:事务A第一次读到count的值为1,此时事务B已经更新了count的值为2,此时事务A再次读取count时,读取到的值是2(同一个事务里不可以重复读到相同的数据简称不可重复读,事务B里面修改了数据)
- 幻读:事务A读取到了事务B提交的新增数据,不符合隔离性(幻读是事务B里面新增了数据)
- 事务的隔离级别
脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。
- 读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
- 读已提交:一个事务提交之后,它所做的变更才可以被别的事务看到
- 可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
-
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
查看当前数据库的事务隔离级别: show variables like 'tx_isolation';
设置事务隔离级别:set tx_isolation='REPEATABLE-READ';