程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql------事務

mysql------事務

編輯:MySQL綜合教程

mysql------事務


事務

一、概念

數據庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。(事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。)

例如,銀行轉賬工作:從一個賬號扣款並使另一個賬號增款,這兩個操作要麼都執行,要麼都不執行。這就是一個事務。

二、事務的語句

開始事物:BEGIN TRANSACTION
提交事物:COMMIT TRANSACTION
回滾事務:ROLLBACK TRANSACTION 如果在操作時出錯,應該從新開始一個事務。

三、屬性

1、原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能只執行其中的一部分。
2、一致性(consistency):在事務處理執行前後,數據庫是一致的(數據庫數據完整性約束)。
3、隔離性(isolcation):一個事務處理對另一個事務處理的影響。
4、持續性(durability):事務處理的效果能夠被永久保存下來 。
5、一個事務只會有一個結果:要麼成功、要麼失敗。

四、一般的sql語句、批處理和事務處理三者的區別和java實現代碼模板

(下面的的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();
		}
		
	}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved