mysql不能在更新一个表的同时查询同样的一张表
2014-01-12 14:48
826 查看
记得在看高性能mysql的时候,说过mysql不能在更新一个表的同时查询同一张表,今天看了一个stackoverflow的求助帖,突然间想起了这件事情。
http://stackoverflow.com/questions/20786453/mysql-update-a-table-and-select-from-the-same-table-in-a-subquery
stackoverflow帖子地址
对于这个问题,个人认为是mysql读写锁锁定的问题
网络上关于读写锁的解释:
读锁:
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁:
若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
加了共享锁的对象,可以继续加共享锁,不能再加排它锁。加了排它锁后,不能再加任何锁。
那么说我在更新一个表的时候,我锁定了一行,这一行我是不能加读锁的了,所以这时我查询这张表,就会出现这种问题。
这里面还有许多需要细化分析的地方,比方说mvcc等,还需要再看一下
http://www.xiangyu123.com/1059.html
关于mysql锁的一篇文章
http://stackoverflow.com/questions/20786453/mysql-update-a-table-and-select-from-the-same-table-in-a-subquery
stackoverflow帖子地址
对于这个问题,个人认为是mysql读写锁锁定的问题
网络上关于读写锁的解释:
读锁:
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁:
若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
加了共享锁的对象,可以继续加共享锁,不能再加排它锁。加了排它锁后,不能再加任何锁。
那么说我在更新一个表的时候,我锁定了一行,这一行我是不能加读锁的了,所以这时我查询这张表,就会出现这种问题。
这里面还有许多需要细化分析的地方,比方说mvcc等,还需要再看一下
http://www.xiangyu123.com/1059.html
关于mysql锁的一篇文章
相关文章推荐
- mysql 为什么不能在同一个表上查询和更新?
- mysql不能查询一个表然后更新它
- mysql对同一张表进行查询和赋值更新
- MySQL IFNULL中可以有select语句;查询一个表中的数据,同时查看另一个表中是否有符合条件的额数据
- mysql同一张表查询并更新
- MySQL 将查询结果,加入一个自定义固定值字段,插入另外一张表
- b/s软件中使用Access数据库,只能查询,不能添加、修改、删除,提示操作必须是一个可更新的查询解决。
- mysql查询数据,根据条件更新到另一张表
- mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据
- mysql如何在一个表中插入数据的同时,更新另一个表的数据?
- mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据
- MySQL数据库同时查询更新同一张表
- sql 同时(更新)update和(查询)select同一张表
- Access数据库:它已经被别的用户以独占方式打开,操作必须使用一个可更新的查询,不能锁定文件
- MySQL数据库同时查询更新同一张表的方法
- mysql同时使用order by和limit查询时的一个数据丢失
- 解决MySQL不能更新同一张表查出来的结果…
- Mysql查询结果作为另一张表的更新内容
- 0003-MYSQL用一个查询结果去更新另一个表
- all与any操作符和返回两个结果集和把一个结果集当表和查询结果创建表和同时更新几个字段