锁
1、查看表锁, Table_locks_waited较高表明锁争用比较严重
show status like 'table%'
2、查看行锁,Innodb_row_lock_waits和InnoDB_row_lock_time_avg较高表明锁争用比较严重
show status like 'innodb_row_lock%'
3、加写表锁(需手动unclock tables,用commit不会自动解锁)
lock table user write;
4、加读表锁(需手动unclock tables,用commit不会自动解锁)
lock table user read;
5、加读表锁(需手动unclock tables,用commit不会自动解锁),并支持另一个事务的insert操作
lock table user read local;
6、加共享行锁(提交事务,自动解锁)
select * from user where id=2 lock in share mode;
7、加排他行锁(提交事务,自动解锁)
delete from user where id=2 for update;
8、其他说明
INSERT...SELECT...和 CREATE TABLE...SELECT...语句,会锁原表
set global concurrent_insert=2; -- 设置是否开启并发insert,0=不开启,1=没有空洞的情况下,允许insert,2=不管有没有空洞,都允许插入
select @@LOW_PRIORITY_UPDATES; -- 默认情况下,写锁比读锁优先级高,所以写锁会先得到锁,用这个命令可以降低写锁的级别
select @@max_write_lock_count; -- 当写锁达到指定数量,会降低写锁优先级
事务
1、开启事务
set autocommit=0; -- 先取消自动事务提交
start transaction; -- 手动开启事务
2、提交事务(不会自动释放表锁)
commit;
3、回滚事务
rollback;
4、设置事务的隔离级别为“未提交读”(可能导致脏读)
set session transaction isolation level read uncommitted;
5、设置事务的隔离级别为“已提交读读”(可能导致不可重复读)
set session transaction isolation level read committed;
6、设置事务的隔离级别为“可重复读”(可能导致幻读)
set session transaction isolation level repeatable read;
7、设置事务的隔离级别为“序列化”
set session transaction isolation level serializable;
8、查看数据库的事务隔离级别
select @@global.tx_isolation, @@session.tx_isolation;
听说,打赏我的人最后都找到了真爱。