zoukankan      html  css  js  c++  java
  • 在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可能会在行上设置的锁定同样的锁定。

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

  • 相关阅读:
    【转】linux之fsck命令
    【转】linux之mkfs/mke2fs格式化
    【转】linux_fdisk命令详解
    【转】linux之ln命令
    [转]linux的du和df命令
    [转]Linux之type命令
    [转]Linux下which、whereis、locate、find 命令的区别
    [转]Linux的chattr与lsattr命令详解
    get 与post 的接收传值方式
    在asp.net前台页面中引入命名空间 和连接数据库
  • 原文地址:https://www.cnblogs.com/zhangyingai/p/7096324.html
Copyright © 2011-2022 走看看