作為邏輯處理的基本單位,對於數據庫操作來說由一條或者多條sql語句來構成。當然還有針對非數據庫操作的,如在計算機中設置的還原點即是一個很好的應用。
對於事務的基本性質在另一篇中有所敘述:SQL 事務及實例演示
sql server中的事務一般分為隱式事務、顯式事務、自動提交事務。
自動事務:對於sql server來說,當客戶端提交一條sql語句時,這時候sql server都會自動啟動一個事務;對於這樣的事務,在執行完sql語句後會自動提交。
顯示事務:這也是比較常見的使用的事務;其實實質上也就是在自動事務上,增加一個Begintran,conn.commit,end tran.
隱式事務:相比顯示事務需要開啟connection,隱式事務是默認開啟事務的Begin和數據庫連接的。當然後面還是要進行commit或rollback操作的。
而oracle的事務就沒有這麼如此豐富了,和sql server的隱式事務類似;無需開啟conn和Begin,只要在後續操作進行commit或rollback操作。
先了解一些基礎的概念,data buffer cache:相當於一塊連接硬盤文件和oracle數據操作的高速只讀緩存。
SGA:在啟動oracle實例後,在內存中開辟的一塊內存空間,用於存放服務器的控制信息以及數據。
數據塊:數據存儲的基本單位。
當連接到數據庫後,oracle為連接的用戶創建獨立的進程-影子進程,這個進程伴隨用戶的整個操作;
1.檢查數據塊
2.構造undo數據塊
以此來回滾數據
3.生成redo日志
用於重新操作的日志存放在log buffer cache中。
4.lgwr進程啟動,提交事務並書寫所有日志文件
TestDemo:結合位於java.sql下面的接口 PreparedStatement和oracle事務實現批量刪除
常用方法:
int[]executeBatch():
將一批命令提交給數據庫來執行,如果全部命令執行成功,則返回更新計數組成的數組。
voidsetString(int parameterIndex,
String x):
將指定參數設置為給定Java String 值。在將此值發送給數據庫時,驅動程序將它轉換成一個 SQL VARCHAR 或 LONGVARCHAR 值。
Demo
/**刪除用戶-2014年8月11日18:19:04 * @userId 用戶id數組 */ publicBoolean DeleteUser(String[] userId){ //一個線程安全的可變字符串 StringBuffersb=new StringBuffer(); sb.append("deletefrom t_user where user_id =?"); Connectionconn=null; PreparedStatementpsmt = null; Booleanflag=false; conn=DButil.getConnection(); try { //關閉自動提交事務 conn.setAutoCommit(false); //創建一個 PreparedStatement 對象來將參數化的 SQL語句發送到數據庫。 psmt= conn.prepareStatement(sb.toString()); //將一組參數添加到此 PreparedStatement 對象的批處理命令中。 for(inti =0 ;i<userId.length;i++){ psmt.setString(1,userId[i].trim()); psmt.addBatch(); } // 執行批量更新 psmt.executeBatch(); // 語句執行完畢,提交本事務 conn.commit(); flag=true; }catch (SQLException e) { //TODO Auto-generated catch block e.printStackTrace(); try{ conn.rollback(); }catch (SQLException e1) { //TODO Auto-generated catch block e1.printStackTrace(); } } returnflag; }
總的來說,感覺還是對oracle很多內部的機制了解的有限。前幾天的設計模式講課,也讓想到這裡的一些東西才有了這篇博客。只能說是非常淺顯的認知,oracle在事務這裡的處理相比在事務的處理上本質還是一致的。