在mysql 中两种锁定问题

Posted 张英爱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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可能会在行上设置的锁定同样的锁定。

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

 










以上是关于在mysql 中两种锁定问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库锁定机制

MySQL锁机制

MySQL存储引擎 -- MyISAM(表锁定) 与 InnoDB(行锁定) 锁定机制

数据库锁机制

论MySQL数据库中两种数据引擎的差别

SQL Server 中两种选择所有列的区别? [复制]