来自存储函数的 MySQL 锁定表



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

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

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

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

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

最新更新