Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解
成都創(chuàng)新互聯(lián)長(zhǎng)期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為天心企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),天心網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
J2EE支持JDBC事務(wù)、JTA事務(wù)和容器事務(wù)事務(wù),這里說(shuō)一下怎樣實(shí)現(xiàn)JDBC事務(wù)。
JDBC事務(wù)是由Connection對(duì)象所控制的,它提供了兩種事務(wù)模式:自己主動(dòng)提交和手動(dòng)提交,默認(rèn)是自己主動(dòng)提交。
自己主動(dòng)提交就是:在JDBC中。在一個(gè)連接對(duì)象Connection中。默認(rèn)把每一個(gè)SQL語(yǔ)句的運(yùn)行都當(dāng)做是一個(gè)事務(wù)(即每次運(yùn)行完SQL語(yǔ)句都會(huì)馬上將操作更新到數(shù)據(jù)庫(kù))。
手動(dòng)提交就是:當(dāng)須要一次性運(yùn)行多個(gè)SQL語(yǔ)句,將多個(gè)SQL語(yǔ)句組成一個(gè)事務(wù)(即要么都成功,要么回滾全部的操作)時(shí),就得手動(dòng)提交。
看一個(gè)樣例:
import java.sql.*; public class TransactionTest{ public static void main(String[] args) throws SQLException { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","TransactionTest","123456"); //將事務(wù)模式設(shè)置為手動(dòng)提交事務(wù): conn.setAutoCommit(false); //設(shè)置事務(wù)的隔離級(jí)別。 conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); //運(yùn)行插入操作 String sqlInsert = "insert into t_user(userName,userPassword) values(?,? )"; pstmt = conn.prepareStatement(sqlInsert); pstmt.setString(1, "danny"); pstmt.setString(2, "123"); pstmt.executeUpdate(); //運(yùn)行改動(dòng)操作 String sqlUpdate = "update t_user set userPassword=? where userName = ?"; pstmt = conn.prepareStatement(sqlUpdate); pstmt.setString(1, "123456"); pstmt.setString(2, "danny"); pstmt.executeUpdate(); //提交事務(wù) conn.commit(); } catch (Exception e) { // 若事務(wù)發(fā)生異常,回滾事務(wù) conn.rollback(); }finally{ if (pstmt!=null) { pstmt.close(); } if (conn!=null) { conn.close(); } } } }
當(dāng)須要插入和更新這兩個(gè)操作同一時(shí)候運(yùn)行時(shí),要么兩個(gè)操作都成功,假設(shè)有一個(gè)失敗。則撤銷全部的操作。
宏觀來(lái)看須要例如以下四個(gè)步驟:
1、將事務(wù)模式設(shè)置為手動(dòng)提交事務(wù):
conn.setAutoCommit(false);
2、設(shè)置事務(wù)的隔離級(jí)別:
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
3、提交事務(wù):
conn.commit();
4、假設(shè)發(fā)生異常,回滾事務(wù):
conn.rollback();
從上面看,JDBC事務(wù)使用較為方便,但因?yàn)樗怯蒀onnection對(duì)象所控制的,所以它的缺點(diǎn)是事務(wù)的范圍僅僅局限于一個(gè)數(shù)據(jù)庫(kù)的連接,同一個(gè)事務(wù)中無(wú)法操作多個(gè)數(shù)據(jù)庫(kù)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!