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
下一篇: volist 标签 第一个和最后一个判断