MySQL表锁与行锁

//MyISAM

	查看表的情况:show open tables;
	加锁:lock table 表名 read(write),表二 read(write);
	释放锁:unlock tables;
	分析表锁定:show status like 'table%';

//innoDB

事务四个特性:ACID(Atomicity:原子性、Consistent:一致性、Isolation:隔离性、Durable:持久性)
并发事务处理带来的问题:更新丢失(最后的一个事务会覆盖)、脏读(读取未提交的数据)、不可重复读(事务A读取事务B已经提交的数据)、幻读(同样的检索条件读取的是新增的数据)
事务的四个隔离级别:未提交读、已提交读、可重复读、可序列化(查看当前事务的隔离级别:show variables like 'tx_isolation';)
分析行锁:show status like 'innodb_row_lock%';

//无索引、索引失效,行锁变表锁

//间隙锁:
	使用范围条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做”间隙“,InnoDB也会对这个”间隙“加锁
	危害:Query执行过程中通过范围查找的话,会锁定整个范围内所有的索引键值,即使这个键值并不存在;

//手动加行锁:
	begin;
	select * from 表 where 条件 for update;
	-- ...业务处理
	commit;

//优化建议:
	尽可能让所有数据检索都通过索引来完成,避免无索引导致行锁升级为表锁。
	合理设计索引,尽量缩小锁的范围
	尽可能减少索引条件,避免间隙锁
	尽量控制事务大小,减少锁定资源量和时间长度
	尽可能低级别事务隔离

你可能感兴趣的:(mysql,数据库,java)