java中解决脏读_JAVA数据脏读
2014-03-21 回答
讀“臟”數據是指事務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
總結
以上是生活随笔為你收集整理的java中解决脏读_JAVA数据脏读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 豆瓣电台api
- 下一篇: 2018版苹果开发者设置内购、税务、银行