ref-1:問題** [支付系統資料庫設計的關鍵問題 ]
ref-2:
[golang 用go-sql-driver 呼叫mysql儲存過程時的問題排查]
編輯檔案src/github.com/go-sql-driver/mysql/packets.go檔案,在函式writeauthpacket(cipher byte) (大約在210行)的客戶端標誌位處新增下面兩個標誌:
func (mc *mysqlconn) writeauthpacket(cipher byte) error
-- 單行執行以下語句
set names utf8;
-- dsp_settle資料庫
use dsp_settle;
drop procedure
ifexists
settle_balance_deduction;
-- [1]設定分隔符為//
delimiter //
--[2] 執行source /path/to/procedure.sql; !!! error
--[2]copy /path/to/procedure.sql
toconsole
andenter
--[3]還原分隔符
delimiter ;
--[4]呼叫示例
call settle_balance_deduction(5372539, 1234, 100, @out_status);
select @out_status;
-- 其他常用操作
-- 調研儲存過程
call procedure_name(parameters);
-- 查詢儲存過程
show procedure
status;
-- 顯示乙個儲存過程詳情
show create
procedure
procedure_name;
-- 刪除儲存過程
drop procedure
procedure_name;
儲存過程**
-- 建立儲存過程
create procedure settle_balance_deduction (in_userid bigint, in_planid int, in_money int, out out_status int )
begin
-- 變數 使用者實際餘額
declare account_balance int;
start transaction;
select balance into account_balance from dsp_settle.user_balance where userid = in_userid and status =0 and isdelete =0 for update;
if account_balance >= in_money then
-- 扣費操作
update user_balance set balance = balance - in_money, opuserid =1001 where userid = in_userid;
-- 扣費記錄
insert into dsp_settle.charge_record(userid, planid, charge, opuserid, addtime) values (in_userid, in_planid, in_money,1001, now());
-- 提交事務處理
commit;
-- 返回結果狀態1
set out_status =1;
else
-- 餘額小於扣費額,不操作
rollback;
-- 返回結果狀態0
set out_status =0;
end if;
end //
go呼叫儲存過程**,親測可用
)//扣費結算
func settle(userid int, planid int, charge int) int
defer db.close()
handle, err := db.prepare("call dsp_settle.settle_balance_deduction(?, ?, ?, @out_status)")
if err != nil
defer handle.close()
//call procedure
var result sql.result
result, err = handle.exec(userid, planid, charge)
if err != nil
fmt.println(result)
var sql string = "select @out_status as ret_status"
selectinstance, err := db.prepare(sql)
if err != nil
defer selectinstance.close()
var ret_status int
err = selectinstance.queryrow().scan(&ret_status)
if err != nil
fmt.println(ret_status)
return ret_status
}
golang mysql批量插入例項
業務邏輯 tcp接收訊息後,先將訊息儲存到資料庫再進行後續操作。問題 壓測發現,tcp連線非常多,訊息更多,每秒10000條訊息時,程式會記憶體溢位。解決 自然就想到了,問題出在不能及時把訊息處理掉的問題。所以先想能不能加快mysql的處理流程,可以定時批量插入代替及時插入。思路 1.接收tcp訊息...
儲存過程系列之儲存過程sql查詢儲存過程的使用
1.查詢某個表被哪些儲存過程 以下簡稱 sp 使用到 select distinct object name id from syscomments where id in select object id from sys.objects where type p and text like ta...
儲存過程系列之儲存過程sql查詢儲存過程的使用
1.查詢某個表被哪些儲存過程 以下簡稱 sp 使用到 select distinct object name id from syscomments where id in select object id from sys.objects where type p and text like ta...