日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

九、oracle 事务

發(fā)布時間:2024/9/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 九、oracle 事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是事務(wù)
事務(wù)用于保證數(shù)據(jù)的一致性,它由一組相關(guān)的dml語句組成,該組的dml(數(shù)據(jù)操作語言,增刪改,沒有查詢)語句要么全部成功,要么全部失敗。
如:網(wǎng)上轉(zhuǎn)賬就是典型的要用事務(wù)來處理,用于保證數(shù)據(jù)的一致性。

????

二、事務(wù)和鎖
當執(zhí)行事務(wù)操作時(dml語句),oracle會在被作用的表上加鎖,防止其它用戶修改表的結(jié)構(gòu)。這里對我們的用戶來講是非常重要的。

????

三、提交事務(wù)
當用commit語句執(zhí)行時可以提交事務(wù)。當執(zhí)行了commit語句之后,會確認事務(wù)的變化、結(jié)束事務(wù)。刪除保存點、釋放鎖,當使用commit語句結(jié)束事務(wù)之后,其它會話將可以查看到事務(wù)變化后的新數(shù)據(jù)。保存點就是為回滾做的。保存點的個數(shù)沒有限制。

????????????????

四、回滾事務(wù)
在介紹回滾事務(wù)前,我們先介紹一下保存點(savepoint)的概念和作用。保存點是事務(wù)中的一點。用于取消部分事務(wù),當結(jié)束事務(wù)時,會自動的刪除該事務(wù)所定義的所有保存點。當執(zhí)行rollback 時,通過指定保存點可以回退到指定的點,這里我們作圖說明。

??????????????

五、事務(wù)的幾個重要操作
1.設(shè)置保存點 savepoint a
2.取消部分事務(wù) rollback to a
3.取消全部事務(wù) rollback
eg、
SQL> savepoint a; --創(chuàng)建保存點a
Savepoint created
??????????????????
SQL> delete from emp where empno=7782;
1 row deleted
???????????????
SQL> savepoint b; --創(chuàng)建保存到b
Savepoint created
???????????????
SQL> delete from emp where empno=7934;
1 row deleted
??????????????????
SQL> select * from emp where empno=7934; --無法查詢到empno為7934這條記錄,因為這條記錄已被刪除
EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
???????????????
SQL> rollback to b; --通過保持點來恢復(fù)這條記錄
Rollback complete
??????????????????
SQL> select * from emp where empno=7934;
EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
?7934 MILLER???? CLERK????? 7782 1982/1/23???? 1300.00?????????????? 10
??????????????
SQL> select * from emp where empno=7782; --無法查詢到empno為7982這條記錄,因為這條記錄已被刪除
EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
????????????????
SQL> rollback to a; --通過保持點來恢復(fù)這條記錄
Rollback complete
??????????????
SQL> select * from emp where empno=7782;
EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
?7782 CLARK????? MANAGER??? 7839 1981/6/9????? 2450.00?????????????? 10
???????????????
SQL>
注意:這個回滾事務(wù),必須是沒有commit前使用的;如果事務(wù)提交了,那么無論你剛才做了多少個保存點,都統(tǒng)統(tǒng)沒用。如果沒有手動執(zhí)行commit,而是exit了,那么會自動提交。
eg、
SQL> savepoint a;
Savepoint created
???????????????
SQL> delete from emp where empno=7782;
1 row deleted
???????????
SQL> commit;
Commit complete
???????
SQL> rollback to a;
rollback to a
ORA-01086: 從未創(chuàng)建保存點 'A'
SQL>

???????????

六、java程序中如何使用事務(wù)
在java操作數(shù)據(jù)庫時,為了保證數(shù)據(jù)的一致性,比如賬戶操作(1)從一個賬戶中減掉10$(2)在另一個賬戶上加入10$,我們看看如何使用事務(wù)?

java代碼

package junit.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TransationTest {

public static void main(String[] args) {

Connection conn = null;
try {
// 1.加載驅(qū)動
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.得到連接
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "oracle");
Statement sm = conn.createStatement();
// 從scott的sal中減去100
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
int i = 7 / 0; //報java.lang.ArithmeticException: / by zero異常
// 給smith的sal加上100
sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");
// 關(guān)閉打開的資源
sm.close();
conn.close();
} catch (Exception e) {
// 如果發(fā)生異常,就回滾
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}

}

}

運行,會出現(xiàn)異常,查看數(shù)據(jù)庫,SCOTT 的sal 減了100,但是SMITH 的sal 卻不變,很可怕。。。
我們怎樣才能保證,這兩個操作要么同時成功,要么同時失敗呢?

???????????
Java 代碼

package junit.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TransationTest {

public static void main(String[] args) {

Connection conn = null;
try {
// 1.加載驅(qū)動
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.得到連接
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "oracle");
// 加入事務(wù)處理
conn.setAutoCommit(false);// 設(shè)置不能默認提交
Statement sm = conn.createStatement();
// 從scott的sal中減去100
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
int i = 7 / 0;
// 給smith的sal加上100
sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");
// 提交事務(wù)
conn.commit();
// 關(guān)閉打開的資源
sm.close();
conn.close();
} catch (Exception e) {
// 如果發(fā)生異常,就回滾
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}

}

}

再運行一下,會出現(xiàn)異常,查看數(shù)據(jù)庫,數(shù)據(jù)沒變化。。

????????????

七、只讀事務(wù)
只讀事務(wù)是指只允許執(zhí)行查詢的操作,而不允許執(zhí)行任何其它dml操作的事務(wù),使用只讀事務(wù)可以確保用戶只能取得某時間點的數(shù)據(jù)。
假定機票代售點每天18點開始統(tǒng)計今天的銷售情況,這時可以使用只讀事務(wù)。在設(shè)置了只讀事務(wù)后,盡管其它會話可能會提交新的事務(wù),但是只讀事務(wù)將不會取得最新數(shù)據(jù)的變化,從而可以保證取得特定時間點的數(shù)據(jù)信息。
設(shè)置只讀事務(wù): set transaction read only;

???????

比如有兩個用戶system、scott各自用sqlplus登陸,操作如下:
第一步:用system用戶登陸sqlplus,設(shè)置只讀事務(wù)。
SQL> set transaction read only;
事務(wù)處理集。
????????????????????????
第二步:用scott用戶登陸sqlplus,操作如下:
SQL> select count(*) from emp; --查詢emp表的總記錄數(shù)
? COUNT(*)
----------
??????? 13

SQL> insert into emp values (7777, 'zhangsan', 'MANAGER', 7782, to_date('1988-02-18', 'yyyy-mm-dd'), 38.38, 45.45, 10); --插入一條記錄到emp表
1 row inserted
?????????????
SQL> select count(*) from emp; --查詢emp表的總記錄數(shù)
? COUNT(*)
----------
??????? 14
?????????????????
SQL> commit; --提交
Commit complete

?????????????

第三步:用system用戶查詢scott.emp表
SQL> select count(*) from scott.emp;
? COUNT(*)
----------
??????? 13
SQL>

轉(zhuǎn)載于:https://www.cnblogs.com/linjiqin/archive/2012/02/06/2340637.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的九、oracle 事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。