1. 程式人生 > >MySql 中的setAutoCommit方法

MySql 中的setAutoCommit方法

引言

setAutoCommit方法用一句話說就是用來保持事務完整性,一個系統的更新操作可能涉及多張表,這個時候,就需要用多個Sql語句來實現,實際上我覺得這個東西就是用來實現事務的。

當我們進行多條資料進行增刪改的時候,一旦在一句sql中出現了錯誤,就會出現有部分資料已經成功,而後面的資料就沒有辦法執行,這個時候,就會出現髒資料。

因此我們使用setAutoCommit方法,這個方法有一個引數,引數值為Boolean,當true的時候可啟用自動提交模式,false可禁用該模式。

註釋中有一句話是這樣說的:Newlycreated Connection objects are in auto-commit mode by default, which means thatindividual SQL statements are committed automatically when the statement iscompleted. To be able to group SQL statements intotransactions and commit them or roll them back as a unit, auto-commit must bedisabled by calling the method setAutoCommit with false as its argument. Whenauto-commit is disabled, the user must call either the commit or rollbackmethod explicitly to end a transaction.翻譯過來是這樣的:如果連線處於自動提交模式下,則其所有的SQL語句將作為單個事務執行並提交。否則,其SQL語句將作為事務組,直到呼叫Commit方法或rollback方法為止。預設情況下,新連線處於自動提交模式。

簡單來說,

下面的程式碼:

<span style="font-size:18px;">int[] result =null;
	    con.setAutoCommit(false);   
	    Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
	                                       ResultSet.CONCUR_READ_ONLY);   
	    String[] SqlString= null;
	    for(String strvalue : SqlString){   	    	
	       stmt.execute(strvalue);   
	    }   
	    con.commit(); 
	    return result;</span>

可以看到,如果程式碼沒有出錯,彈幕我們就執行Commit沒有問題,但是一旦出錯,我們應該執行資料的rollback,但是該程式碼沒有進行處理,這個時候,就會出現鎖,將表鎖住,這個鎖就沒有機會釋放。

因此,我們應該這樣寫:

<span style="font-size:18px;">    	 boolean result = false;
    	 try{
		    con.setAutoCommit(false);   
		    Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
		                                       ResultSet.CONCUR_READ_ONLY);   
		    String[] SqlString= null;
		    for(String strvalue : SqlString){   	    	
		    	result = stmt.execute(strvalue);   
		    }   
		    con.commit(); 
    	 }catch(Throwable e){
             if(con!=null){
                 try {
                     con.rollback();
                 } catch (SQLException e1) {
                     e1.printStackTrace();
                 }
             }
    	 }finally{
             if(con!=null){
                 try {
                     con.close();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
             }
    	 }
	    return result;</span>

因此,我們一定不要小看了這個問題,這個問題一旦出現,效能就會收到很大的影響。

如果我們將SQL語句作為單個事務進行處理的話:

<span style="font-size:18px;">  /**
     * 使用PreparedStatement加批量的方法
     * @return
     */
    public int[] executeUpdateMore(){    
    	int[] result=null;    	
    	try{   
    		PreparedStatement prest =con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    	     for(List sqlValueString : sqlValue){    	    
    	    	 for(int i=0;i<sqlValueString.size();i++){
    	     		try {
    	     			prest.setObject(i+1,sqlValueString.get(i));
    	 			} catch (SQLException e) {
    	 				// TODO Auto-generated catch block
    	 				e.printStackTrace();
    	 			}    	 				   	 			
    	     	}
    	    	prest.addBatch();
    	     }
    	     prest.executeBatch();  
    	 /*    con.commit();*/   
    	     this.closeAll(con, prest, null);
    	} catch (SQLException ex){   
    	  Logger.getLogger(Dbhelper.class.getName()).log(Level.SEVERE, null,ex);   
    	} 
    	return result;       
    } </span>

如果我們將SQL語句作為事務組來處理的話,我們就要這樣寫:
<span style="font-size:18px;">    /**
     * 使用PreparedStatement加批量的方法,strvalue:
     * "INSERT INTOadlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3','localhost','20081009',8,'23123')"
     * @return
     * @throws SQLException 
     */
    public boolean executeUpdateMoreNotAuto() throws SQLException{   
    	
    	 boolean result = false;
    	 try{
		    con.setAutoCommit(false);   
		    Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
		                                       ResultSet.CONCUR_READ_ONLY);   
		    String[] SqlString= null;
		    for(String strvalue : SqlString){   	    	
		    	result = stmt.execute(strvalue);   
		    }   
		    con.commit(); 
    	 }catch(Throwable e){
             if(con!=null){
                 try {
                     con.rollback();
                 } catch (SQLException e1) {
                     e1.printStackTrace();
                 }
             }
    	 }finally{
             if(con!=null){
                 try {
                     con.close();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
             }
    	 }
	    return result;
    }</span>

結束語:

一定要記住處理完之後要提交或者回滾奧!

相關推薦

mysqlifnull()方法的用法

一般我們在使用ifnull()方法的時候,都是類似下面的語句: IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL

使用命令列將Excel資料表匯入Mysql方法小結

從Excel資料表匯入Mysql,已經做過好幾次了,但每次都會碰到各種問題:invalid utf8 character string, data too long, ...,浪費了不少時間 為了提高效率,是時候指定一個數據匯入的SOP了: 1.準備.txt檔案    

MySql setAutoCommit方法

引言 setAutoCommit方法用一句話說就是用來保持事務完整性,一個系統的更新操作可能涉及多張表,這個時候,就需要用多個Sql語句來實現,實際上我覺得這個東西就是用來實現事務的。 當我們進行多條資料進行增刪改的時候,一旦在一句sql中出現了錯誤,就會出現有部分資料

Mysql設置遠程訪問的方法

界面 代碼 進行 數據 遠程 root windows服務 ges roo 這個是windows服務器中啊。我用的是可視化界面 sqlyog ,你們也可以用 navicat 甚至dos界面都可以 用root帳號登錄後,在查詢頁面中寫以下代碼 GRANT ALL PR

MySQLsleep線程過多的處理方法

rec 連接超時 服務 一行 client out char* mysql連接 測試 先說具體方法: 先在MySQL中操作 set global wait_timeout = 60; set global interactive_timeout = 60; 然後在配置

MySQL的錯誤及解決方法

chan col pan sql命令 sharp arp 自己的 class word 1. 修改密碼提示 ERROR 1054 (42S22): Unknown column ‘‘password‘‘ in ‘‘field list‘‘ 錯誤原因:mysql數據庫下已

mysql 的 not like 另一種簡化方法

ont pan 簡化 regex regexp from sel span rom 第一種 not like 方法 select * from table where `zongbu` not like ‘%北京%‘ and `zongbu` not like ‘%上海%‘

MySQL快速復制數據表方法匯總

主鍵 pro 新的 htm 同時 log 過程 ews 直接 本文將著重介紹兩個MySQL命令的組合,它將以原有數據表為基礎,創建相同結構和數據的新數據表。 這可以幫助你在開發過程中快速的復制表格作為測試數據,而不必冒險直接操作正在運行 的數據表。 示例如下: 將 p

mysqlalter語句卡死的一個解決方法

mysql alter 卡死我要在線上數據庫的一個表增加個字段,這個表非常小,就幾K,但執行不了,一執行就卡死,鎖掉。alter table tiv_product_detail_copy add activity_type varchar(40) NOT NULL COMMENT '活動類型 lbj

淺談MySQL優化sql語句查詢常用的30種方法

系統資源 all 數據量過大 連續 don 問題 not sele 客戶端 1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用

淺談 MySQL 優化 SQL 語句查詢常用的 30 種方法

個數 尋找 情況 don union all 子句 set 其他 算術 1、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2、應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引

mysqllength字符長度函數使用方法

lib pos track length函數 取字符 字符串長度 bsp 獲取字符串長度 標題 在mysql中length是計算字段的長度一個漢字是算三個字符,一個數字或字母算一個字符了,與char_length是有一點區別,本文章重點介紹第一個函數。

MySql啟用InnoDB資料引擎的方法

1、儲存引擎是什麼?   Mysql中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。這些不同的技術以及配套的相關功能

MySQLutf8字符集、排序規則及utf8mb4_bin列大小寫不敏感方法

轉載:https://my.oschina.net/u/1245414/blog/1831347 一、utf8mb4 和 utf8 比較 utf8mb4: A UTF-8 encoding of the Unicode character set using one to four

Mysql BLOB欄位轉String的方法

轉:https://www.cnblogs.com/renjie0520/p/5242350.html 1.通過sql直接轉換 select CONVERT (*** USING utf8) AS userName from usertable; 2.通過程式轉換(注

詳解MySQLLIMIT的使用方法

1、任務描述        搜尋表結構中的某些部分的資料,比如,最後面三個,最前面三個,第2到8條記錄,等等。 2、實戰演練        一、select * from tablename order by

MySQL優化sql語句查詢常用的方法

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。 3.應儘量避免在 where 子句中對欄位進行 null 值

將oracle的資料遷移到mysql,避免亂碼的方法

1.將oracle中的資料匯出成csv格式的檔案 將oracle中的查詢結果集,點選匯出,選擇csv。(匯出Excel格式非常非常慢,Excel匯入mysql中時,選擇65001 (UTF-8),中文不會亂碼) 2.用mysql資料庫管理工具navicat,點選到表選項(非具體表),點選

MySQL插入多個欄位的方法

在開發過程中,很多時候,根據需求,我們需要重新在表中新增幾個欄位。 在本地測試成功後,我們需要將自己的sql語句,提交到SVN,在版本升級的時候對現網上的資料庫表進行更新。 那麼如何寫插入欄位的sql語句呢?下面這個例子可以做一個簡單地示例: alter table ip_doma

MySQL使用LIMIT進行分頁的方法

一:分頁需求: 客戶端通過傳遞start(頁碼),pageSize(每頁顯示的條數)兩個引數去分頁查詢資料庫表中的資料,那我們知道MySql資料庫提供了分頁的函式limit m,n,但是該函式的用法和我們的需求不一樣,所以就需要我們根據實際情況去改寫適合我們自己的分頁語句,具體的分析如下: