如何在共享数据库中使用jdbcTemplate处理select-or-insert操作

时间:2017-04-07 11:38:38

标签: sql spring transactions locking

我有一些基本案例,我很欣赏如何处理这个问题......

现有数据库中有some_table,有两列:

  • 自动递增的密钥
  • 和描述条目的name

我使用Spring 4和jdbcTemplate来处理数据库操作。

  1. 应用程序实例A:
    • 搜索名称为SELECT * FROM some_table WHERE name='name1'的条目
      • 如果找到一个得到它的钥匙
      • 如果没有,则会创建新条目INSERT INTO some_table (name) VALUES ('name1')
        • 然后它获得了它的关键
    • 使用检索到的密钥进行进一步处理......
  2. 实例B可以同时执行相同的操作。
  3. 因此,两个应用程序可能会同时执行SELECT同一个名称,此时此类名称不存在,然后这两个应用程序将INSERT具有相同名称和不同键的新条目

    如何同步它们 - 这里的最佳做法是什么?应用程序可以以某种方式锁定some_table,直到它创建新条目或确定它没有必要然后释放锁定?是否可以使用Spring jdbcTemplate执行此操作?怎么样?

    对于我来说,似乎有一些基本情况,可能有一些模式,我不想重新发明轮子......任何提示?

    或许2个应用程序直接使用一个数据库实例的整个想法是一个完全的设计缺陷?

1 个答案:

答案 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'

现在每个应用程序都可以执行:

  • INSERT IF NOT NOT EXIST whit name =' name1'
  • 选择name =' name1',获取其密钥并将其用于进一步处理......

其中只有一个会创建新条目,因此不会出现重复项。

现在我需要一些解决方案,其中name应该作为唯一标识符生成,因此检索到的相同密钥不应该被2个应用程序实例使用...