fix(hook-bus): write_to_flat 改用 TMDO_DB::upsert(B4)

原本 SELECT id → UPDATE/INSERT 三步,並發寫入同一 entity 會產生
duplicate row 或互相覆蓋。改為單一 upsert(A v3.1.7 同款)。

unit 379 / integration 398 GREEN

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TbG1keQQ7XBa7qMQY16KCY
This commit is contained in:
2026-07-31 05:35:20 +08:00
parent 59f3b19ce6
commit caf0351294
+10 -27
View File
@@ -321,35 +321,18 @@ final class TMDO_Hook_Bus {
self::$internal_ops[ $lock_key ] = true;
try {
// 檢查列是否存在
$exists = $wpdb->get_var(
$wpdb->prepare(
"SELECT id FROM `{$table}` WHERE `{$id_col}` = %d",
$entity_id
)
// 單一 upsert,避免 SELECT→UPDATE/INSERT 的 read-modify-write race。
$result = TMDO_DB::upsert(
$table,
array(
$id_col => $entity_id,
$col => $db_value,
),
array( $col ),
$id_col,
array( '%d', $format )
);
if ( $exists ) {
// UPDATE
$result = $wpdb->update(
$table,
array( $col => $db_value ),
array( $id_col => $entity_id ),
array( $format ),
array( '%d' )
);
} else {
// INSERT
$result = $wpdb->insert(
$table,
array(
$id_col => $entity_id,
$col => $db_value,
),
array( '%d', $format )
);
}
// 清除快取
TMDO_Cache_Orchestrator::invalidate( $type, $entity_id, $group );