好記性不如爛筆頭24-JAVA處理資料庫事務(2) - 髒資料

來源:互聯網
上載者:User

標籤:資料庫事務   髒資料   java   


讀“髒”資料是指事務T1修改某一資料,並將其寫回磁碟,事務T2讀取同一資料後,T1由於某種原因被除撤消,而此時T1把已修改過的資料又恢複原值,T2讀到的資料與資料庫的資料不一致,則T2讀到的資料就為“髒”資料,即不正確的資料。

髒資料在比較複雜的互動式系統中,非常常見。

1、用JAVA處理資料庫事務的準備

要有一個能夠訪問資料庫的應用。下面的樣本都基於ORACLE進行。

create table ffm_account(

   id int primary key ,

   name varchar(32),

   money int

);

測試資料:

insert into ffm_account(id,name,money)values(1,‘A‘,1000);

insert into ffm_account(id,name,money)values(2,‘B‘,1000);

 

2、JDBC中使用事務

 

當Jdbc程式向資料庫獲得一個Connection對象時,預設情況下這個Connection對象會自動向資料庫提交在它上面發送的SQL語句。若想關閉這種預設提交方式,讓多條SQL在一個事務中執行,可使用下列的JDBC控制事務語句

Connection.setAutoCommit(false);//開啟事務(start transaction)

Connection.rollback();//復原事務(rollback)

Connection.commit();//提交事務(commit)

 

3、JDBC使用事務範例之髒資料 以及讀取髒資料的原始碼

在JDBC代碼中示範銀行轉帳案例,有兩個銀行賬戶,A和B,各自有1000塊錢; A往C賬戶轉賬100塊,然後去讀取A賬戶的錢,讀到了A賬戶只有900塊,但是C賬戶是不存在的,那麼這筆錢應該是轉賬失敗。

JAVA原始碼:

package com.transaction;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

 

import com.db.EasyC3p0;

 

/**

 *有兩個銀行賬戶,A和B,各自有1000塊錢;

 *A往C賬戶轉賬100塊,然後去讀取A賬戶的錢,讀到了A賬戶只有900塊,

 *但是C賬戶是不存在的,那麼這筆錢應該是轉賬失敗。

 *

 *@author 範芳銘

 */

public class EasyDirtyData {

    publicstatic void main(String[] args){

        Connectionconn = null;

        PreparedStatementstmt = null;

        ResultSetrs = null;

   

   try{

       conn =EasyC3p0.getConnection();

       //通知數據庫開啟事務(start transaction)

       conn.setAutoCommit(false);

       String sqlAllMoney = " select sum(money) as money from ffm_account";

       String sqlA_money = " select money from ffm_account " ;

       stmt = conn.prepareStatement(sqlAllMoney);

       rs = stmt.executeQuery();

       if (rs.next()){

           System.out.println("轉賬執行前,系統中全部金額為:" +rs.getInt("money"));

       }

       stmt = conn.prepareStatement(sqlA_money);

       rs = stmt.executeQuery();

       if (rs.next()){

           System.out.println("轉賬執行前,A的金額為:"+ rs.getInt("money"));

       }

       //簡單類比A往C賬戶轉賬:

       String sqlA = "update ffm_account set money=money-100 wherename=‘A‘";

       stmt = conn.prepareStatement(sqlA);

       stmt.executeUpdate();

       //系統中沒有C賬戶

       String sqlc = "update ffm_account set money=money+100 wherename=‘C‘";

       stmt = conn.prepareStatement(sqlc);

       stmt.executeUpdate();

       conn.commit();

       //簡單類比A往C賬戶 結束

       

       //轉賬結束後,看賬戶情況

       stmt = conn.prepareStatement(sqlAllMoney);

       rs = stmt.executeQuery();

       if (rs.next()){

           System.out.println("轉賬執行後,系統中全部金額為:" +rs.getInt("money"));

       }

       stmt = conn.prepareStatement(sqlA_money);

       rs = stmt.executeQuery();

       if (rs.next()){

           System.out.println("轉賬執行後,A的金額為:"+ rs.getInt("money"));

       }

       

   }catch (Exception e) {

       e.printStackTrace();

   }finally{

       EasyC3p0.close(conn, stmt, rs);

   }

    }

}

4、運行結果

轉賬執行前,系統中全部金額為:2000

轉賬執行前,A的金額為:1000

轉賬執行後,系統中全部金額為:1900

轉賬執行後,A的金額為:900

 

系統中的錢那裡去了,A:我的錢呢,還我錢!!!!!!!!!

好記性不如爛筆頭24-JAVA處理資料庫事務(2) - 髒資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.