欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

MySQL查詢綁定,commit異常如何處理

林國瑞2年前28瀏覽0評論
MySQL查詢綁定,commit異常如何處理?

事務的原子性 :事務是數據庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做 。

要實現事務的原子性,單單靠一條commit或是rollback命令還是不行的,因為例如commit命令它只是將一個事務中執行成功的DML語句提交給數據庫里。如果要實現事務的原子性,則就需要commit和rollback命令配合上程序上的一個業務邏輯才能可以,具體業務邏輯代碼如下示例代碼:

1.現象

程序中打開了事務進行插入,但是沒有commit,表中的數據已經存在,就是回滾也不能刪除插入的數據

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";

//建立數據庫連接

conn = DriverManager.getConnection(url,"root","");

//設置事務的隔離級別

// conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);

//設置自動提交為false,開始事務

conn.setAutoCommit(false);

//帶參數的更新語句

String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)";

//準備語句

pstmt = conn.prepareStatement(sql);

//綁定參數,執行更新語句,將張三的賬戶金額減去1000元

pstmt.setString(1, "zhangui");

pstmt.setString(2, "1111");

pstmt.setInt(3, 300);

pstmt.execute();

//綁定參數,執行更新語句,將李四的賬戶金額增加1000元

// pstmt.setString(1, "zzzzzzzzzzzzzzzzz"); //綁定了非法參數

//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){}

}

}