【 使用环境 】生产环境
【 OB or 其他组件 】5.7.25-OceanBase_CE-v4.3.3.0
【 使用版本 】5.7.25-OceanBase_CE-v4.3.3.0
【问题描述】触发器会根据订单金额统计用户的充值金额,发现异常,添加日志后,发现很久之前的订单还会自动触发触发器。
【复现路径】问题出现前后相关操作
1038358873200662614-18 实际支付时间是2024-11-05 19:47:59 可是6号 11:30:03 ,12:30:03 ,13:30:03 都触发器,系统逻辑昨天的数据昨天已经入库了 今天不会入库 所以不会触发触发器 而且表有唯一键约束,单笔也只会入库成功一次。
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
CREATE TABLE pay_success_flow
(
event_time
int(11) DEFAULT NULL COMMENT ‘事件时间’,
mfr_id
int(11) DEFAULT NULL COMMENT ‘流水标识’,
account_id
bigint(20) DEFAULT NULL COMMENT ‘账号id’,
uid
bigint(20) DEFAULT NULL COMMENT ‘用户游戏uid’,
channel_id
varchar(20) DEFAULT NULL COMMENT ‘渠道id’,
product_id
varchar(40) DEFAULT NULL COMMENT ‘商品id’,
out_trade_no
varchar(40) DEFAULT NULL COMMENT ‘订单id’,
total_amount
double DEFAULT NULL COMMENT ‘金额’,
subject
varchar(64) DEFAULT NULL COMMENT ‘商品标题’,
os_type
smallint(6) DEFAULT NULL COMMENT ‘客户系统类型’,
flag
tinyint(4) DEFAULT NULL COMMENT ‘标记’,
install_source
tinyint(4) DEFAULT NULL COMMENT ‘安装源’,
pay_mode
tinyint(4) DEFAULT NULL COMMENT ‘支付方式’,
pay_sdk_type
tinyint(4) DEFAULT NULL COMMENT ‘支付SDK类型’,
pay_platform
tinyint(4) DEFAULT NULL COMMENT ‘支付平台’,
order_number
varchar(50) DEFAULT NULL COMMENT ‘外部订单号’,
first_charge_time
int(11) DEFAULT NULL COMMENT ‘首次付费时间’,
start_time
bigint(20) DEFAULT NULL COMMENT ‘购买开始时间’,
biz
int(11) DEFAULT NULL COMMENT ‘商品类型’,
extra
varchar(512) DEFAULT NULL COMMENT ‘商品ID’,
plat_trade_no
varchar(64) DEFAULT NULL COMMENT ‘平台订单id’,
src_amount
double DEFAULT NULL COMMENT ‘原始金额’,
UNIQUE KEY uk_out_trade_no
(out_trade_no
) BLOCK_SIZE 16384 LOCAL,
KEY ix_event_time
(event_time
) BLOCK_SIZE 16384 LOCAL,
KEY ix_account_id
(account_id
) BLOCK_SIZE 16384 LOCAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 COMMENT = ‘支付成功流水’;
– 定义触发器
DELIMITER //
CREATE TRIGGER sp_update_user_pay_data
AFTER INSERT ON pay_success_flow
FOR EACH ROW begin
CALL sp_update_user_pay_data(NEW.out_trade_no, NEW.account_id, NEW.uid, NEW.total_amount, NEW.src_amount, NEW.channel_id, NEW.pay_sdk_type, FROM_UNIXTIME(NEW.event_time,'%Y-%m-%d'));
end; //
DELIMITER ;
– 存储过程
CREATE PROCEDURE sp_update_user_pay_data
(IN pout_trade_no
varchar(64),IN paccount_id
bigint(20),IN puid
bigint(20),IN ptotal_amount
double,IN psrc_amount
double,IN channel
varchar(32),IN ppay_sdk_type
int(10),IN eventTime
date)
MODIFIES SQL DATA
BEGIN
DECLARE sysGroupId SMALLINT(6) DEFAULT 0;
DECLARE userUid bigint DEFAULT 0;
DECLARE totalPay DOUBLE DEFAULT 0;
DECLARE totalDivide DOUBLE DEFAULT 0;
DECLARE playerMinimum SMALLINT(6) DEFAULT 0;
DECLARE playerMinimumNew SMALLINT(6) DEFAULT 0;
DECLARE effectTime date DEFAULT eventTime;
DECLARE device_model varchar(50) DEFAULT ‘’;
update data_bi_turtle.bi_user_pay set user_charged = CAST((user_charged) AS DECIMAL(18,2)) + CAST((psrc_amount) AS DECIMAL(18,2)),user_charged_num=user_charged_num+1 where uid = puid;
insert into data_bi_turtle.bi_user_pay_log(uid, account_id, user_charged, user_charged_num, out_trade_no, event_date)
SELECT uid, account_id, user_charged, user_charged_num,pout_trade_no, now() from data_bi_turtle.bi_user_pay where uid = puid;
END
【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)
@论坛小助手
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!