java中解决脏读_JAVA数据脏读
2014-03-21 回答
讀“臟”數(shù)據(jù)是指事務(wù)t1修改某一數(shù)據(jù),并將其寫回磁盤,事務(wù)t2讀取同一數(shù)據(jù)后,t1由于某種原因被除撤消,而此時t1把已修改過的數(shù)據(jù)又恢復(fù)原值,t2讀到的數(shù)據(jù)與數(shù)據(jù)庫的數(shù)據(jù)不一致,則t2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。
臟數(shù)據(jù)在比較復(fù)雜的交互式系統(tǒng)中,非常常見。
1、用java處理數(shù)據(jù)庫事務(wù)的準(zhǔn)備
要有一個能夠訪問數(shù)據(jù)庫的應(yīng)用。下面的示例都基于oracle進行。
create table ffm_account(
id int primary key ,
name varchar(32),
money int
);
測試數(shù)據(jù):
insert into ffm_account(id,name,money)values(1,'a',1000);
insert into ffm_account(id,name,money)values(2,'b',1000);
2、jdbc中使用事務(wù)
當(dāng)jdbc程序向數(shù)據(jù)庫獲得一個connection對象時,默認(rèn)情況下這個connection對象會自動向數(shù)據(jù)庫提交在它上面發(fā)送的sql語句。若想關(guān)閉這種默認(rèn)提交方式,讓多條sql在一個事務(wù)中執(zhí)行,可使用下列的jdbc控制事務(wù)語句
connection.setautocommit(false);//開啟事務(wù)(start transaction)
connection.rollback();//回滾事務(wù)(rollback)
connection.commit();//提交事務(wù)(commit)
3、jdbc使用事務(wù)范例之臟數(shù)據(jù) 以及讀取臟數(shù)據(jù)的源代碼
在jdbc代碼中演示銀行轉(zhuǎn)帳案例,有兩個銀行賬戶,a和b,各自有1000塊錢; a往c賬戶轉(zhuǎn)賬100塊,然后去讀取a賬戶的錢,讀到了a賬戶只有900塊,但是c賬戶是不存在的,那么這筆錢應(yīng)該是轉(zhuǎn)賬失敗。
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賬戶轉(zhuǎn)賬100塊,然后去讀取a賬戶的錢,讀到了a賬戶只有900塊,
*但是c賬戶是不存在的,那么這筆錢應(yīng)該是轉(zhuǎn)賬失敗。
*
*@author 范芳銘
*/
public class easydirtydata {
publicstatic void main(string[] args){
connectionconn = null;
preparedstatementstmt = null;
resultsetrs = null;
try{
conn =easyc3p0.getconnection();
//通知數(shù)據(jù)庫開啟事務(wù)(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("轉(zhuǎn)賬執(zhí)行前,系統(tǒng)中全部金額為:" +rs.getint("money"));
}
stmt = conn.preparestatement(sqla_money);
rs = stmt.executequery();
if (rs.next()){
system.out.println("轉(zhuǎn)賬執(zhí)行前,a的金額為:"+ rs.getint("money"));
}
//簡單模擬a往c賬戶轉(zhuǎn)賬:
string sqla = "update ffm_account set money=money-100 wherename='a'";
stmt = conn.preparestatement(sqla);
stmt.executeupdate();
//系統(tǒng)中沒有c賬戶
string sqlc = "update ffm_account set money=money+100 wherename='c'";
stmt = conn.preparestatement(sqlc);
stmt.executeupdate();
conn.commit();
//簡單模擬a往c賬戶 結(jié)束
//轉(zhuǎn)賬結(jié)束后,看賬戶情況
stmt = conn.preparestatement(sqlallmoney);
rs = stmt.executequery();
if (rs.next()){
system.out.println("轉(zhuǎn)賬執(zhí)行后,系統(tǒng)中全部金額為:" +rs.getint("money"));
}
stmt = conn.preparestatement(sqla_money);
rs = stmt.executequery();
if (rs.next()){
system.out.println("轉(zhuǎn)賬執(zhí)行后,a的金額為:"+ rs.getint("money"));
}
}catch (exception e) {
e.printstacktrace();
}finally{
easyc3p0.close(conn, stmt, rs);
}
}
}
4、運行結(jié)果
轉(zhuǎn)賬執(zhí)行前,系統(tǒng)中全部金額為:2000
轉(zhuǎn)賬執(zhí)行前,a的金額為:1000
轉(zhuǎn)賬執(zhí)行后,系統(tǒng)中全部金額為:1900
轉(zhuǎn)賬執(zhí)行后,a的金額為:900
總結(jié)
以上是生活随笔為你收集整理的java中解决脏读_JAVA数据脏读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 豆瓣电台api
- 下一篇: linux推流软件推荐,linux环境r