Mysql事務操作失敗如何解決
Mysql事務操作失敗如何解決
事務的原子性 :事務是數(shù)據(jù)庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做 。
要實現(xiàn)事務的原子性,單單靠一條commit或是rollback命令還是不行的,因為例如commit命令它只是將一個事務中執(zhí)行成功的DML語句提交給數(shù)據(jù)庫里。如果要實現(xiàn)事務的原子性,則就需要commit和rollback命令配合上程序上的一個業(yè)務邏輯才能可以,具體業(yè)務邏輯代碼如下示例代碼:
1.現(xiàn)象
程序中打開了事務進行插入,但是沒有commit,表中的數(shù)據(jù)已經(jīng)存在,就是回滾也不能刪除插入的數(shù)據(jù)
2.原因
本表的Storage Engine 為myisam,不是innoDB,不支持事務處理 rollback()
3.解決方法
使用 alter table xxxx engine = innoDB ; 將表改為 InnoDB 引擎,結果回滾正常。
4.代碼
private void testCrud() {
Connection conn = null; //連接對象
PreparedStatement pstmt = null; //預編譯的SQL語句對象
try{
//加載MySQL驅動程序
Class.forName("com.mysql.jdbc.Driver");
//連接字符串
String url = "jdbc:mysql://localhost:3306/test";
//建立數(shù)據(jù)庫連接
conn = DriverManager.getConnection(url,"root","");
//設置事務的隔離級別
// conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);
//設置自動提交為false,開始事務
conn.setAutoCommit(false);
//帶參數(shù)的更新語句
String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)";
//準備語句
pstmt = conn.prepareStatement(sql);
//綁定參數(shù),執(zhí)行更新語句,將張三的賬戶金額減去1000元
pstmt.setString(1, "zhangui");
pstmt.setString(2, "1111");
pstmt.setInt(3, 300);
pstmt.execute();
//綁定參數(shù),執(zhí)行更新語句,將李四的賬戶金額增加1000元
// pstmt.setString(1, "zzzzzzzzzzzzzzzzz"); //綁定了非法參數(shù)
//pstmt.setString(2, "1111111111");
//pstmt.setInt(3, 500);
//pstmt.execute(); //將拋出SQL異常
//提交事務
//conn.commit();
System.out.println("事務已提交,轉賬成功!");
//關閉語句、連接
pstmt.close(); conn.close();
}catch(Exception e){
try{
conn.rollback(); //回滾事務
System.out.println("事務回滾成功,沒有任何記錄被更新!");
}catch(Exception re){
System.out.println("回滾事務失??!");
}
e.printStackTrace();
}finally{
if(pstmt!=null) try{pstmt.close();}catch(Exception ignore){}
if(conn!=null) try{conn.close();}catch(Exception ignore){}
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
MYSQL中查詢LONGBLOB類型數(shù)據(jù)的大小的詳細示例
在MySQL中,LONGBLOB?是一種二進制大對象(BLOB)數(shù)據(jù)類型,用于存儲大量的二進制數(shù)據(jù),但是,LONGBLOB?數(shù)據(jù)類型本身并不直接存儲數(shù)據(jù)的大小(長度),它存儲的是二進制數(shù)據(jù)的實際內(nèi)容,這篇文章主要介紹了MYSQL中怎么查詢LONGBLOB類型數(shù)據(jù)的大小,需要的朋友可以參考下2024-06-06
MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法淺析
刪除現(xiàn)有MySQL表非常容易,但是刪除任何現(xiàn)有的表時要非常小心,因為刪除表后丟失的數(shù)據(jù)將無法恢復,下面這篇文章主要給大家介紹了關于MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法的相關資料,需要的朋友可以參考下2022-08-08
MySQL5.6.31 winx64.zip 安裝配置教程詳解
這篇文章主要介紹了MySQL5.6.31 winx64.zip 安裝配置教程詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02
MySQL數(shù)據(jù)庫優(yōu)化技術之索引使用技巧總結
這篇文章主要介紹了MySQL數(shù)據(jù)庫優(yōu)化技術之索引使用方法,結合實例形式總結分析了MySQL表的優(yōu)化、索引設置、SQL優(yōu)化等相關技巧,非常具有實用價值,需要的朋友可以參考下2016-07-07
mysql數(shù)據(jù)存儲過程參數(shù)實例詳解
這篇文章主要介紹了mysql數(shù)據(jù)存儲過程參數(shù)實例詳解,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10

