我在MySQL数据库中有一个函数,用于确定移动设备的某些同步参数。该函数确定用户与数据库同步的最后日期/时间。在我的同步操作期间,我将此服务器端功能调用两次。一旦我第二次调用它 - 整个Sync_Records表被锁定。我无法在任何地方从任何其他连接写入它(注意,在第一次调用后,表未锁定)。我将函数更改为过程 - 一切都很好 - 第二次调用后没有锁定。整个同步操作(包括对函数/过程的两次调用)都在事务中。这是一张InnoDb表。
函数/过程只执行两个select语句。它们将结果存储在局部变量中,然后返回日期时间变量。我不明白为什么这些表被锁定了。有没有人有任何想法?
答案 0 :(得分:3)
在stored program restrictions部分
中指定存储函数在执行之前获取表锁,以避免由于语句执行顺序与日志中出现的顺序不匹配而导致二进制日志不一致。当使用基于语句的二进制日志记录时,将记录调用函数的语句,而不是在函数内执行的语句。 ...
相反,存储过程不会获取表级锁。存储过程中执行的所有语句都写入二进制日志,即使是基于语句的二进制日志记录