CSDN-CSDN社区-其他数据库开发-MySQL/Postgresql

收藏 关于MYSQL锁定与并发处理[问题点数:20,无满意答案结帖,结帖人:xtjsxtj]

  • xtjsxtj
  • (笑天居士)
  • 等 级:
  • 结帖率:
楼主发表于:2008-02-21 13:19:32
分别说明对于非事务表普通引擎和InnoDB引擎两种情况下,发出一个长时间的查询的同时,可以进行插入或更新吗?如果可以的话,查询会查询到最新的数据吗?(假设查询没结束,但是插入或更新已结束),分别用mysql_store_result和ysql_use_result两种不同的方式来查询,是不是结果不同呢
回复次数:10
  • xtjsxtj用户头像
  • xtjsxtj
  • (笑天居士)
  • 等 级:
#1楼 得分:0回复于:2008-02-21 13:29:44
自我分析,查询语句应该是不会加锁的,至少Informix,oracle等DB是不加锁的

MySql查询会加锁吗?
  • xtjsxtj用户头像
  • xtjsxtj
  • (笑天居士)
  • 等 级:
#2楼 得分:0回复于:2008-02-21 13:36:13
我看过一个资料,这样说的:

在所有这些情况下,客户机程序都不能很快检索结果集的所有行,它限制了服务器,并对其他客户机程序产生负面的影响,因为检索数据的表在查询过程中是读锁定的。要更新表的客户机或要插入行的任何客户机程序都被阻塞。


以上这句话怎样理解?为何会读负定,读表也还会锁定吗?
#3楼 得分:0回复于:2008-02-21 13:41:26
你看一下数据库原理,selece的时候,也会加读锁(共享锁)的。


DBMS通常提供了多种数据类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁类型决定的。基本的封锁类型有两种:排他锁(exclusive lock,简记为X锁)和共享锁(share lock简记为S锁)排他锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A 上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

共享锁又称为读锁。若事务T对数据对象A加上S锁,则其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
  • xtjsxtj用户头像
  • xtjsxtj
  • (笑天居士)
  • 等 级:
#4楼 得分:0回复于:2008-02-26 10:12:36
太专业了,听不太懂

直接一点,就是如果一用户正读到某一条记录,恰恰在这同时有另一用户想改这条记录,让不让修改呢?

我指的是INNODB引擎的默认配置下,SQL语句中不加任何的锁模式指定


还有,我在SELECT时,是没有起事务的,这时SELECT也会加上共享锁吗?

  • yueliangdao0608用户头像
  • yueliangdao0608
  • (我喜欢上帝,尤其是他老婆。)
  • 等 级:
  • 4

    7

    3

#5楼 得分:0回复于:2008-02-26 10:17:36
select ... for update 或者 in share mode 会加锁。
#6楼 得分:0回复于:2008-02-26 12:10:31
SELECT还是会加锁的,如果你在更新,SELECT也查询不出,你只要在后面加个NOLOCK就行了!这样就可以边更新,边查询到记录!
#7楼 得分:0回复于:2008-02-27 10:29:25
呵呵,这个问题,你只要记住一点:查询以后提交的不看。你执行了查询,可能查询需要的时间很长,在这个过程中其他用户提交了如update,insert 等操作,你的查询不会去看,虽然在其他用户看来他们的数据已经成功更新了。

多说一句,实际上,你的查询遇到这种情况,他是去回退段读快照中的数据,而非数据表中现在的数据。
  • xtjsxtj用户头像
  • xtjsxtj
  • (笑天居士)
  • 等 级:
#8楼 得分:0回复于:2008-02-27 14:18:31
我是初学MYSQL,所以对比其它DB,我有些不懂的地方

我仔细看了看想着资料,我来回答我的问题
普通的select(没有加lock in share mode或for update)在MyISAM和InnoDB两种引擎下,都不会锁表或锁行的
对于MyISAM引擎,select语句加lock in share mode或for update是没有意义的,MyISAM必须用lock table来锁表操作
对于MyISAM引擎,update,insert语句会自动锁表

普通的select也查询不到查询过程中,另外用户更新或插入的数据
对于MyISAM可以锁表,限制在查询的同时,其它人做修改或插入
对于InnoDB可以起事务锁定行或改变隔离级别,防止在查询的过程中其它人修改或插入

不知道理解的对不对
#9楼 得分:0回复于:2008-02-27 14:24:14
理解的对
== 思想重于技巧 ==
  • yueliangdao0608用户头像
  • yueliangdao0608
  • (我喜欢上帝,尤其是他老婆。)
  • 等 级:
  • 4

    7

    3

#10楼 得分:0回复于:2008-02-28 20:29:30
关于FOR UPDATE 的意义 可以详细见我的BLOG
http://blog.chinaunix.net/u/29134/showart_478439.html
相关问题
如何对mysql数据库进行并发处理? Web 开发/ PHP - CSDN社区community ...
MYSQL 如何防止同一条记录被多人下载
讨论:关于PHP+MYSQL处理高并发请求及海量数据的问题.
java程序中如何实现对mysql数据库中表的锁定
斑竹~~我想要你的qq~~~问一个mysql的解决并发的一个问题~~ 其他数据库 ...
关于数据库支持并发访问的问题! VB / 数据库(包含打印,安装,报表 ...