Mysql高并发与锁机制
- 很多数据会涉及到高并发,比如12306的抢票,淘宝上面的库存,一次只能被一个用户所修改,如果被多个用户修改就会造成很严重的后果,所以mysql就引入 锁 的机制,让信息一次只能被一个用户锁修改。
- 锁也是有很多钟的锁,有表锁和行锁
- 表锁的概念就是当某个事务在对一个表的数据在进行修改的时候,另外的事务时不能修改这个表
- 行锁的概念就相当于某个事务在处理表中某行数据的时候,另外的事务不能够对这行进行修改
- 表锁封锁的过于紧了 所以在项目钟常常是使用表锁
- mysql的Innodb引擎就是支持表锁的一个引擎
索引对表的影响
- 当我们修改或者删除表的给的where条件不是主键的时候,使用客户端就会触发安全模式,安全模式下会阻止我们继续操作,所以我们可以使用 SET SQL_SAFE_UPDATES = 0; 来关闭安全模式
- 行锁的好处就是在于一个事务修改一个表中某行数据的时候,另外一个事务可以对表的其他数据进行操作,但是这些的前提都是我们修改表数据的时候给的where条件是索引条件,如果不是索引条件,就算我们引擎选择的是Innodb,也会转化为表锁
- 索引是字段的一个属性特征,主键默认也是索引。
使用ALTER TABLEtable_name
ADD INDEX index_name (column
) 可以添加索引
悲观锁
- 悲观锁常用于商品抢购网站,铁路12306之类的网站上使用,位的就是避免多个用户抢购量少的商品。
- 悲观锁的等级高于表锁,表锁只是会禁止其他事务修改表的数据,悲观锁会禁止其他事务查看表
- 使用悲观锁需要在每个事务的最开始的一行代码加上 for update关键字,在for update关键字这行和之后的代码就会默认处于悲观锁中
表锁的操作
读锁
会话一:
会话二:
- 当一个会话给某表设置了读锁之后,其他的会话都只能对这个表进行查询工作,都不能执行修改,更新,删除操作,包括设置读锁的这个会话也是一样不能进行这些操作,只能读取信息
- 只有在这个会话解锁了以后,所有的会话才能使用我完整的功能
- 使用 lock table 表名 read设置读锁
- 使用 unlock tables解锁
写锁
- 当一个会话给某个表设置了写锁之后,当前会话还可以读取改表的信息,但是不能够写入数据,其他会话连读取都读取不廖,就更别提写了。
- 使用 lock table 表名 write设置写锁
- 使用 unlock tables解锁