在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,
例如:
select * from test limit 1
自动加共享锁,查询结束之后释放
再未查询成功之前...sleep读取,共享锁运行之后,其他连接可以继续读取表,不能更新表数据(共享锁特性)
串行到终端2,终端2由于是写入操作,独占锁,将会被阻塞,但是终端2已经是独占锁等待状态,其他连接不能读取,不能更新...因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的...insert插入完毕,释放锁,才能继续查询
这时候就出现了2个问题:
1:语句1和语句2原本是同一个逻辑,统计2种金额的,却导致了语句2多统计了一条数据,导致金额合计不符合
2:语句2需要等待insert...手动锁表之后不能操作未锁的表:
mysql> lock tables test read local;
Query OK, 0 rows affected
mysql> select * from test2