方法: lock table 表名 read/write
对表进行read锁的话,当前sessiton对表增删改都会报错,其他session可以查询,增删改需要等待
对表进行write锁的话,当前sessions可以增删改,其他session只能被阻塞
如果要释放表锁用“unlock table 表名”的方式进行 ,另外还可以用show open tables查询所有表锁的信息,也可以通过unlock tables来释放所有锁表信息。
行级锁其实就是对table中某一行数据进行lock,某一行数据一旦补lock,只有当前session可以进行修改和删除,其他sesstion可以查询,修改和删除会等待,直到当前session事务结束,也就是commit之后才可以进行。
行级锁的方法有如下几种
1.开始事务,对某种where条件的数据进行update或者delete,其他session进行一样where条件update、delete操作会被阻塞,直到当前session commit
2.在select语名增加for update后缀,这样where条件中数据会被锁定,其他session用一样条件加for update都会同样被阻塞,直到当前session commit。
在mysql中事务隔离级别主要有如下四种
当前session可以读取到其他session update之后数据,但是这样会带来一个问题,如果其他session rollback了,当前session就会读取了脏数据
当前session可以读取到其他session update之后并commit之后数据,未commit的话,当前session读取是老数据。这样会带来一个问题,当前session的数据不可以重复读
当前session读取的session开始的数据,selection时感知不到其他session数据修改已commit的变化,对其他session已insert的新数据也读取不到,会带来幻读问题,但是如果update table set age=age-10 where id=1 进行update数据时,会用其他session最新commit后结果进行减10
此级别是mysql默认方式,我们可以用下语看db启用事务隔离级别
show variables like '%isolation%'
并行级别,此级别效率较低,在实际业务场景中不会使用
在mysql中设定session隔离级别用如下方法进行:
set session transaction isolation level XXXXXXXX
如果table user中ID字段值有1-10,30-40 50-60,当前sesion如查update范围8-55区间数据,其他session如果要update id为7或59都会被阻塞,因为mysql会产生一个(1,60]的临键锁,是一个很奇葩的功能。