0

我在 MySQL 数据库中有一个函数,可以确定移动设备的一些同步参数。该函数确定用户与数据库同步的最后日期/时间。在同步操作期间,我两次调用此服务器端函数。一旦我第二次调用它 - 整个 Sync_Records 表被锁定。我无法从任何地方的任何其他连接写入它(请注意,第一次调用后,表未锁定)。我将函数更改为过程 - 一切都很好 - 第二次调用后没有锁定。整个同步操作(包括对函数/过程的调用)都在一个事务中。这是一个 InnoDb 表。

该函数/过程只执行两个选择语句。他们将结果存储在局部变量中,然后返回日期时间变量。我不明白为什么桌子被锁定了。有没有人有任何想法?

4

1 回答 1

3

它在存储程序限制部分中指定

存储函数在执行前获取表锁,以避免由于语句执行顺序和出现在日志中的时间不匹配而导致二进制日志不一致。当使用基于语句的二进制日志时,会记录调用函数的语句,而不是函数内执行的语句。...

相反,存储过程不获取表级锁。在存储过程中执行的所有语句都写入二进制日志,即使是基于语句的二进制日志

于 2013-02-07T15:42:21.480 回答