我有两个表:一个存储数据,另一个存储锁以指示用户何时对该数据进行操作。我想从第一个表中选择一些项,使它们匹配几个条件,并且在另一个表中没有相应的锁,然后将这些项的锁添加到第二个表中。由于许多用户可能同时试图锁定项目,因此有必要以原子方式完成此操作。
我编写了下面的SQL语句来尝试这样做,但是我收到了错误Deadlock found when trying to get lock;。
INSERT INTO table2 (id, user, date)
SELECT id, ?, NOW()
FROM table1
LEFT JOIN table2 USING id
我正在尝试编写Mysql查询。我在select函数的子句上有一些错误。
这是示例查询:
CREATE TRIGGER SAMPLE BEFORE INSERT ON SERVER
FOR EACH ROW
BEGIN
IF ((SELECT COUNT(S.ID) FROM SERVER S WITH UR) >= (SELECT L.SERVERS FROM SAMPLE L WHERE L.ID = 1 LIMIT 1)) THEN
SIGNAL SQLSTATE '73550' SET MESSAGE_TEXT='+ID
大多数RDBMS允许在所选行上获取独占锁上的共享锁。例如,PostgreSQL具有如下语法:
SELECT *
FROM post
WHERE id=10
FOR SHARE;
使用共享时,即使在READ_COMMITTED隔离级别,我们也可以获得共享锁,并且无需实际使用REPEATABLE_READ事务隔离,就可以防止不可重复的读取现象。
但是为了防止幻影阅读,SERIALIZABLE是唯一的方法。为什么没有显式锁定语法来获取谓词锁?
据我所知,我不记得在Oracle、Server、MySQL或PostgreSQL中看到过任何这样的构造。
所以我正在考虑构建一个内容管理系统,我希望它的设计能让插件可以很容易地扩展它的功能(我也在做钩子系统和语言设置)。
这里是棘手的部分:我不是一个单独打包的CMS,而是试图为许多站点(例如mycms.com/your-site)创建一种主机。
我正在设计具有如下结构的MySQL数据库:
pages
- id
- slug
- title
- content
- site // The site id
sites
- id
- path // e.g. your-site
- password // hash
然后我会在文件结构中存储像这样的插件:
plugins/
42/
我需要每天获取所有过期客户的列表,并将它们插入到新表中,然后我需要将日期移动到一个月,以便下个月再次处理它们。
目前,我正在连续运行2个SQL查询
insert into history select * from customers where nextdate<CURDATE()
update customers set nextdate=calculation() where nextdate<CURDATE()
但有时客户会更新,但不会被插入到历史记录中。
在认为更新在mysql完成select之前就开始运行。
我正在使用Node,这是我当前用于序列化的方法,即我正在从in