• 在mysql 中两种锁定问题


    mysql 中15.2.10.5 中描述了两个问题,且分别给出了解决办法。
    1.向子表中写入数据,但写入之前需确保父表中存在其相应信息。
    可能出现,在已经读取父表中的数据,但另一请求将其删除。
    办法:

    begin;
    select info from father_table where name = 'nike' LOCK IN SHARE MODE;
    insert into son_table values('SomeInfo');
    commit;

    事务是确保多个进程的原子性, 但不能保证上述问题的正确性。在事务中,使用了LOCK IN SHARE MODE,
    它在我们读取的行设置一个共享锁,这样就可读取最新数据了,同时,访问了一个同样有共享锁定的数据时,
    则会等待该事务提交,之后再进行读取。这样就避免了一个事务未完成时,数据却被修改的问题。

    2.实现一个计数器时,对同一字段进行修改,当两用户同时对其读取再修改时, 一个进程可能在
    另一进程读数据和再次写数据中读取数据的情况,这样,就会遗漏一次统计。
    办法:
    1 . 先写数据,写数据加锁,且读数据也被限制,只有等数据加完,才能读取,而加完后,则是最新的数据。
    2 .

    begin;
    select count form son_table FOR UPDATE;
    update son_table set count = count + 1;
    commit;

    SELECT ... FOR UPDATE读最新的可见数据,在每个它读取的行设置独占锁定。因此,它设置与搜索的SQL UPDATE可能会在行上设置的锁定同样的锁定。

    通过上面的例子则可以发现,当多个用户对同一行数据进行访问时,则可能出现锁,反之,单一用户访问只属于他自己的数据,则不太可能出现锁定,如,修改个人资料

  • 相关阅读:
    记录一次阻塞引发的系统超时
    2015年读书清单
    循序渐进的敏捷-每日例会
    循序渐进的敏捷-交叉测试
    对一次系统上线的思考-走出“舒适区”
    单点登录(SSO)系统的总结
    对一个同事项目的思考和总结
    关于福建出差的总结
    由错误处理引发的联想-防御式编程
    关于日志记录的总结
  • 原文地址:https://www.cnblogs.com/z1298703836/p/4651214.html
Copyright © 2020-2023  润新知