我有一些基本案例,我很欣赏如何处理这个问题......
现有数据库中有some_table
,有两列:
name
我使用Spring 4和jdbcTemplate
来处理数据库操作。
SELECT * FROM some_table WHERE name='name1'
的条目
INSERT INTO some_table (name) VALUES ('name1')
因此,两个应用程序可能会同时执行SELECT
同一个名称,此时此类名称不存在,然后这两个应用程序将INSERT
具有相同名称和不同键的新条目
如何同步它们 - 这里的最佳做法是什么?应用程序可以以某种方式锁定some_table
,直到它创建新条目或确定它没有必要然后释放锁定?是否可以使用Spring jdbcTemplate
执行此操作?怎么样?
对于我来说,似乎有一些基本情况,可能有一些模式,我不想重新发明轮子......任何提示?
或许2个应用程序直接使用一个数据库实例的整个想法是一个完全的设计缺陷?
答案 0 :(得分:0)
INSERT如果不存在使用互斥量表完成,在这种情况下似乎可以解决问题(找到here):
mutex
创建create table mutex(
i int not null primary key
);
insert into mutex(i) values (0), (1);
的地方如下:
GRANT SELECT, CREATE ON *.* TO 'myguy'@'thatmachine' IDENTIFIED BY PASSWORD '*12057DFA2BFBD8760D4788735B1C3E26889D7ECE' |
GRANT ALL PRIVILEGES ON `db1`.* TO 'myguy'@'thatmachine'
现在每个应用程序都可以执行:
其中只有一个会创建新条目,因此不会出现重复项。
现在我需要一些解决方案,其中name应该作为唯一标识符生成,因此检索到的相同密钥不应该被2个应用程序实例使用...