十四:MySQL锁的问题
十五:常用SQL技巧
十四:MySQL锁的问题
锁的概述
锁是计算机协调多个进程或线程并发访问某一资源的机制
锁的分类
从操作粒度分:表锁、行锁
从操作类型分:读锁、写锁
MySQL的锁
MySQL不同存储引擎所支持的锁机制是不同的
MyISAM表锁
如何加表锁
首先,MyISAM会自动给【select】语句加写锁,自动给【update、delete、insert】加写锁,在正常使用SQL时不需要手动添加表锁,但如果硬要手动写“填加表锁”,其语法为:加读锁:lock table table_name read;
加写锁:lock table table_name write;
解锁语句:unlock tables;(注意:不论是读锁还是写锁,在加完并执行完SQL语句之后,一定要解锁,否则就无法进行其他操作)
读锁案例
写锁案例
结论
查看锁的争用情况show open tables;
show status like "Table_locks%";
InnoDB行锁
事务的ACID属性:原子性(atomicity):一个事物就是一个操作单元,这个操作不可拆分,要么全部成功,要么全部失败
一致性(consistent):在事务开始前与完成后,数据保持一致(比如A给B转账,A减一元,B加一元,但两人的总金额不变)
隔离性(isolation):可以定义一个事务的操作结果何时对其他事务可见(有四个隔离级别,见下方)
持久性(durable):事务完成后,对于数据的修改是永久的
并发事务带来的问题丢失跟新:一个事务的更新被另一个事务的更新覆盖掉
脏读:读取到脏数据(例如,一个事务正在更新某个数据,但还未提交结果,这时候另一个事务读取了数据库中还未更新完成的数据并进行使用)
不可重复读:当同一个事务前后两次进行读取数据时,数据不一致
幻读:当同一个事务前后两次进行读取数据时,在第二次发现多了一个满足查询条件的数据
事务的隔离级别读未提交(read uncommitted)
读已提交(read committed)
可重复读(repeatable read),可重复读的意思是,该事务在未提交的状态下,再次执行一次时,查询结果与第一次结果是相同的,即使真正的数据库中的数据在第二次的时候已经被另一个事务改变了值,该事务第二次的查询结果也会与第一次一样,这就是“可重复读”,这一效果是使用“MVCC”实现的(具体MVCC是什么还未弄懂)。PS:MySQL中的事务默认的隔离级别就是“可重复读”。
串行化(serializable)
行锁的基本演示