事務
數據庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。(事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。)
例如,銀行轉賬工作:從一個賬號扣款並使另一個賬號增款,這兩個操作要麼都執行,要麼都不執行。這就是一個事務。
1、原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能只執行其中的一部分。
2、一致性(consistency):在事務處理執行前後,數據庫是一致的(數據庫數據完整性約束)。
3、隔離性(isolcation):一個事務處理對另一個事務處理的影響。
4、持續性(durability):事務處理的效果能夠被永久保存下來 。
5、一個事務只會有一個結果:要麼成功、要麼失敗。
(下面的的Connection con = ConnFactory.getConn()可見點擊打開鏈接)
1、一般sql語句
沒有采用事務處理,語句通過一條就生效一條,如果出異常,後面的語句都不能執行。
@Test public void save1() throws Exception{ Connection con = ConnFactory.getConn(); Statement st = con.createStatement(); st.execute("insert into stud(id,sname,age) values(1010,'益陽1',25)"); st.execute("insert into stud(id,sname,age) values(1010,'益陽2',28)"); st.execute("insert into stud(id,sname,age) values(1011,'益陽1',25)"); }2、批處理
沒有采用事務處理,批處理的方式:所有合法的語句都能有效執行,出異常的語句自己本身是不能執行,但不影響後面的語句。
@Test public void save2() throws Exception{ Connection con = ConnFactory.getConn(); Statement st = con.createStatement(); st.addBatch("insert into stud(id,sname,age) values(1010,'益陽1',25)"); st.addBatch("insert into stud(id,sname,age) values(1010,'益陽2',28)"); st.addBatch("insert into stud(id,sname,age) values(1011,'益陽3',25)"); st.executeBatch(); }3、事務處理模板
@Test public void save3() throws Exception{ Connection con = ConnFactory.getConn(); try { con.setAutoCommit(false);//默認是true,即是不采用事務處理----false相當於SQL中的“start Transaction” Statement st = con.createStatement(); st.execute("insert into stud(id,sname,age) values(1010,'益陽1',25)"); st.execute("insert into stud(id,sname,age) values(1010,'益陽2',28)"); st.execute("insert into stud(id,sname,age) values(1012,'益陽3',25)"); con.commit(); } catch (Exception e) { System.out.println("回滾了...."); con.rollback(); }finally{ con.setAutoCommit(true);//還原現場,還設成默認的即非事務處理狀態 con.close(); } }