事務訪問
一、跨資料庫訪問
第一種方式
SELECT * FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=遠程ip;User ID=sa;Password=密碼'
).庫名.dbo.表名
WHERE 條件
第二種方式
在sql server組->服務->安全性->鏈接伺服器下建立一個具有別名的鏈接伺服器。然後通過以下方式訪問:
SELECT * FROM [鏈接伺服器名].庫名.dbo.表名
WHERE 條件
需要注意的是建立鏈接資料庫伺服器類型如果選擇「SQL server」,那麼鏈接伺服器名稱必須用要鏈接的伺服器的在網路中的機器名或IP,如果要使用其它別名,可以在WINDOWS\system32\drivers\etc\hosts文件里添加一個別名的映射。
解除SQL阻止(sqlserver 2005情況)
SQL Server 阻止了對組件 『Ad Hoc Distributed Queries』 的 STATEMENT』OpenRowset/OpenDatasource』 的訪問,因為此組件已作為此伺服器安全配置的一部分而被關閉。系統管理員可以通過使用 sp_configure 啟用 『Ad Hoc Distributed Queries』。有關啟用 『Ad Hoc Distributed Queries』 的詳細信息,請參閱 SQL Server 聯機叢書中的 「外圍應用配置器」。
因為SQL2005默認是沒有開啟』Ad Hoc Distributed Queries』 組件,開啟方法如下
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
關閉Ad Hoc Distributed Queries:
exec sp_configure 'Ad Hoc Distributed Queries', 0
reconfigure
exec sp_configure 'show advanced options', 0
reconfigure
二、分布式事務的配置
1.用DTCPing.exe工具測試兩台機器的DTC服務是否可以聯通。
2.如果有問題檢查MSDTC服務是否啟動。
3.MSDTC依賴於RPC,RPC使用的埠是135,測試135埠是否打開.是否有防火牆?如果有先關了防火牆. telnet IP 135 如果是關閉的打開它.
4.打開「控制面板->管理工具->組件服務」,然後展開「組件服務->計算機->我的電腦」右鍵屬性。選擇MSDTC的Tab欄,點擊安全性配置按鈕,打開窗口,將「網路DTC訪問」選項選中,並將「允許遠程客戶端」,「允許入站」,「允許出站」都選中,並選擇「不要求進行驗證」,「啟用事務Internet協議(TIP)事務」,「啟用XA事務」都選中。然後確定即可。(以上選項windows默認不開放,必須配置)
5.檢查你的兩台伺服器是否在同一個域中. 如果不在同一個域中,是否建立可信任聯接.
6.如果是WIN2000,升級到SP4
7.確認MDAC版本是2.6以上,最好是2.8.
8.在SQL server存儲過程中使用分布式事務時,必須SET XACT_ABORT ON --設置分布式事務如果發生問題主動回滾操作
9.可以聲明使用BEGIN DISTRIBUTED TRANSACTION,如果未明確生明,在事務塊中包含鏈接伺服器的訪問,SQL server會自動升級成分布式事務。
② 怎樣避免讀臟數據
鎖就是防止其他事務訪問指定的資源的手段。鎖是實現並發控制的主要方法,是多個用戶能夠同時操縱同一個資料庫中的數據而不發生數據不一致現象的重要保障。 一般來說,鎖可以防止臟讀、不可重復讀和幻覺讀。
事務並發產生的問題:
臟讀:一個事務讀取到了另外一個事務沒有提交的數據
事務1:更新一條數據
------------->事務2:讀取事務1更新的記錄
事務1:調用commit進行提交
***此時事務2讀取到的數據是保存在資料庫內存中的數據,稱為臟讀。
***讀到的數據為臟數據
詳細解釋:
臟讀就是指:當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到資料庫中,這時,
另外一個事務也訪問這個數據,然後使用了這個數據。因為這個數據是還沒有提交的數據,那麼另外一個
事務讀到的這個數據是臟數據,依據臟數據所做的操作可能是不正確的
不可重復讀:在同一事務中,兩次讀取同一數據,得到內容不同
事務1:查詢一條記錄
-------------->事務2:更新事務1查詢的記錄
-------------->事務2:調用commit進行提交
事務1:再次查詢上次的記錄
***此時事務1對同一數據查詢了兩次,可得到的內容不同,稱為不可重復讀
幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同
事務1:查詢表中所有記錄
-------------->事務2:插入一條記錄
-------------->事務2:調用commit進行提交
事務1:再次查詢表中所有記錄
***此時事務1兩次查詢到的記錄是不一樣的,稱為幻讀
詳細解釋:
幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,
這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表
中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,處理以上隔離級別的問題,採用如下方是:
事務隔離五種級別:
TRANSACTION_NONE 不使用事務。
TRANSACTION_READ_UNCOMMITTED 允許臟讀。
TRANSACTION_READ_COMMITTED 防止臟讀,最常用的隔離級別,並且是大多數資料庫的默認隔離級別
TRANSACTION_REPEATABLE_READ 可以防止臟讀和不可重復讀,
TRANSACTION_SERIALIZABLE 可以防止臟讀,不可重復讀取和幻讀,(事務串列化)會降低資料庫的效率以上的五個事務隔離級別都是在Connection介面中定義的靜態常量,
使用setTransactionIsolation(int level) 方法可以設置事務隔離級別。
如:con.setTransactionIsolation(Connection.REPEATABLE_READ);注意:事務的隔離級別受到資料庫的限制,不同的資料庫支持的的隔離級別不一定相同
③ WEB API形式的數據訪問層如何提供事務處理介面
1. 簡單的手動放置 鍵值對 到JSONObject,然後在put到JSONArray對象里
List<Article> al = articleMng.find(f);
System.out.println(al.size());
HttpServletResponse hsr = ServletActionContext.getResponse();
if(null == al){
return ;
}
for(Article a : al){
System.out.println(a.getId()+a.getDescription()+a.getTitle());
}
JSONArray json = new JSONArray();
for(Article a : al){
JSONObject jo = new JSONObject();
jo.put("id", a.getId());
jo.put("title", a.getTitle());
jo.put("desc", a.getDescription());
json.put(jo);
}
try {
System.out.println(json.toString());
hsr.setCharacterEncoding("UTF-8");
hsr.getWriter().write(json.toString());
} catch (IOException e) {
e.printStackTrace();
}
復制代碼
上述代碼JSONArray是引入的org.json.JSONArray包
而用net.sf.json包下JSONArray的靜態方法:fromObject(list) 這是網上大多是都是直接用此方法快捷轉換JSON,但是對於Hibernate級聯操作關聯的對象,這個方法就會報錯,如果將映射文件中的級聯配置去掉就行了。
另外對於list的要求就是其中的元素是字元串或對象,否則JSON不知道你想要的是什麼數據。
<many-to-one name="cmsent" column="comment_tid" class="com.fcms.cms.entity.CmsComment"
not-null="false" cascade="delete">
但是級聯操作畢竟還是得存在,否則以後數據冗餘、多餘。
解決方法就是:JSONArray subMsgs = JSONArray.fromObject(object, config);
JsonConfig config = new JsonConfig();
config.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object arg0, String arg1, Object arg2) {
if (arg1.equals("article") ||arg1.equals("fans")) {
return true;
} else {
return false;
}
}
});
④ 為什麼資料庫系統使用事務作為管理並發訪問數據的一種方式
//下面使用MySql Connector/net提供的專用對象
MySqlConnection mycon = new MySqlConnection(constr);
mycon.Open();
MySqlCommandmycmd = new MySqlCommand("select * from users", mycon);
MySqlDataReader myreader = mycmd.ExecuteReader();
while (myreader.Read())
⑤ Oracle:如何以事物的方式對資料庫進行訪問
兩次連續成功的COMMIT或ROLLBACK之間的操作,稱為一個事務。在一個事務內,數據的修改一起提交或撤銷,如果發生故障或系統錯誤,整個事務也會自動撤銷。 一 事務的概念 事務是由相關操作構成的一個完整的操作單元。兩次連續成功的COMMIT或ROLLBACK之間的操作,稱為一個事務。在一個事務內,數據的修改一起提交或撤銷,如果發生故障或系統錯誤,整個事務也會自動撤銷。 oracle的數據語音分為數據定義語言(DDL)、數據控制語言(DCL)和數據操縱語言(DML)。其中的DML語言會生成事務,其他兩種語言只要執行,事務就會結束。 簡單的說DML語言可以建立事務,DDL和DCL不能建立事務。 DML語言包括幾個命令,例如 select insert delete update等等,這些命令執行後,當前用戶的顯示信息是更改了,但是其他人訪問你改的表的時候數據並沒有更改,需要使用commit確認後才能更改。如果當前用戶在沒有執行commit前反悔操作了,那使用rollback命令可以回退到執行操縱語句之前,但是如果已經執行了commit語句是無法回退的。 比如,我們去銀行轉賬,操作可以分為下面兩個環節: (1) 從第一個賬戶劃出款項。 (2) 將款項存入第二個賬戶。 在這個過程中,兩個環節是關聯的。第一個賬戶劃出款項必須保證正確的存入第二個賬戶,如果第二個環節沒有完成,整個的過程都應該取消,否則就會發生丟失款項的問題。整個交易過程,可以看作是一個事物,成功則全部成功,失敗則需要全部撤消,這樣可以避免當操作的中間環節出現問題時,產生數據不一致的問題。 一個事務是由一個可執行的SQL語句開始,一個可執行SQL語句產生對實例的調用。在事務開始時,被賦給一個可用回滾段,記錄該事務的回滾項。一個事務以下列任何一個出現而結束。資料庫事務是一個邏輯上的劃分,有的時候並不是很明顯,它可以是一個操作步驟,也可以是多個操作步驟。關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句 內容摘要:事務是由相關操作構成的一個完整的操作單元。兩次連續成功的COMMIT或ROLLBACK之間的操作,稱為一個事務。在一個事務內,數據的修改一起提交或撤銷,如果發生故障或系統錯誤,整個事務也會自動撤銷。 我們可以這樣理解資料庫事物:對資料庫所做的一系列修改,在修改過程中,暫時不寫入資料庫,而是緩存起來,用戶在自己的終端可以預覽變化,直到全部修改完成,並經過檢查確認無誤後,一次性提交並寫入資料庫,在提交之前,必要的話所做的修改都可以取消。提交之後,就不能撤銷,提交成功後其他用戶才可以通過查詢瀏覽數據的變化。 以事務的方式對資料庫進行訪問,有如下的優點: * 把邏輯相關的操作分成了一個組。 * 在數據永久改變前,可以預覽數據變化。 * 能夠保證數據的讀一致性。 二 資料庫事務的應用 資料庫事務處理可分為隱式和顯式兩種。顯式事務操作通過命令實現,隱式事務由系統自動完成提交或撤銷(回退)工作,無需用戶的干預。 隱式提交的情況包括:當用戶正常退出SQL*Plus或執行CREATE、DROP、GRANT、REVOKE等命令時會發生事務的自動提交。 還有一種情況,如果把系統的環境變數AUTOCOMMIT設置為ON(默認狀態為OFF),則每當執行一條INSERT、DELETE或UPDATE命令對數據進行修改後,就會馬上自動提交。設置命令格式如下: SET AUTOCOMMIT ON/OFF 隱式回退的情況包括:當異常結束SQL*Plus或系統故障發生時,會發生事務的自動回退。 顯式事務處理的資料庫事務操作語句有3條,分別是COMMIT,ROLLBACK,SAVEPOINT語句。 COMMIT是資料庫事物提交,將變化寫入資料庫。此操作把多個步驟對資料庫的修改,一次性地永久寫入資料庫,代表資料庫事務的成功執行。ROLLBACK是資料庫事務回退,撤銷對資料庫的修改。操作在發生問題時,把對資料庫已經作出的修改撤消,回退到修改前的狀態。在操作過程中,一旦發生問題,如果還沒有提交操作,則隨時可以使用ROLLBACK來撤消前面的操作。SAVEPOINT則用於在事務中間建立一些保存點,ROLLBACK可以使操作回退到這些點撤上邊,而不必撤銷全部的操作。一旦COMMIT完成,就不能用ROLLBACK來取消已經提交的操作。一旦ROLLBACK完成,被撤消的操作要重做,必須重新執行相關操作語句。 如何開始一個新的事務呢?一般情況下,開始一個會話(即連接資料庫),執行第一條SQL語句將開始一個新的事務,或執行COMMIT提交或ROLLBACK撤銷事務,也標志新的事務的開始。另外,執行DDL(如CREATE)或DCL命令也將自動提交前一個事務而開始一個新的事務。 數據在修改的時候會對記錄進行鎖定,其他會話不能對鎖定的記錄進行修改或加鎖,只有當前會話提交或撤銷後,記錄的鎖定才會釋放。 例如修改雇員SCOTT的工資,工資在原有基礎上增加1000: UPDATE emp SET sal=sal+1000 WHERE empno=7788; 執行結果: 已更新 1 行。 顯示修改後SCOTT的工資: SELECT ename,sal FROM emp WHERE empno=7788; 執行結果: ENAME SAL SCOTT 4000 經查看修改結果正確,提交所做的修改: COMMIT; 執行結果: 提交完成。 在執行COMMIT後,工資的修改被永久寫入資料庫。本訓練的第1步,先使用COMMIT命令提交原來的操作,同時標志一個新的事務的開始。注意:在事務執行過程中,隨時可以預覽數據的變化。
⑥ 怎樣理解事物
通常的觀念認為,事務僅與資料庫相關。
事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(rability)的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確。
通俗的理解,事務是一組原子操作單元,從資料庫角度說,就是一組SQL指令,要麼全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令。更簡答的說就是:要麼全部執行成功,要麼撤銷不執行。
既然事務的概念從資料庫而來,那java事務是什麼?之間有什麼聯系?
實際上,一個Java應用系統,如果要操作資料庫,則通過JDBC來實現的。增加、修改、刪除都是通過相應方法間接來實現的,事務的控制也相應轉移到Java程序代碼中。因此,資料庫操作的事務習慣上就稱為Java事務。
二、為什麼需要Java事務
事務是為解決數據安全操作提出的,事務控制實際上就是控制數據的安全訪問。舉一個簡單例子:比如銀行轉帳業務,賬戶A要將自己賬戶上的1000元轉到B賬戶下面,A賬戶余額首先要減去1000元,然後B賬戶要增加1000 元。假如在中間網路出現了問題,A賬戶減去1000元已經結束,B因為網路中斷而操作失敗,那麼整個業務失敗,必須做出控制,要求A賬戶轉帳業務撤銷。這才能保證業務的正確性,完成這個操作就需要事務,將A賬戶資金減少和B賬戶資金增加方到一個事務裡面,要麼全部執行成功,要麼操作全部撤銷,這樣就保持了數據的安全性。
三、Java事務的類型
Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。
1、JDBC事務
JDBC 事務是用 Connection 對象控制的。JDBC Connection 介面( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。 java.sql.Connection 提供了以下控制事務的方法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事務界定時,您可以將多個 SQL 語句結合到一個事務中。JDBC 事務的一個缺點是事務的范圍局限於一個資料庫連接。一個 JDBC 事務不能跨越多個資料庫。
2、JTA(Java Transaction API)事務
JTA是一種高層的,與實現無關的,與協議無關的API,應用程序和應用伺服器可以使用JTA來訪問事務。
JTA允許應用程序執行分布式事務處理——在兩個或多個網路計算機資源上訪問並且更新數據,這些數據可以分布在多個資料庫上。JDBC驅動程序的JTA支持極大地增強了數據訪問能力。
如果計劃用 JTA 界定事務,那麼就需要有一個實現 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 介面的 JDBC 驅動程序。一個實現了這些介面的驅動程序將可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnection s 是參與 JTA 事務的 JDBC 連接。
您將需要用應用伺服器的管理工具設置 XADataSource .從應用伺服器和 JDBC 驅動程序的文檔中可以了解到相關的指導。
J2EE應用程序用 JNDI 查詢數據源。一旦應用程序找到了數據源對象,它就調用 javax.sql.DataSource.getConnection() 以獲得到資料庫的連接。
XA 連接與非 XA 連接不同。一定要記住 XA 連接參與了 JTA 事務。這意味著 XA 連接不支持 JDBC 的自動提交功能。同時,應用程序一定不要對 XA 連接調用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() .
相反,應用程序應該使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() .
3、容器事務
容器事務主要是J2EE應用伺服器提供的,容器事務大多是基於JTA完成,這是一個基於JNDI的,相當復雜的API實現。相對編碼實現JTA 事務管理,我們可以通過EJB容器提供的容器事務管理機制(CMT)完成同一個功能,這項功能由J2EE應用伺服器提供。這使得我們可以簡單的指定將哪個方法加入事務,一旦指定,容器將負責事務管理任務。這是我們土建的解決方式,因為通過這種方式我們可以將事務代碼排除在邏輯編碼之外,同時將所有困難交給 J2EE容器去解決。使用EJB CMT的另外一個好處就是程序員無需關心JTA API的編碼,不過,理論上我們必須使用EJB.
四、三種Java事務差異
1、JDBC事務控制的局限性在一個資料庫連接內,但是其使用簡單。
2、JTA事務的功能強大,事務可以跨越多個資料庫或多個DAO,使用也比較復雜。
3、容器事務,主要指的是J2EE應用伺服器提供的事務管理,局限於EJB應用使用。
五、總結
Java事務控制是構建J2EE應用不可缺少的一部分,合理選擇應用何種事務對整個應用系統來說至關重要。一般說來,在單個JDBC 連接連接的情況下可以選擇JDBC事務,在跨多個連接或者資料庫情況下,需要選擇使用JTA事務,如果用到了EJB,則可以考慮使用EJB容器事務。
⑦ 如何查詢登陸用戶訪問事務碼的歷史數據
可以用STAT查看本次系統啟動以來的以後使用情況;
如果希望長期記錄歷史的話,就要配置Security
Audit
⑧ 在資料庫的事務管理中,什麼是並發訪問為什麼要並發訪問
並發訪問是可能會發生兩個用戶同時對一張表的同一條數據進行修改等操作,這是可能發生的情況,不是故意要同時訪問,所以沒有為什麼!
⑨ 什麼是事務,事務的四個特性是什麼
事務一般是指要做的或所做的事情。
事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
1、原子性:一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
2、一致性:事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
3、隔離性:一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
4持久性:持久性也稱永久性,指一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
(9)事務訪問擴展閱讀
手動事務允許顯式處理若干過程,這些過程包括:開始事務、控制事務邊界內的每個連接和資源登記、確定事務結果(提交或中止)以及結束事務。
盡管此模型提供了對事務的標准控制,但它缺少一些內置於自動事務模型的簡化操作。例如,在手動事務中數據存儲區之間沒有自動登記和協調。此外,與自動事務不同,手動事務中事務不在對象間流動。
如果選擇手動控制分布式事務,則必須管理恢復、並發、安全性和完整性。也就是說,必須應用維護與事務處理關聯的 ACID 屬性所需的所有編程方法。