程式狂想筆記

一個攻城師奮鬥史

0%

執行 SQL 做 rollback 方法 & 訂單編號高併發的小記

最近在想 phpmyadmin 到底能不能做到錯誤時 rollback
先講結論…應該是不行的
執行 phpmyadmin 時候好像沒被法判斷有沒有錯誤(指令的好像也一樣…)
有什麼新發現,之後再修改

我覺得最佳實例應該要用類似 DB client 執行
手動切換交易模式(把 autocommit 關掉)

執行每一段 SQL 後,確定 SQL 都執行正確

依照結果手動下 commit 或 rollback
改資料前可以先備份資料

stored procedure 可以做到
但因為沒什麼機會寫這個,所以先留著
sql - MySQL : transaction within a stored procedure - Stack Overflow
sql - try….catch in mysql for transaction? - Stack Overflow

isnert 失敗 auto_increment

1
ALTER TABLE tbl auto_increment = 1

但有部分答案建議不要調整 auto_increment
MySQL Auto Increment Columns on TRANSACTION, COMMIT, and ROLLBACK - Stack Overflow
transactions - MySQL AUTO_INCREMENT does not ROLLBACK - Stack Overflow

後來我想到 insert into xxx values( select max(xxx) + 1 from xxx,’test’ ); 會不會有高併發的問題 (其實很多程式都這樣寫)
之前類似寫過 MySQL(MariaDB) insert有關做相同表會遇到問題小記 | 程式狂想筆記

如何生產唯一訂單編號

額外新開一個 table ,做訂單編號處理
SELECT ... FOR UPDATR處理
一直看到公司有看到商品編號額外開了一個 table
現在有一種恍然大悟的感覺
但開發者沒有加 FOR UPDATE 後來的 commit 有補上 FOR UPDATE
相關 for update 處理

用 SELECT … FOR UPDATE 避免 Race condition @ Vexed’s Blog :: 隨意窩 Xuite日誌
MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 - 指尖下的幽灵 - 博客园

更好的方法還有透過 redis 去做
java web系统在高并发下如何实现订单号生成唯一? - 知乎 備份圖
Redis 高并发问题,及解决方案! - 简书 備份圖
分布式架构系统生成全局唯一序列号的一个思路 - 知乎 備份圖

其實這篇我原本主要是要紀錄 sql file 做 rollback
但沒想到…從isnert 失敗 auto_increment如何生產唯一訂單編號我覺得非常重要
就先記錄了

mysql 執行 .sql

How to Run SQL Text File on MySQL Command Prompt – TecAdmin