首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于MYSQL锁定与并发处理 [无满意答案结帖,结帖人:xtjsxtj]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xtjsxtj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-02-21 13:19:32 楼主
    分别说明对于非事务表普通引擎和InnoDB引擎两种情况下,发出一个长时间的查询的同时,可以进行插入或更新吗?如果可以的话,查询会查询到最新的数据吗?(假设查询没结束,但是插入或更新已结束),分别用mysql_store_result和ysql_use_result两种不同的方式来查询,是不是结果不同呢
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xtjsxtj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-21 13:29:441楼 得分:0
    自我分析,查询语句应该是不会加锁的,至少Informix,oracle等DB是不加锁的

    MySql查询会加锁吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xtjsxtj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-21 13:36:132楼 得分:0
    我看过一个资料,这样说的:

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


    以上这句话怎样理解?为何会读负定,读表也还会锁定吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangxiao_jiang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-21 13:41:263楼 得分:0
    你看一下数据库原理,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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-26 10:12:364楼 得分:0
    太专业了,听不太懂

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

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


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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yueliangdao0608
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      3

    发表于:2008-02-26 10:17:365楼 得分:0
    select ... for update 或者 in share mode 会加锁。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BILearner
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-26 12:10:316楼 得分:0
    SELECT还是会加锁的,如果你在更新,SELECT也查询不出,你只要在后面加个NOLOCK就行了!这样就可以边更新,边查询到记录!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mathematician
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

    发表于:2008-02-27 10:29:257楼 得分:0
    呵呵,这个问题,你只要记住一点:查询以后提交的不看。你执行了查询,可能查询需要的时间很长,在这个过程中其他用户提交了如update,insert 等操作,你的查询不会去看,虽然在其他用户看来他们的数据已经成功更新了。

    多说一句,实际上,你的查询遇到这种情况,他是去回退段读快照中的数据,而非数据表中现在的数据。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xtjsxtj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-27 14:18:318楼 得分:0
    我是初学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可以起事务锁定行或改变隔离级别,防止在查询的过程中其它人修改或插入

    不知道理解的对不对
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liuyann
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

    发表于:2008-02-27 14:24:149楼 得分:0
    理解的对
    == 思想重于技巧 ==
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yueliangdao0608
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      3

    发表于:2008-02-28 20:29:3010楼 得分:0
    关于FOR UPDATE 的意义 可以详细见我的BLOG
    http://blog.chinaunix.net/u/29134/showart_478439.html
    修改 删除 举报 引用 回复