一.什麼是事務
事務是應用程序中一系列嚴密的操做,全部操做必須成功完成,不然在每一個操做中所做的全部更改都會被撤消。也就是事務具備原子性,一個事務中的一系列的操做要麼所有成功,要麼一個都不作。
事務的結束有兩種,當事務中的因此步驟所有成功執行時,事務提交。若是其中一個步驟失敗,將發生回滾操做,撤消撤消以前到事務開始時的因此操做。
二.事務的 ACID
事務具備四個特徵:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱爲 ACID 特性。
1 、原子性
事務是數據庫的邏輯工做單位,事務中包含的各操做要麼都作,要麼都不作
2 、一致性
事 務執行的結果必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。所以當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。若是數據庫系統 運行中發生故障,有些事務還沒有完成就被迫中斷,這些未完成事務對數據庫所作的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是 不一致的狀態。
3 、隔離性
一個事務的執行不能其它事務干擾。即一個事務內部的操做及使用的數據對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操做或故障不該該對其執行結果有任何影響。java
Java中的事務處理數據庫
通常狀況下,J2EE應用服務器支持JDBC事務、JTA(Java Transaction API)事務、容器管理事務。通常狀況下,最好不要在程序中同時使用上述三種事務類型,好比在JTA事務中嵌套JDBC事務。第二方面,事務要在儘量短的時間內完成,不要在不一樣方法中實現事務的使用。下面咱們列舉兩種事務處理方式服務器
一、JavaBean中使用JDBC方式進行事務處理
在JDBC中怎樣將多個SQL語句組合成一個事務呢?在JDBC中,打開一個鏈接對象Connection時,缺省是auto-commit模式,每一個SQL語句都被看成一個事務,即每次執行一個語句,都會自動的獲得事務確認。爲了能將多個SQL語句組合成一個事務,要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉以後,若是不調用commit()方法,SQL語句不會獲得事務確認。在最近一次commit()方法調用以後的全部SQL會在方法commit()調用時獲得確認。session
public int delete(int sID) { dbc = new DataBaseConnection(); Connection con = dbc.getConnection(); try { con.setAutoCommit(false);// 更改JDBC事務的默認提交方式 dbc.executeUpdate("delete from bylaw where ID=" + sID); dbc.executeUpdate("delete from bylaw _content where ID=" + sID); dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID); con.commit();//提交JDBC事務 con.setAutoCommit(true);// 恢復JDBC事務的默認提交方式 dbc.close(); return 1; } catch (Exception exc) { con.rollBack();//回滾JDBC事務 exc.printStackTrace(); dbc.close(); return -1; } }
二、SessionBean中的JTA事務
JTA 是事務服務的 J2EE 解決方案。本質上,它是描述事務接口(好比 UserTransaction 接口,開發人員直接使用該接口或者經過 J2EE 容器使用該接口來確保業務邏輯可以可靠地運行)的 J2EE 模型的一部分。JTA 具備的三個主要的接口分別是 UserTransaction 接口、TransactionManager 接口和 Transaction 接口。這些接口共享公共的事務操做,例如 commit() 和 rollback(), 可是也包含特殊的事務操做,例如 suspend(),resume() 和 enlist(),它們只出如今特定的接口上,以便在實現中容許必定程度的訪問控制。例如,UserTransaction 可以執行事務劃分和基本的事務操做,而 TransactionManager 可以執行上下文管理。
應用程序能夠調用UserTransaction.begin()方法開始一個事務,該事務與應用程序正在其中運行的當前線程相關聯。底層的事務管理器實際處理線程與事務之間的關聯。UserTransaction.commit()方法終止與當前線程關聯的事務。UserTransaction.rollback()方法將放棄與當前線程關聯的當前事務。併發
public int delete(int sID) { DataBaseConnection dbc = null; dbc = new DataBaseConnection(); dbc.getConnection(); UserTransaction transaction = sessionContext.getUserTransaction();//得到JTA事務 try { transaction.begin(); //開始JTA事務 dbc.executeUpdate("delete from bylaw where ID=" + sID); dbc.executeUpdate("delete from bylaw _content where ID=" + sID); dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID); transaction.commit(); //提交JTA事務 dbc.close(); return 1; } catch (Exception exc) { try { transaction.rollback();//JTA事務回滾 } catch (Exception ex) { //JTA事務回滾出錯處理 ex.printStackTrace(); } exc.printStackTrace(); dbc.close(); return -1; } }
以上代碼來自網上,若有錯誤,盡情諒解!線程