還有些許遺漏,實驗理論上並不十分嚴密!
1、 交易隔離等級設定
Oracle有兩種交易隔離等級,分別是Connection.TRANSACTION_READ_COMMITTED(讀已提交)和Connection.TRANSACTION_SERIALIZABLE(串列讀)。如果設定隔離等級出錯,會拋異常如下java.sql.SQLException: 僅 READ_COMMITTED 和 SERIALIZABLE 是有效交易處理級。
DBF僅僅支援Connection.TRANSACTION_READ_COMMITTED(讀已提交),其它類型的資料庫交易隔離等級,當前使用的驅動不支援,會拋異常。
2、 在開啟事務情況下的對比:
實驗一:程式中開兩個線程,一個批量提交(每次插入100條資料),一個去讀資料庫。原始表中資料為空白。
Oracle在事務開啟時,如果沒有做commit操作,其它線程是不會讀到未提交的資料的。在這種情況下,讀資料的線程每次讀出的資料數目都是100的整數。另外加上刪除線程以後也是一樣的。
第:1次查詢 查詢影響資料數目:0 第:2次查詢 查詢影響資料數目:0 第:3次查詢 查詢影響資料數目:0 第:4次查詢 查詢影響資料數目:100 第:1次插入 第:5次查詢 查詢影響資料數目:100 第:2次插入 第:6次查詢 查詢影響資料數目:200 第:7次查詢 查詢影響資料數目:300 第:8次查詢 查詢影響資料數目:300 第:9次查詢 查詢影響資料數目:300 第:10次查詢 查詢影響資料數目:300 第:11次查詢 查詢影響資料數目:300 |
而對於DBF資料庫來說,雖然事務開啟了,但是其它線程可以讀到當前線程未提交的資料。理論上來說,讀取資料的線程每次讀出的資料個數應該是100的倍數,但是實際情況不是這樣的。運行結果如下:
查詢影響資料數:0 查詢影響資料數:0 查詢影響資料數:24 查詢影響資料數:43 查詢影響資料數:57 查詢影響資料數:75 查詢影響資料數:93 插入影響資料數:100 查詢影響資料數:100 查詢影響資料數:100 查詢影響資料數:120 查詢影響資料數:138 查詢影響資料數:155 查詢影響資料數:169 查詢影響資料數:187 插入影響資料數:100 查詢影響資料數:200 |
根據測試結果來看,事務設定的隔離等級似乎沒有生效,讀到了寫資料的線程沒有提交的資料,沒有達到預期的不讀中間資料的目的。
注意:
dbf一種特殊的檔案格式!表示資料庫檔案,Foxbase,Dbase,VisualFoxPro,等資料庫處理系統所產生的資料庫檔案! 本身並不是資料庫。
如果說需要用到傳統的資料庫事務,那麼可不可以有一個中間過程,程式操作在傳統的大型資料庫Oracle或者SQL Server上進行,然後最後匯出成DBF檔案。通過預存程序或者程式。
相關參考文獻如下:
http://wenku.baidu.com/view/4965352b3169a4517723a33f.html
http://wen-xudong7.javaeye.com/blog/409181
http://tech.it168.com/oldarticle/2006-07-18/200607181949046.shtml