mysql存储过程事务处理、异常处理及日志记录综合实践

创建日志记录表

# 日志记录表
CREATE TABLE `zb_abc`.`zb_log_proc_exec`  (
  `uuid_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行主键',
  `proc_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '刷新的存储过程',
  `begin_time` datetime(0) NULL DEFAULT NULL COMMENT '开始时间',
  `end_time` datetime(0) NULL DEFAULT NULL COMMENT '结束时间',
  `exec_status` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行状态',
  `exec_cost_time_s` float NULL DEFAULT NULL COMMENT '执行时间,秒',
  `exec_error` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行异常',
  PRIMARY KEY (`uuid_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '日志记录' ROW_FORMAT = Compact;

创建存储过程

CREATE DEFINER=`zb_abc`@`%` PROCEDURE `zb_bd_store_mer`(
  
)
BEGIN
	#Routine body goes here...
	# 设置异常-异常变量
	DECLARE result_code INTEGER DEFAULT 0; -- 定义返回结果并赋初值0
	# 设置变量
  DECLARE v_exec_second float;# 执行秒数
	DECLARE v_uuid_code varchar(50);# 执行编码
  declare v_begin_time datetime;# 开始时间
	declare v_end_time datetime;# 结束时间
	
	# 设置异常-异常编码定义
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result_code= 1; -- 在执行过程中出任何异常设置result_code为1
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET result_code = 2; -- 如果表中没有下一条数据则置为2
	# 业务处理过程中可以根据实际情况自定义result_code
	
	# 记录日志--开始	
	set v_uuid_code = uuid();# 执行记录编码
	set v_begin_time = now();# 执行开始时间
	insert into zb_log_proc_exec(
	  uuid_code,
		proc_name,# 存储过程名
		begin_time
	)
	values (
		v_uuid_code,
		'zb_bd_store_mer',
		v_begin_time
	);
	
	/* 具体的业务处理-开始------------------------------------*/	
	START TRANSACTION; -- 开始事务
	
	# 具体的业务代码在这里实现		

	
	/* 具体的业务处理-结束------------------------------------*/
	
	IF result_code = 1 THEN -- 可以根据不同的业务逻辑错误返回不同的result_code,这里只定义了1和0
		ROLLBACK; # 异常回滚
		# 记录日志-异常
		set v_end_time = now();# 结束时间
		set v_exec_second = timestampdiff(SECOND,v_begin_time,v_end_time);# 用时-秒
		
		update zb_log_proc_exec
		set 
			end_time = v_end_time,
			exec_status = 'N',
			exec_cost_time_s = v_exec_second,
			exec_error = '发生了异常1'
		where uuid_code = v_uuid_code;
	
	ELSEIF result_code = 2 THEN 
	  ROLLBACK;# 异常回滚
		
		# 记录日志-异常
		set v_end_time = now();# 结束时间
		set v_exec_second = timestampdiff(SECOND,v_begin_time,v_end_time);# 用时-秒
		
		update zb_log_proc_exec
		set 
			end_time = v_end_time,
			exec_status = 'N',
			exec_cost_time_s = v_exec_second,
			exec_error = '发生了异常2'
		where uuid_code = v_uuid_code;
	ELSE 	
		commit;# 正常提交
	
	 	# 记录日志-正常
		set v_end_time = now();# 结束时间
		set v_exec_second = timestampdiff(SECOND,v_begin_time,v_end_time);# 用时-秒
		
		update zb_log_proc_exec
		set 
			end_time = v_end_time,
			exec_status = 'Y',
			exec_cost_time_s = v_exec_second
		where uuid_code = v_uuid_code;
	END IF;
	
	commit;# 一切正常,提交事务 
  select result_code;
END

调试存储过程


# 查看日志记录表日志
select * from zb_log_proc_exec

# 调用存储过程
call zb_bd_store_mer()

你可能感兴趣的:(mysql,事务处理,异常处理,日志记录,MySQL)