在高并发的情况下,即使我在工作流中定义了先查询数据是否为空,再执行数据插入操作,还是会出现重复插入数据的情况。我想咨询一下工作流是否支持数据库的事务锁,或者有其它的方法来避免数据的重复插入么?
目前工作流中默认启用了数据库事务,但事务级别是 read-uncommited,所以在高并发情况下的确可能出现别的工作流重复插入。未来会规划更细粒度的事务控制域管理,在其之前,暂时可以考虑通过部分唯一约束来解决重复插入的问题。
那是否可以使用sql操作节点,编写事务锁及查询、插入逻辑
可以使用,不过 SQL 节点启用的事务会与工作流默认的事务不会是同一个,在使用时需要自行管理,避免事务不一致的问题。
您好,再咨询个问题,如果我通过sql节点配置创建的数据,是否能触发监听数据表新增数据的工作流?
不能。文档的“数据表触发器”相关章节有相关介绍:https://docs-cn.nocobase.com/handbook/workflow/triggers/collection#非应用内的数据操作不会触发
就是说我一旦使用了sql节点,后续关联操作就只能在sql里写逻辑了……。
近期发现个新问题,我在数据库创建的唯一索引会被自动删除,现在的版本更新到了:v1.4.0-alpha.20240920013821
数据库binlog
# at 793033039
#240925 14:06:32 server id 1 end_log_pos 793033116 CRC32 0x09a4ac98 Anonymous_GTID last_committed=939269 sequence_number=939270 rbr_only=no original_committed_timestamp=1727244392821521 immediate_commit_timestamp=1727244392821521 transaction_length=211
# original_commit_timestamp=1727244392821521 (2024-09-25 14:06:32.821521 CST)
# immediate_commit_timestamp=1727244392821521 (2024-09-25 14:06:32.821521 CST)
/*!80001 SET @@session.original_commit_timestamp=1727244392821521*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 793033116
#240925 14:06:32 server id 1 end_log_pos 793033250 CRC32 0xf7764e7a Query thread_id=119270 exec_time=0 error_code=0 Xid = 3175197
SET TIMESTAMP=1727244392/*!*/;
DROP INDEX `idx_title_status` ON `cases`
/*!*/;
# at 793033250
#240925 14:06:35 server id 1 end_log_pos 793033329 CRC32 0x4b63a481 Anonymous_GTID last_committed=939270 sequence_number=939271 rbr_only=yes original_committed_timestamp=1727244395060362 immediate_commit_timestamp=1727244395060362 transaction_length=8012
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1727244395060362 (2024-09-25 14:06:35.060362 CST)
# immediate_commit_timestamp=1727244395060362 (2024-09-25 14:06:35.060362 CST)
/*!80001 SET @@session.original_commit_timestamp=1727244395060362*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 793033329
如果是系统上存在的字段,系统上无法修改唯一,你可以找一个或已配置唯一的表的字段,然后去数据库里研究一下,它好像在数据库的某个表里有配置,才能在系统显示唯一,你可以参照进行配置
这个事务锁的功能啥时候能加上,我现在在数据库添加的唯一索引总是被nocobase删掉(目前发现触发删除唯一索引的操作是添加排序字段,添加关系字段)。一旦唯一索引被删除,就会出现重复数据,我只能去到数据库进行手动删除后,然后再配置唯一索引。
还有什么办法能解决这个问题么?