作為邏輯處理的基本單位,對於數據庫操作來說由一條或者多條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在事務這裡的處理相比在事務的處理上本質還是一致的。