1. 程式人生 > >Mysql資料庫事務在jdbc中的用法

Mysql資料庫事務在jdbc中的用法

事務:保證操作的一致性,要麼操作同時成功,要麼同時失敗;

最經典的例子就是轉賬:A向B轉賬,如果轉賬成功,那麼必然A的錢減少,B的錢增多;如果轉賬失敗,那麼必然是A和B的餘額都沒有發生變化;這個例子就用到了事務操作;

Mysql 對事物的支援:

序號          命令                                  描述

1               set autocommit = 0          關閉自動提交

2               set autocommit = 1          開啟自動提交

3               begin                               啟動事務

4               commit                             提交事務        

5               rollback                            回滾

如圖1,先建立一個user表


我們來插入一個數據:

利用:insert into  user(id,password,money) values(1004,'abcdef',999999999);


查一下表發現新增成功,可是畢竟我們普通人沒有10億差一塊這麼多的錢,這個數字輸入錯誤,想回到之前正確的狀態怎麼辦呢,不用想了,肯定回不去了,因為這個值已經寫入硬碟了。為了避免這種情況發生,就需要用到事務了。

首先,設定取消自動提交

set autocommit = 0;

然後開啟事務

begin;

然後插入一條語句

insert into  user(id,password,money) values(1005,'abcdef',999999999);


哎媽呀,發現插錯了怎麼辦呢,別急咱們這次可以回滾

rollback;


這下可以看到,已經滾回去了;

如果提交的是正確的資料怎麼辦,這時就要用commit來提交事務

commit;


現在就已經提交成功了,我們在回滾試試:

rollback;


回滾之後,資料依然存在。

然後再JDBC中使用事務

新建一個Basedao 類,裡面有開啟關閉資料庫連線的方法

package com.yanglf;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
public class Basedao {
	
	final static String driver = "com.mysql.jdbc.Driver";
	final static String dburl = "jdbc:mysql://localhost:3306/db";
	final static String name = "root";
	final static String password = "745412";
	
	Connection con = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	
	public  void openCon() throws  Exception {
		
		Class.forName(driver);
		con = DriverManager.getConnection(dburl,name,password);
		System.out.println(con);
		
	}
	public void closeCon() throws Exception{
		if(ps!=null){
			ps.close();
		}
		if(rs!=null){
			rs.close();
		}
		if(con!=null){
			con.close();
		
		}
	}

}
然後建立main 方法開始測試
package com.yanglf;

import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;

import com.mysql.jdbc.PreparedStatement;

public class GetMessage {

	/**
	 * @param args
	 * @throws SQLException 
	 * @throws Exception 
	 */
	public static void main(String[] args)  {
		Basedao tj = new Basedao();
	
		try {
			
			tj.openCon();
			
			//注意與在資料庫中操作有點不同,資料庫為set autocommit = 0;
			tj.con.setAutoCommit(false);
			//利用佔位符,減少字串拼接的麻煩
			String sql1 = "insert into record (id,date,money,state) values (?,?,?,?);";
		
			//插入一條存入200塊錢的資料
			tj.ps = tj.con.prepareStatement(sql1);
			tj.ps.setInt(1, 1003);
			tj.ps.setLong(2, new Date().getTime());
			tj.ps.setInt(3, 100);
			tj.ps.setString(4, "存入");
		
			//修改新增刪除資訊返回的是受影響行數
			int row = tj.ps.executeUpdate();
			//在同時插入一條取出300的資料記錄
			tj.ps = tj.con.prepareStatement(sql1);
			tj.ps.setInt(1, 1003);
			tj.ps.setLong(2, new Date().getTime());
			tj.ps.setInt(3, 300);
			tj.ps.setString(4, "取出");
			int row2 = tj.ps.executeUpdate();
			
			//提交事務
			tj.con.commit();
		} catch (Exception e) {
			try {
				//回滾
				tj.con.rollback();
			} catch (SQLException e1) {
				
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		
		
		//然後來查詢下表
		String sql2 = "select * from record;";
		
		
		
		try {
			tj.ps = tj.con.prepareStatement(sql2);
			tj.rs = tj.ps.executeQuery();//查詢結果返回的是表
		} catch (SQLException e1) {
	
			e1.printStackTrace();
		}
		
		
		try {
			while (tj.rs.next()) {
			//控制檯輸出下查詢到的資訊
			System.out.println(tj.rs.getInt("id")+"\t"+new Timestamp(tj.rs.getLong("date"))+"\t"+
			tj.rs.getInt("money")+"\t"+tj.rs.getString("state"));
				
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		
		
		try {
			tj.closeCon();//關閉資料連線
		} catch (Exception e) {
			
			e.printStackTrace();
		}

	}

}

兩次新增如果設定正確則控制檯顯示:(上面兩條資料是資料庫本身有的,最後兩條是新新增的)

[email protected]
10012016-05-16 23:28:06.492 322 轉出
10022016-05-16 23:28:06.499 322 轉入
10032016-05-21 00:37:06.895 100 存入
10032016-05-21 00:37:06.898 300 取出

同時也可以修改新增資料,比如將下面的這一句註釋掉,由於資料庫設定存入,取出狀態非空,所以這次插入會報異常

tj.ps.setString(4, "取出");
查詢的結果只能查到前面兩句,因為出現異常,在catch塊中進行了回滾,使得第一條插入的資料又得到恢復;這正是事務的作用。

一句話:事務是為了保證資料的一致性和完整性

相關推薦

ON DUPLICATE KEY UPDATE在mysql的INSERT語句用法

1、如果在INSERT語句後面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現有記錄的惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新; 2、如果插入的行資料與現有表中記錄的唯一索引或者主鍵****不重複,則執行新紀錄插入操作。 示例: creat

使用Docker實現MySql資料庫在容器的主從配置(詳解)

使用Docker容器搭建MySql主從複製 關於如何建立映象,我的部落格中有詳細的步驟文件 檢視容器ip命令為docker inspect 96fd[id前四位] Master_mysql_ip_172.17.0.4 slave_mysql_ip_172.17.0.5 1.docker上面尋

Mysql資料庫安裝過程忘記密碼

1.按照如下連結安裝mysql資料庫:http://www.jb51.net/article/134181.htm mysql 5.7.21 winx64安裝配置方法圖文教程 1、將下載好的mysql壓縮包解壓到安裝目錄下 2、新建檔案  my.ini,放置到mysql

mysql資料庫 事務和索引

1.MySQL資料庫特性:  原子性(atomidity) 一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性 一致性(consistency) 資料庫總是從一個一致性的狀態

遇到mysql資料庫事務隔離級別相關的小坑

幾乎所有軟體工程師都知道,mysql有4種事務隔離級別,但是實際開發過程中可能有時候忽略這個小細節,有時候可能是本來就沒有考慮過,有時候也可能是其他的原因,比如我這次踩到的小坑。 事情還原: 1、需求一:是新建一個商戶,但是客戶要求在建立商戶的時候要預設給他們開

MySQL資料庫事務處理

事務處理用於有效記錄某機構感興趣的業務活動(稱為事務)的資料處理(例如銷售、供貨的定購或貨幣傳輸)。通常,聯機事務處理 (OLTP) 系統執行大量的相對較小的事務。——百度百科 事務處理是將多個操作或者命令一起執行,所有命令全部成功執行才意味著該事務的成功,任何一個命令失敗

MYSQL資料庫事務4種隔離級別及7種傳播行為

事務的特性: 原子性:事務的不可分割,組成事務的各個邏輯單元不可分割。 一致性:事務執行的前後,資料完整性保持一致。 隔離性:事務執行不應該受到其他事務的干擾。 永續性:事務一旦結束,資料就持久化到資料庫中。 檢視/設定隔離級別    檢視:SELECT @@tx

mysql資料庫——事務

為什麼會有事務:為了保證流程的完整執行。 事務是一組不可被分割的SQL語句的集合,是一組連續的資料庫操作, 作為一個單一的工作單元來執行。這一組操作要麼全部成功執行,要麼全部回滾 最經典的就是銀行轉賬,一個轉出,一個收到。 mysql 事務主要用於處理操作量大,複雜度高的資料, 事物處

mysql 資料庫實際應用的大資料處理

某年某月,我接到公司的任務,要搭建一個遊戲平臺系統,管理旗下所有遊戲的玩家賬戶資料。起初拿到任務後,想了想。那麼這個系統就是一個註冊,一個登陸就ok了。 於是有了下面的資料庫設計。tbl_account. 表【主鍵ID,使用者名稱,密碼,註冊時間,……】 業務邏輯開發完成,

MySql資料庫在表新增新欄位,設定主鍵,設定外來鍵,欄位移動位置,以及修改資料庫後如何進行部署和維護的總結

1,為當前已有的表新增新的欄位 alter table student add studentName varchar(20) not null; 2,為當前已有的表中的欄位設定為主鍵自增 alter table student add constraint PK_studentId primaryKe

MySQL資料庫事務例項(模擬銀行轉賬)

在資料庫系列文章中[MySQL資料庫事務基本操作](http://blog.csdn.net/fengpojian/article/details/73571983) 介紹了MySQL資料庫基本的事務操作。這篇文章將介紹一個例項來更好的理解學習MySQL資料庫事

c語言mysql資料庫事務開始、提交、回滾範例

1、 事務提交模式修改:修改資料庫提交模式為0[手動提交] memset ( sql, 0x00, sizeof( sql ) ); memcpy ( sql, "set autocommit=0;"

在安裝mysql資料庫的過程,顯示msvcp100.dll丟失?則麼辦?

方案一:重灌作業系統為windows10專業版 方案二:問題: 解答: 報錯原因是VC執行庫不全或者沒有安裝導致,百度搜索VC集合下載安裝, 連結:https://pan.baidu.com/s/1UqKZ0Jx2GqQFvRW9JzM0Rg 提取碼:rijq   初始化後,安

MySQL資料庫事務隔離級別(Transaction Isolation Level)

今天在學習JDBC的時候看到了關於MySql的事務的隔離級別的問題,感覺內容挺高階的,所以記錄一篇文章,以備後面使用。 資料庫隔離級別有四種,應用《高效能mysql》一書中的說明: 然後說說修改事務隔離級別的方法: 1.全域性修改,修改mysql.in

MySQL資料庫事務略知一二

事務的概念 事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。 例如:A向B轉賬100元,對應於如下兩條sql語句: update from account set money=money+100 where name='b

[MySQL] 生產環境MySQL資料庫事務一直在RUNNING

前言:運營人員反映,有一單子提交卡住了,頁面一直沒有返回。1,剛開始懷疑是應用伺服器或者db壓力過高hang住了,馬上去check應用伺服器以及db的負載,看起來都OK,蠻低的,應該不是DB效能問題。2,最後去看下是否是表鎖住了,檢視到有2個事務一直RUNNING,沒有結束。

java專案連線mysql資料庫jdbc遇到的問題

最近在寫java專案的時候想要往資料庫裡存點東西,於是就用mysql資料庫來存資料,可我在使用過程中遇到了兩個問題,現做個筆記,問題如下: 一、報com.mysql.jdbc.Driver類未找到         之所以報這個錯,不是因為沒有匯入mysql驅動包,而是我導的

命令列下mysql資料庫插入記錄包含中文1366錯誤問題解決方法及其他

出於方便國際化考慮,我把java開發環境和資料庫及表的編碼設定都設定成了utf8。這樣的設定在eclipse環境中向mysql存取資料時沒遇到問題。 但今天在使用命令列向mysql插入中文資料時遇到了1366錯誤。google到以下答案: mysql#1366錯誤是在my

MySQL資料庫事務基本操作

這篇日誌是自己學習了MySQL資料庫的事務之後,總結的一點心得體會。都是一些非常基礎的知識點。如能幫助諸位初學者,那真是我的榮幸。 資料庫的事務,很多的部落格也都有了詳細的介紹。最基本的事務特性啊(ACID)這裡就不再贅述。 首先,如果想要開啟MySQL資料庫的