Triggers 关系数据库触发器中的线程安全

Triggers 关系数据库触发器中的线程安全,triggers,thread-safety,relational-database,Triggers,Thread Safety,Relational Database,我对mariadb或mysql等关系数据库中触发器操作的线程安全性有疑问 想象一下一个像这样的桌子结构 +----+-------+----------+--------+ | ID | NAME | CATEGORY | OFFSET | +----+-------+----------+--------+ | 1 | name1 | CAT_1 | 0 | +----+-------+----------+--------+ | 2 | name2 | CAT_1

我对mariadb或mysql等关系数据库中触发器操作的线程安全性有疑问

想象一下一个像这样的桌子结构

+----+-------+----------+--------+
| ID | NAME  | CATEGORY | OFFSET |
+----+-------+----------+--------+
| 1  | name1 | CAT_1    | 0      |
+----+-------+----------+--------+
| 2  | name2 | CAT_1    | 1      |
+----+-------+----------+--------+
| 3  | name3 | CAT_2    | 0      |
+----+-------+----------+--------+
| 4  | name4 | CAT_1    | 2      |
+----+-------+----------+--------+
| 5  | name5 | CAT_2    | 1      |
+----+-------+----------+--------+
请注意与类别相关的列偏移值。每次插入特定类型的记录时,偏移量增加1。 例如,CAT_1类型的id=6的下一条记录的偏移量值为3 id=7的CAT_2类型记录的偏移量为2

新记录将通过RESTAPI插入,并且需要在响应中返回id和偏移量。 现在这个进程需要有线程安全性,即同一类别的两个记录(即使通过HTTP请求对API并发调用)都不应该有相同的偏移量值

我想到的一种方法是通过一个before_insert触发器,它将读取to_be_insert类别的最后一个偏移量值,并插入一个+1的新记录

我不确定的是这个进程是否是线程安全的。 是否会导致相同类别的两个同时插入将执行触发器,读取相同的先前偏移值并计算相同的当前偏移

如果是,那么线程安全的方法是什么


任何帮助都将不胜感激

是的,
偏移量
这样会自找麻烦。不要放置偏移量,而是放置时间戳——这不依赖于表中的其他记录。然后,如果要计算偏移量,请通过按时间戳顺序排序的查询来计算偏移量。(触发前的
的唯一用途应该是验证,或格式化仅查看插入行的数据,而不是通过引用其他动态内容来操纵内容。)但根据我的要求,您可以按类别和偏移量查询表格,如列出偏移量10中类别cat_1的前100条记录。您的“要求”不是很好的设计。谁给你的?他们真正想要实现什么?你了解商业环境吗?或者是你的讲师在编造东西,因为他们从来没有在现实业务中工作过/使用过现实生活中的数据库?最糟糕的情况是,创建一个
视图
,并根据
时间戳
计算偏移量。这是只读的,在更新后计算,所以不会影响insert的性能/不会危及线程安全或争用条件。