MySQL并发控制
MySQL是一个进程多个线程模型,当并发过来时,就会出现资源争用情况。间接就会产生锁
MySQL锁
读锁:
共享锁,可以让其他读进行,但排斥写锁
写锁:
排他锁,排斥读锁和写锁
- MySQL server:MySQL本身服务的锁,由人工显示定义
lock table read 读锁
lock table write 写锁
unlock table 解锁
- MySQL engine: MySQL数据引擎自带的锁,由MySQL自己完成
MySQL事务
MySQL事务:
MySQL事务本身一个SQL语句,或者一组SQL,是一个不可切分的原子单元
ACID:
原子性:
任务本身是一个整体,不可切分。事务执行要不成功,要么失败
隔离性:
: 事务和事务之间是具有隔离关系。因为当两条事务,同时操作一条语句,就会出现资源争用。所以事务之间要具有隔离关系,但不能完全隔离。为了折中,会有隔离级别
一致性
:事务在执行过程中,其中的数据是一致的,不会增加和减少
持久性
: 事务一旦执行成功,永久有效
innodb引擎支持MySQL事务,为了保证事务,其引进来undo和redo日志
undo:
做回滚用,记录了事务执行前数据库中数据状态,当事务执行过程中,数据库意外停止。当再次启动时,会读取undo里面日志进行事务回滚。undo相当于数据的一次快照
redo:
记录每条事务的执行记录,以及事务在执行之前,这条数据的状态。用来保证事务的一致性。redo的日志是在磁盘上一段连续的空间,对数据库的操作,会先写在redo上,然后又redo再在MySQL上的表执行
MySQL隔离级别:
用来保证事务的隔离性
ru读未提交:
可以读到还没有提交的事务,即出现脏读
rc读以提交:
读到已经提交的事务,不可重复读,重复读可能会出现结果不一致的情况
rr可重复读:
可以重复读,但是自己骗自己,当双方都开始事务,一方修改数据,并提交。另一方在查询该数据,在对方事务期间和提交事务,另一方都会查到之前的数据。当自己提交事务后,就会查到最新数据。即幻读
串行化读:
即一个事务完毕,另一个读取之前事务的数据的事务,才开始执行。但对数据库性能影响很大
注:以上隔离级别出现的错误,都是在两个事务在操作同一个资源时出现
MySQL修改参数
- MySQL全局参数
全局参数修改,只针对以后连进来的线程生效 - MySQL的当前session的参数
及时生效,但只针对当前的线程 - MySQL内嵌了计数器,来记录其运行状态
mysql status