Mysql事務(wù)操作失敗如何解決
Mysql事務(wù)操作失敗如何解決
事務(wù)的原子性 :事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,事務(wù)中包含的各操作要么都做,要么都不做 。
要實(shí)現(xiàn)事務(wù)的原子性,單單靠一條commit或是rollback命令還是不行的,因?yàn)槔鏲ommit命令它只是將一個(gè)事務(wù)中執(zhí)行成功的DML語(yǔ)句提交給數(shù)據(jù)庫(kù)里。如果要實(shí)現(xiàn)事務(wù)的原子性,則就需要commit和rollback命令配合上程序上的一個(gè)業(yè)務(wù)邏輯才能可以,具體業(yè)務(wù)邏輯代碼如下示例代碼:
1.現(xiàn)象
程序中打開了事務(wù)進(jìn)行插入,但是沒有commit,表中的數(shù)據(jù)已經(jīng)存在,就是回滾也不能刪除插入的數(shù)據(jù)
2.原因
本表的Storage Engine 為myisam,不是innoDB,不支持事務(wù)處理 rollback()
3.解決方法
使用 alter table xxxx engine = innoDB ; 將表改為 InnoDB 引擎,結(jié)果回滾正常。
4.代碼
private void testCrud() { Connection conn = null; //連接對(duì)象 PreparedStatement pstmt = null; //預(yù)編譯的SQL語(yǔ)句對(duì)象 try{ //加載MySQL驅(qū)動(dòng)程序 Class.forName("com.mysql.jdbc.Driver"); //連接字符串 String url = "jdbc:mysql://localhost:3306/test"; //建立數(shù)據(jù)庫(kù)連接 conn = DriverManager.getConnection(url,"root",""); //設(shè)置事務(wù)的隔離級(jí)別 // conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ); //設(shè)置自動(dòng)提交為false,開始事務(wù) conn.setAutoCommit(false); //帶參數(shù)的更新語(yǔ)句 String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)"; //準(zhǔn)備語(yǔ)句 pstmt = conn.prepareStatement(sql); //綁定參數(shù),執(zhí)行更新語(yǔ)句,將張三的賬戶金額減去1000元 pstmt.setString(1, "zhangui"); pstmt.setString(2, "1111"); pstmt.setInt(3, 300); pstmt.execute(); //綁定參數(shù),執(zhí)行更新語(yǔ)句,將李四的賬戶金額增加1000元 // pstmt.setString(1, "zzzzzzzzzzzzzzzzz"); //綁定了非法參數(shù) //pstmt.setString(2, "1111111111"); //pstmt.setInt(3, 500); //pstmt.execute(); //將拋出SQL異常 //提交事務(wù) //conn.commit(); System.out.println("事務(wù)已提交,轉(zhuǎn)賬成功!"); //關(guān)閉語(yǔ)句、連接 pstmt.close(); conn.close(); }catch(Exception e){ try{ conn.rollback(); //回滾事務(wù) System.out.println("事務(wù)回滾成功,沒有任何記錄被更新!"); }catch(Exception re){ System.out.println("回滾事務(wù)失??!"); } e.printStackTrace(); }finally{ if(pstmt!=null) try{pstmt.close();}catch(Exception ignore){} if(conn!=null) try{conn.close();}catch(Exception ignore){} } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Mysql事務(wù)處理詳解
- 通過(guò)實(shí)例分析MySQL中的四種事務(wù)隔離級(jí)別
- 解決Mysql收縮事務(wù)日志和日志文件過(guò)大無(wú)法收縮問題
- mysql的存儲(chǔ)過(guò)程、游標(biāo) 、事務(wù)實(shí)例詳解
- PHP mysqli事務(wù)操作常用方法分析
- MySQL四種事務(wù)隔離級(jí)別詳解
- NodeJs使用Mysql模塊實(shí)現(xiàn)事務(wù)處理實(shí)例
- MySQL數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別詳解
- MySQL事務(wù)的基礎(chǔ)學(xué)習(xí)以及心得分享
相關(guān)文章
mysql 實(shí)現(xiàn)添加時(shí)間自動(dòng)添加更新時(shí)間自動(dòng)更新操作
這篇文章主要介紹了mysql 實(shí)現(xiàn)添加時(shí)間自動(dòng)添加更新時(shí)間自動(dòng)更新操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01MySql插入數(shù)據(jù)成功但是報(bào)[Err] 1055錯(cuò)誤的解決方案
這篇文章主要介紹了MySql插入數(shù)據(jù)成功但是報(bào)[Err] 1055錯(cuò)誤的解決方案,需要的朋友可以參考下2017-08-08如何使用MySQL一個(gè)表中的字段更新另一個(gè)表中字段
這篇文章主要介紹了如何使用MySQL一個(gè)表中的字段更新另一個(gè)表中字段,需要的朋友可以參考下2018-11-11mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)超鍵、候選鍵、主鍵與外鍵的使用
數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),關(guān)鍵字的概念至關(guān)重要,本文就來(lái)介紹一下mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)超鍵、候選鍵、主鍵與外鍵的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09CentOS7.2虛擬機(jī)上安裝MySQL 5.6.32的教程
這篇文章主要介紹了CentOS7.2虛擬機(jī)上安裝MySQL 5.6.32的教程的相關(guān)資料,需要的朋友可以參考下2016-08-08MySQL無(wú)法啟動(dòng)1067錯(cuò)誤的又一種解決方法(機(jī)房斷電)
今早在對(duì)一張table 創(chuàng)建primay key過(guò)程中發(fā)生了斷電,當(dāng)電腦再次啟動(dòng)時(shí)候,發(fā)現(xiàn)mysql 服務(wù)無(wú)法啟動(dòng),使用 net start 提示 1067錯(cuò)誤,折騰了2個(gè)小時(shí)無(wú)法解決,后來(lái)只能通過(guò)手工刪除數(shù)據(jù)文件,日志文件,再啟動(dòng)服務(wù),然后導(dǎo)入數(shù)據(jù)來(lái)完成2013-01-01MYSQL METADATA LOCK(MDL LOCK) 理論及加鎖類型測(cè)試
這篇文章主要介紹了MYSQL METADATA LOCK(MDL LOCK)的內(nèi)容,有理論知識(shí)和加鎖類型測(cè)試的以下代碼,感興趣的朋友請(qǐng)參考下午文2021-09-09PureFTP借助MySQL實(shí)現(xiàn)用戶身份驗(yàn)證的操作教程
這篇文章主要介紹了PureFTP借助MySQL實(shí)現(xiàn)用戶身份驗(yàn)證的操作教程,就像普通程序中的用戶注冊(cè)功能那樣為用戶登陸數(shù)據(jù)信息建立一個(gè)數(shù)據(jù)庫(kù)來(lái)進(jìn)行驗(yàn)證,需要的朋友可以參考下2015-12-12