分别说明对于非事务表普通引擎和InnoDB引擎两种情况下,发出一个长时间的查询的同时,可以进行插入或更新吗?如果可以的话,查询会查询到最新的数据吗?(假设查询没结束,但是插入或更新已结束),分别用mysql_store_result和ysql_use_result两种不同的方式来查询,是不是结果不同呢

解决方案 »

  1.   

    自我分析,查询语句应该是不会加锁的,至少Informix,oracle等DB是不加锁的MySql查询会加锁吗?
      

  2.   

    你看一下数据库原理,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做任何修改。
      

  3.   

    太专业了,听不太懂直接一点,就是如果一用户正读到某一条记录,恰恰在这同时有另一用户想改这条记录,让不让修改呢?我指的是INNODB引擎的默认配置下,SQL语句中不加任何的锁模式指定
    还有,我在SELECT时,是没有起事务的,这时SELECT也会加上共享锁吗?
      

  4.   

    select ... for update 或者 in share mode 会加锁。
      

  5.   

    SELECT还是会加锁的,如果你在更新,SELECT也查询不出,你只要在后面加个NOLOCK就行了!这样就可以边更新,边查询到记录!
      

  6.   

    呵呵,这个问题,你只要记住一点:查询以后提交的不看。你执行了查询,可能查询需要的时间很长,在这个过程中其他用户提交了如update,insert 等操作,你的查询不会去看,虽然在其他用户看来他们的数据已经成功更新了。多说一句,实际上,你的查询遇到这种情况,他是去回退段读快照中的数据,而非数据表中现在的数据。
      

  7.   

    我是初学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可以起事务锁定行或改变隔离级别,防止在查询的过程中其它人修改或插入不知道理解的对不对
      

  8.   

    关于FOR UPDATE 的意义 可以详细见我的BLOG
    http://blog.chinaunix.net/u/29134/showart_478439.html