數據庫事物操作

事務

什么是事務?
轉賬:
1. 給wc賬戶減1000元
2. 給wcxf賬戶加1000元

當給wc賬戶減1000元后,拋出了異常!這會怎么樣呢?我相信從此之后,wc再也不敢轉賬了。

使用事務就可以處理這一問題:把多個對數據庫的操作綁定成一個事務,要么都成功,要么都失敗!

---------------------------------------------------------------------------------------------------------------------------------------------

事物的特性:ACID

* 原子性事務中所有操作是不可再分割的原子單位。事務中所有操作要么全部執行成功,要么全部執行失敗。
* 一致性事務執行后,數據庫狀態與其它業務規則保持一致。如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號余額之和應該是不變的。
* 隔離性隔離性是指在并發操作中,不同事務之間應該隔離開來,使每個并發中的事務不會相互干擾。
* 持久性一旦事務提交成功,事務中所有的數據操作都必須被持久化到數據庫中,即使提交事務后,數據庫馬上崩潰,在數據庫重啟時,也必須能保證通過某種機制恢復數據。

---------------------------------------------------------------------------------------------------------------------------------------------

MySQL操作事務

1. 開始事務:start transaction
2. 結束事務:commit//提交事物rollback//事物回滾

(1)事物回滾

(2)事物提交

?

?

---------------------------------------------------------------------------------------------------------------------------------------------

JDBC事務

1. 開始事務con.setAutoCommit(false);
2. 結束事務con.commit()con.rollback();

?

public class Jdbc2 {public static void main(String[] args) {Connection con=null;PreparedStatement pst=null;try {con = JDBCUtils.getConnection();//開啟事物con.setAutoCommit(false);//開啟手動事物pst=con.prepareStatement("UPDATE  acction SET mun=mun-100 WHERE username=? ");pst.setString(1, "zhangsan");pst.executeUpdate();//人為創建異常int index=1/0;pst=con.prepareStatement("UPDATE  acction SET mun=mun+100 WHERE username=? ");pst.setString(1, "wangwu");pst.executeUpdate();con.commit();//提交事物
            } catch (Exception e) {try {con.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally{//關閉JDBCUtils.createClose(null, pst, con);}}
}

?

?

?

---------------------------------------------------------------------------------------------------------------------------------------------

保存點

保存點的是可以回滾到事務中的某個位置,而不是回滾整個事務。
回滾到保存點不會結束事務。
設置保存點:Savepoint sp = con.setSavepoint();
回滾到保存點:con.rollback(sp);

public class Jdbc1 {public static void main(String[] args) {Connection con=null;PreparedStatement pst=null;Savepoint sp=null;try{con = JDBCUtils.getConnection();con.setAutoCommit(false);//手動開啟事物sp=con.setSavepoint();pst=con.prepareStatement("INSERT INTO acction(username,mun) VALUES(?,?)");for(int i=1;i<=2000;i++){if(i==1002){int index=i/0;}pst.setString(1, "lxp");pst.setInt(2, i);pst.executeUpdate();if(i%1000==0){sp=con.setSavepoint();} }con.commit();//事物提交}catch(Exception e){try {con.rollback(sp);con.commit();} catch (SQLException e1) {// TODO Auto-generated catch block
                e1.printStackTrace();}//回滾事物
              e.printStackTrace();}finally{JDBCUtils.createClose(null, pst, con) ;}}

---------------------------------------------------------------------------------------------------------------------------------------------

事務隔離級別

* 臟讀:讀到未提交


* 不可重復讀:兩次讀取不一致,讀取到另一事務修改的記錄


* 幻讀:兩次讀取不一致,讀取到另一事務插入的記錄

---------------------------------------------------------------------------------------------------------------------------------------------

四大隔離級別
* SERIALIZABLE(串行化):對同一數據的訪問是串行的,即非并發的,所以不會出現任何并發問題。易出現死鎖,效率太低!不可用!
* REPEATABLE READ(可重復讀):防止了臟讀、不可重復讀,但沒有防止幻讀
* READ COMMITTED(讀已提交):防止了臟讀,但沒有防止不可重復讀,以及幻讀
* READ UNCOMMITTED(讀未提交):可能出現所有并發問題,效率最高,但不可用!

MySQL默認事務隔離級別為:REPEATABLE READ
Oracle默認事務隔離級別為:READ COMMITTED

-------------------------------------------------------------------------------------------------------------------------------------------------

MySQL設置事務隔離級別

/* 查看:*/select @@tx_isolation
/* 設置:*/set transaction isolation level 四選一

JDBC設置事務隔離級別

con.setTransactionIsolation(四選一)

------------------------------------------------------------------------------------------------------------------------------------------------------

代碼JDBCUtils代碼:

需要配置dbconfig.properties文件

?

public class JDBCUtils {static Properties props = null;//綁定線程static private ThreadLocal<Connection> t1=new ThreadLocal<Connection>();static {// 加載本地配置文件try {InputStream in = JDBCUtils.class.getResourceAsStream("dbconfig.properties");props = new Properties();props.load(in);} catch (IOException e) {e.printStackTrace();}// 加載驅動try {Class.forName(props.getProperty("driverClassName"));} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 獲得Connection連接* @return* @throws Exception*/public static Connection getConnection() throws Exception {Connection conn = t1.get();if(conn==null){// 加載配合conn= DriverManager.getConnection(props.getProperty("url"),props.getProperty("username"), props.getProperty("password"));t1.set(conn);}return conn;}/*** 關閉所有連接* @param rs* @param statement* @param conn*/public static void createClose(ResultSet rs, PreparedStatement statement,Connection conn) {try {if (rs != null)rs.close();if (rs != null)statement.close();if (rs != null)   conn.close();
??? if(t1!=null){
?? ??? ??? ??? ?t1.remove();
?? ??? ??? ?}}
catch (Exception e) {e.printStackTrace();}} }

?

轉載于:https://www.cnblogs.com/lxp503238/p/6639178.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372525.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過OpenShift超越云技術

您是否厭倦了為您的應用程序請求新的開發機器&#xff1f; 您是否為應用程序設置新的測試環境感到煩惱&#xff1f; 您是否只想專注于和平開發應用程序而不會一直“沉迷于堆棧”&#xff1f; 我們聽到你的聲音。 我們也去過那里。 不用擔心&#xff0c;OpenShift就在這里&#…

android+4.4+穩定性,新系統新UI!臺電A10h四核安卓4.4.2性能測試

國內著名商標&#xff0c;數碼用戶首選品牌的臺電科技在12月20日全國首發了安卓4.4.2系統&#xff0c;并且運行臺電全新tUI同時&#xff0c;支持從安卓4.2系統OTA一鍵升級至安卓4.4.2系統&#xff01;作為國內首款升級到目前全球最新的Android4.4.2系統之后&#xff0c;整體性能…

網絡知識點小結

VMware虛擬機三種聯網方法及原理一、Brigde——橋接&#xff1a;默認使用VMnet0 1、原理&#xff1a; Bridge 橋"就是一個主機&#xff0c;這個機器擁有兩塊網卡&#xff0c;分別處于兩個局域網中&#xff0c;同時在"橋"上&#xff0c;運行著程序&#xff0c;讓…

在JUnit中超越核心Hamcrest

在通過JUnit和Hamcrest改進對assertEquals的文章中&#xff0c;我介紹了將Hamcrest與JUnit一起使用 。 然后&#xff0c;我查看了JUnit的內置Hamcrest Core Matcher支持 。 在本文中&#xff0c;我將介紹如何將Hamcrest的非核心匹配器與JUnit一起應用。 這些非核心匹配器默認情…

4pics1word android,4 Pics 1 Word

4 Pics 1 Word是一款非常有意思的看圖猜詞游戲&#xff0c;這款游戲中會給我們四張圖片&#xff0c;玩家需要通過圖片給出的信息來猜出是哪個詞&#xff0c;看西西的介紹你可能以為這是一款千篇一律的看圖猜詞游戲&#xff0c;不過這里猜的不是中文而是英語單詞。4 Pics 1 Word…

頁面內錨點定位及跳轉方法總結

接著上一篇&#xff0c;其實是一個功能&#xff0c;本來感覺挺簡單的一個問題&#xff0c;沒想到遇到兩個坎兒&#xff0c;無語。。。 上一篇是關于scroll事件綁定的問題&#xff0c;這一篇的問題是&#xff1a;點擊錨點跳轉到相應DIV的問題。 最簡單的方法是錨點用<a>標…

基于android的水稻葉片特征測量系統,基于Android的水稻葉片特征參數測量系統

基于Android的水稻葉片特征參數測量系統路艷1&#xff0c;肖志勇2&#xff0c;3&#xff0c;楊紅云2&#xff0c;3*&#xff0c;周瓊1&#xff0c;孫玉婷1【摘要】摘要&#xff1a;【目的】提供基于Android的水稻葉片特征參數測量系統&#xff0c;為農學研究提供精準數據。【方…

JAVA學習繪圖顏色及其筆畫屬性設置字體顯示文字

package com.graphics;import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.Date;import javax.swing.*;/*** * author biexiansheng**/ public class DrawString extends JFrame{private Shape rect;//矩形對象private Font font;//字體對象private Date …

lightoj 1044 - Palindrome Partitioning(需要優化的區間dp)

題目鏈接&#xff1a;http://lightoj.com/volume_showproblem.php?problem1044 題意&#xff1a;求給出的字符串最少能分成多少串回文串。 一般會想到用區間dp暴力3個for但是這里的數據有1000&#xff0c;3個for肯定超時的。 但是這題只是判斷回文串有多少個所以可以先預處理一…

對JavaFX Mobile應用程序進行性能分析

注意&#xff1a;本文最初發表于2009年&#xff0c;僅供參考。 請查閱我們其余的JavaFX文章 。 對于每個JavaFX Mobile應用程序開發人員來說&#xff0c;今天都是美好的一天。 你想知道為什么嗎&#xff1f; 因為JavaME SDK 3.0已發布。 根據我午休時聽到的消息&#xff0c;這是…

第六天20160810

a) 形參與實參 一、 形參為基本數據類型&#xff1a;形參改變&#xff0c;實參不變。 二、 形參為引用數據類型&#xff1a;形參改變&#xff0c;實參通常都會改變。 b) 可變長參數&#xff1a;JDK1.5開始出現 一、可變長參數只能用于…

android原生系統開發板,安卓學習必備開發板-Rayeager PX2

由谷歌主導并推動的移動終端操作系統Android&#xff0c;由于其開源開放的特性&#xff0c;自發布之日起便受到全球各大IT廠商的歡迎。在各廠商的熱情推動下&#xff0c;基于Android系統的手機、平板、智能手表等各類產品層出不窮&#xff0c;迅速普及到人們的日常生活&#xf…

變量類型取值范圍

ascii&#xff1a;Oct Dec Hex Char──────────────────────────101 65 41 A102 66 42 B103 67 43 C141 97 61 a142 98 62 b143 99 63 c 取值范圍&#xff1a;-1 ~ 0xFFFFFFFF ~ 全1127 ~ 0x7F255 ~ 0xFF ~ 11111111 char -128 ~ 127 …

熱點中的即時編譯器(JIT)

即時編譯器&#xff08;JIT&#xff09;的概念以及更廣泛的自適應優化是除Java&#xff08;.Net&#xff0c;Lua&#xff0c;JRuby&#xff09;之外的許多語言中眾所周知的概念。 為了解釋什么是JIT編譯器&#xff0c;我想先定義一個編譯器概念。 根據維基百科&#xff0c;編譯…

3.30下午

在另一臺機子安裝VMware workstation12和win8服務器 總是秘鑰不行 很煩轉載于:https://www.cnblogs.com/bgd140206314/p/6647159.html

Java并發性-任務反饋

從我 上一篇 關于java.util.concurrent包的 文章 的結尾處 摘下來 &#xff0c;這很有趣&#xff0c;有時甚至必須在并發任務啟動后從它們那里獲得反饋。 例如&#xff0c;假設一個應用程序必須發送電子郵件批處理&#xff0c;除了使用多線程機制外&#xff0c;您還想知道成功發…

JS中的函數(二):函數參數(你可能不知道的參數傳遞)

前言&#xff1a; 函數分為有參有返回值&#xff0c;有參無返回值&#xff0c;無參無返回值&#xff0c;無參有返回值&#xff1b;那么對于無參數的函數你想使用函數的調用怎么辦呢&#xff1f;如果你想封裝一個代碼&#xff0c;實現多種功能&#xff0c;但是形參大于實參或者實…

jq查找字段忽略html標簽,jQuery過濾HTML標簽并高亮顯示關鍵字的方法

本文實例講述了jQuery過濾HTML標簽并高亮顯示關鍵字的方法。分享給大家供大家參考。具體如下&#xff1a;jQuery實現網頁關鍵字過濾效果&#xff0c;將需要過濾的文字定義在JavaScript中&#xff0c;可定義多個&#xff0c;不過要修改JS代碼為數組&#xff0c;這樣可過濾出多個…

Jmeter參數化 CSV Data Set Config界面說明

Filename&#xff1a;指保存信息的文件目錄&#xff0c;可以相對或者絕對路徑&#xff0c;相對路徑從Jmeter 的啟動目錄(***/bin)路徑。 File Encoding:文件編碼&#xff0c;默認為ANSI&#xff0c;建議設置為utf-8&#xff0c;防止遇見亂碼情況。 Variable Names&#xff1a;參…

java.lang.NoClassDefFoundError:如何解決–第1部分

線程“ main”中的異常java.lang.NoClassDefFoundError是開發Java EE企業版或獨立Java應用程序時可能會遇到的常見難題之一。 根本原因分析和解決過程的復雜性主要取決于Java EE中間件環境的大小。 特別是考慮到各種Java EE應用程序中存在大量的ClassLoader。 我向您建議的一系…