MySQL執(zhí)行大事務(wù)會(huì)存在什么問(wèn)題?
前言
之前在如何實(shí)現(xiàn)百萬(wàn)級(jí)數(shù)據(jù)從Excel導(dǎo)入中有提到一句不建議利用大事務(wù)進(jìn)行一個(gè)錯(cuò)誤處理。為什么不建議呢。本次來(lái)簡(jiǎn)單說(shuō)一下。
所謂大事務(wù),通常指包含大量要執(zhí)行的SQL語(yǔ)句和較長(zhǎng)執(zhí)行時(shí)間的事務(wù)。
這樣的大事務(wù)往往會(huì)帶來(lái)諸多問(wèn)題。如下:
- 占用數(shù)據(jù)庫(kù)連接:這一點(diǎn)很好理解。隨著SQL語(yǔ)句的增多,執(zhí)行時(shí)間也會(huì)相應(yīng)延長(zhǎng)。大型事務(wù)會(huì)持續(xù)占用數(shù)據(jù)庫(kù)連接,由于數(shù)據(jù)庫(kù)連接資源有限,長(zhǎng)時(shí)間占用可能導(dǎo)致其他事務(wù)無(wú)法獲取連接,從而降低系統(tǒng)的吞吐量,影響系統(tǒng)的可用性。
- 難以回滾:大事務(wù)涉及的數(shù)據(jù)量較大,回滾操作可能變得異常耗時(shí)。若事務(wù)需要回滾或失敗,可能需要花費(fèi)大量時(shí)間才能完全撤銷(xiāo)所有修改,對(duì)數(shù)據(jù)庫(kù)的可靠性和性能造成不利影響。
- 鎖競(jìng)爭(zhēng):大事務(wù)可能引發(fā)繁瑣的寫(xiě)操作,導(dǎo)致數(shù)據(jù)的鎖定。這可能導(dǎo)致其他并發(fā)事務(wù)在訪問(wèn)相同資源時(shí)遭遇鎖競(jìng)爭(zhēng),進(jìn)而造成性能下降和延遲增加。長(zhǎng)時(shí)間的鎖定還可能導(dǎo)致其他事務(wù)的等待和阻塞。
- 日志空間占用:大事務(wù)可能產(chǎn)生大量日志,特別是 binlog。當(dāng)單個(gè)事務(wù)超出最大允許的Binlog文件大小限制(max_binlog_cache_size),會(huì)出現(xiàn)錯(cuò)誤:Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
解決方案:
拆分事務(wù),將大事務(wù)分解為多個(gè)小事務(wù)。將不需要在事務(wù)中執(zhí)行的操作(如讀取、內(nèi)存計(jì)算、I/O操作、遠(yuǎn)程調(diào)用等)移到事務(wù)外部處理。