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修改表結構 MySQL修改表結構操作命令總結 MySql資料庫在表中新增新欄位,設定主鍵,設定外來鍵,欄位移動位置,以及修改資料庫後如何進行部署和維護的總結 mysql 如何修改、新增、刪除表主鍵
MySQL修改表結構操作命令總結 以下內容轉自:http://www.jb51.net/article/58079.htm 表的結構如下: 複製程式碼程式碼如下:
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資料庫的