欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql 锁 事物 小结

程序员文章站 2024-01-13 14:49:52
...


锁兼容性:仅当请求锁的模式与现有锁的模式相兼容时,才会授予新的锁请求。如果请求锁的模式与现有锁的模式不兼容,则请求新锁的事务将等待释放现有锁或等待锁超时间隔过期

一、MyISAM表锁

1、MyISAM存储引擎只支持表锁

2、MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。

3、MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预。

4、锁模式兼容性列表

				当前锁模式
		是否兼容		
请求锁模式					
			None	读锁	写锁
读锁		是		是		否
写锁		是		否		否

5、MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要

二、InnoDB行锁

1、InnoDB实现了以下两种类型的行锁:共享锁(S),排他锁(X);

2、InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁:意向共享锁(IS),意向排他锁(IX)

3、意向锁是InnoDB自动加的,不需用户干预。

4、对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
对于普通SELECT语句,InnoDB不会加任何锁!

5、共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

6、锁模式兼容性列表
				请求锁模式
		是否兼容
当前锁模式
		X		IX		S		IS
X		冲突	冲突	冲突	冲突
IX		冲突	兼容	冲突	兼容
S		冲突	冲突	兼容	兼容
IS		冲突	兼容	兼容	兼容


7、InnoDB行锁是通过给索引上的索引项加锁来实现的,所以只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

8、由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。

9、检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引。

10、间隙锁针对幻读。

MySQL事物

1、autocommit自动提交模式:表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。
2、查询show variables like 'autocommit';
值0和OFF都是一样的:关闭当前会话中事务的自动提交,需要手动 commit 或者 rollback;
1也就表示ON:默认 autocommit = 1,每一次 sql 操作都被认为是一个单次的事务,被隐式提交。

3、start transaction;挂起 autocommit 的状态。

挂起 autocommit 的意思是保存 autocommit 的当前状态,然后 start transaction,直到 commit or rollback 结束本次事务,再恢复之前挂起的 autocommit 的状态

如果 start transaction 前 autocommit = 1,则完成本次事务后 autocommit 还是 1

如果 start transaction 前 autocommit = 0,则完成本次事务后 autocommit 还是 0,接下来的操作你仍需手动 commit 才可以提交。


参考文献:

http://blog.csdn.net/mysteryhaohao/article/details/51669741

https://my.oschina.net/sallency/blog/785476

转载于:https://my.oschina.net/simaguo/blog/887080