原文連結:http://longdechuanren.iteye.com/blog/632403
1、事務的概念與JDBC事務處理
(1)原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能隻執行其中的一部分。
(2)一緻性(consistency):在事務處理執行前後,資料庫是一緻的(兩個賬戶要麼都變,或者都不變)。
(3)隔離性(isolcation):一個事務處理對另一個事務處理沒有影響。
(4)持續性(durability):事務處理的效果能夠被永久儲存下來 。
舉例:銀行轉賬
connection.setAutoCommit(false);//打開事務。
.....
....把進行轉賬的兩步操作放在同一個事務中,如果一個出現異常,馬上復原
.....
connection.commit();//送出事務。
connection.rollback();//復原事務。
2、事務的儲存點處理:定義儲存點可以用來復原一部分内容
Java代碼

- static void test() throws SQLException {
- Connection conn = null;
- Statement st = null;
- ResultSet rs = null;
- //定義儲存點
- Savepoint sp = null;
- try {
- conn = JdbcUtils.getConnection();
- conn.setAutoCommit(false);
- st = conn.createStatement();
- //修改張三的money值
- String sql = "update user set money=money-10 where id=1";
- st.executeUpdate(sql);
- //設定儲存點
- sp = conn.setSavepoint();
- //修改王五的money值
- sql = "update user set money=money-10 where id=3";
- st.executeUpdate(sql);
- sql = "select money from user where id=2";
- rs = st.executeQuery(sql);
- float money = 0.0f;
- if (rs.next()) {
- money = rs.getFloat("money");
- }
- //如果李四的money的值>300就抛出異常
- if (money > 300)
- throw new RuntimeException("已經超過最大值!");
- sql = "update user set money=money+10 where id=2";
- st.executeUpdate(sql);
- conn.commit();
- } catch (RuntimeException e) {
- if (conn != null && sp != null) {
- //rollback的時候要定義儲存點,否則會全部復原
- conn.rollback(sp);
- conn.commit();
- }
- throw e;
- } catch (SQLException e) {
- if (conn != null)
- conn.rollback();
- throw e;
- } finally {
- JdbcUtils.free(rs, st, conn);
- }
- }
總結:
1).如果上面的調用産生了異常,那麼張三賬号的會減少,而王五的錢不會變少:儲存點之後的内容會被復原,而儲存點之前的内容不會被復原。
2).事務的復原也可以不復原所有的操作,比如一件事需要三步完成,我們可以在走完第一步後設定一個儲存點,然後再進行第二步和第三步,一旦發生異常,復原到儲存點即可,此時儲存點以後的操作會復原,而儲存點以前的不會(未完全復原)。
備注:.在MySql資料庫使用過程中如果發現某個資料庫對事務的支援不是很好(比如不能送出或不能復原),則很可能是資料庫的引擎使用不合适(資料庫引擎有很多種,比如InnoDB,MyIsam,其中InnoDB支援資料庫事務,而MyIsam不支援)
3、JTA分布式事務的簡要介紹
跨越多個資料源的事務,使用JTA容器實作事務。
分成兩階段送出。
Java代碼

- javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName");
- tx.begin();
- //connection1 connection2 (可能來自不同的資料庫)…
- tx.commit();//tx.rollback();
備注:要想實作JTA事務需要JTA容器(Tomcat沒有,Weblogic,Websphere有)的支援,JTA容器就行一個指揮官,指揮着所有的資料庫(一般發2道指令),他會先發出一個送出的請求給是以資料庫,如果此時有資料庫表示要復原,則容器會通知其他資料庫一起復原,如果沒有資料庫提出復原,此時發第二道指令,所有資料庫一起送出。
4、事務的隔離級别
檢視與設定mysql資料庫的的隔離級别:
檢視:select @@tx_isolation
未送出讀:set transaction isolation level read uncommitted
送出讀:set transaction isolation level read committed
不可重複讀:set transaction isolation level repeatable committed
在預設情況下mysql的事務是自動送出的,輸入指令strat transaction 表示你要
自己手動控制事務,mysql不會幫你自動送出事務 commit指令是送出目前事務
rollback:復原事務
特别說明:本人轉載文章純為技術學習,總結經驗,并無其他目的,若有他人繼續轉載,請連結原作者的位址,而不是本文的位址,以示對作者的尊重。最後對原作者的辛勤勞動表示感謝!
轉載于:https://www.cnblogs.com/hl756799782/archive/2011/10/01/6005286.html