『壹』 事務未提交解決方法
事務未提交會提示:Lock wait timeout exceeded; try restarting transaction等待超時。散租
在mysql查詢中執行以下指者掘旦令
select * from information_schema.innodb_trx
用kill 殺死對應的線程id即可首擾
//將資料庫中的數據條數分段
publicvoiddivision(){
//獲取要導入的總的數據條數
Stringsql3="SELECTcount(*)FROM[CMD].[dbo].[my1]";
try{
pss=cons.prepareStatement(sql3);
rss=pss.executeQuery();
while(rss.next()){
System.out.println("總記錄條數:"+rss.getInt(1));
sum=rss.getInt(1);
}
//每30000條記錄作為一個分割點
if(sum>=30000){
n=sum/30000;
resie=sum%30000;
}else{
resie=sum;
}
System.out.println(n+""+resie);
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
線程類
publicMyThread(intstart,intend){
this.end=end;
this.start=start;
System.out.println("處理掉余數");
try{
System.out.println("--------"+Thread.currentThread().getName()+"------------");
Class.forName(SQLSERVERDRIVER);
System.out.println("載入sqlserver驅動...");
cons=DriverManager.getConnection(CONTENTS,UNS,UPS);
stas=cons.createStatement();
System.out.println("連接SQLServer資料庫成功!!");
System.out.println("載入mysql驅動.....");
Class.forName(MYSQLDRIVER);
con=DriverManager.getConnection(CONTENT,UN,UP);
sta=con.createStatement();
//關閉事務自動提交
con.setAutoCommit(false);
System.out.println("連接mysql資料庫成功!!");
}catch(Exceptione){
e.printStackTrace();
}
//TODOAuto-generatedconstructorstub
}
publicArrayList<Member>getAll(){
Membermember;
Stringsql1="select*from(selectrow_number()over(orderbypmcode)asrowNum,*"+
"from[CMD].[dbo].[my1])astwhererowNumbetween"+start+"and"+end;
try{
System.out.println("正在獲取數據...");
allmembers=newArrayList();
rss=stas.executeQuery(sql1);
while(rss.next()){
member=newMember();
member.setAddress1(rss.getString("address1"));
member.setBnpoints(rss.getString("bnpoints"));
member.setDbno(rss.getString("dbno"));
member.setExpiry(rss.getString("expiry"));
member.setHispoints(rss.getString("hispoints"));
member.setKypoints(rss.getString("kypoints"));
member.setLevels(rss.getString("levels"));
member.setNames(rss.getString("names"));
member.setPmcode(rss.getString("pmcode"));
member.setRemark(rss.getString("remark"));
member.setSex(rss.getString("sex"));
member.setTelephone(rss.getString("telephone"));
member.setWxno(rss.getString("wxno"));
member.setPmdate(rss.getString("pmdate"));
allmembers.add(member);
//System.out.println(member.getNames());
}
System.out.println("成功獲取sqlserver資料庫數據!");
returnallmembers;
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
System.out.println("獲取sqlserver資料庫數據發送異常!");
e.printStackTrace();
}
try{
rss.close();
stas.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}
publicvoidinputAll(ArrayList<Member>allmembers){
System.out.println("開始向mysql中寫入");
Stringsql2="insertintotest.my2values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try{
ps=con.prepareStatement(sql2);
System.out.println("-------------------------等待寫入數據條數:"+allmembers.size());
for(inti=0;i<allmembers.size();i++){
ps.setString(1,allmembers.get(i).getPmcode());
ps.setString(2,allmembers.get(i).getNames());
//System.out.println(allmembers.get(i).getNames());
ps.setString(3,allmembers.get(i).getSex());
ps.setString(4,allmembers.get(i).getTelephone());
ps.setString(5,allmembers.get(i).getAddress1());
ps.setString(6,allmembers.get(i).getPmdate());
ps.setString(7,allmembers.get(i).getExpiry());
ps.setString(8,allmembers.get(i).getLevels());
ps.setString(9,allmembers.get(i).getDbno());
ps.setString(10,allmembers.get(i).getHispoints());
ps.setString(11,allmembers.get(i).getBnpoints());
ps.setString(12,allmembers.get(i).getKypoints());
ps.setString(13,allmembers.get(i).getWxno());
ps.setString(14,allmembers.get(i).getRemark());
//插入命令列表
//ps.addBatch();
ps.executeUpdate();
}
//ps.executeBatch();
con.commit();
ps.close();
con.close();
this.flag=false;
System.out.println(Thread.currentThread().getName()+"--->OK");
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
System.out.println("向mysql中更新數據時發生異常!");
e.printStackTrace();
}
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true&&flag){
this.inputAll(getAll());
}
}
『叄』 java中一個線程怎麼通知另外一個線程進行資料庫事務回滾或者提交
需要一個 全局的標志位 來控制 線程是否回滾
在 運行的線程中 改變 全局的標志位 然後 回滾線程 判定這個 標志位的 狀態 來進行 是否的回滾開關。
『肆』 java事務和鎖的問題,如果事務沒提交,其他線程能修改資料庫中的同條數據嗎
題主,你說的這種情況是允許出現的。這與事務的隔離程度有關。
如果事務隔離程度設置得當,就沒有必要顯式的通過synchronized保護資源(除非資源是某個service中的公共屬性)。
『伍』 JAVA 線程池 其中一個線程執行失敗 則線程重新執行或者重新提交任務 急
futrue.get()是在線程執行完畢之後才返回的結果。 就是說你能得到get的返回值的時候,線程已經執行完畢並退出了。
『陸』 求助java多線程問題
問題現象:
js">if(num>4&&p.isAlive()==false){
//主線程的判斷邏輯中num的值一直都沒增加,所以if中的邏輯一直沒有執行
//因此,線程未啟動
}
問題原因:
並發中的線程安全問題導致。
原因分析:
線程A對num的修改體讓晌現坦銷鋒在線程A的寄存器及內存中
主線程中,通過while循環不間斷的訪問num,導致JVM為了提高速度,一直都在從主線程寄存器中獲取num的值,因此num的值一直未增加到5。
問題解決:
方法一:在num前增加修飾符volatile,使所有線程對num的訪問都從內存讀取
斗空方法一:對num進行同步處理
(){
num++;
}
(){
returnnum;
}
『柒』 java程序往oracle的事務性臨時表裡插入數據後,沒提交或回滾事務,卻無法查到數據
你在Dao實現類里的那個1sql 語句執行完後 在this.2sql語句的方法試試
『捌』 Java多線程問題總結
Java多線程分類中寫了21篇多線程的文章,21篇文章的內容很多,個人認為,學習,內容越多、越雜的知識,越需要進行深刻的總結,這樣才能記憶深刻,將知識變成自己的。java課程培訓機構認為這篇文章主要是對多線程的問題進行總結的,因此羅列了多個多線程的問題。
這些多線程的問題,有些來源於各大網站、有些來源於自己的思考。
(1)發揮多核CPU的優勢
隨著工業的進步,現在的筆記本、台式機乃至商用的應用伺服器至少也都是雙核的,4核、8核甚至16核的也沖行培都不少見,如果是單線程的程序,那麼在雙核CPU上就浪費了50%,在4核CPU上就浪費了75%。單核CPU上所謂的」多線程」那是假的多線程,同一時間處理器只會處理一段邏輯,只不過線程之間切換得比較快,看著像多個線程」同時」運行罷了。多核CPU上的多線程才是真正的多線程,它能散唯讓你的多段邏輯同時工作,多線程,可以真正發揮出多核CPU的優勢來,達到帶念充分利用CPU的目的。
(2)防止阻塞
從程序運行效率的角度來看,單核CPU不但不會發揮出多線程的優勢,反而會因為在單核CPU上運行多線程導致線程上下文的切換,而降低程序整體的效率。但是單核CPU我們還是要應用多線程,就是為了防止阻塞。試想,如果單核CPU使用單線程,那麼只要這個線程阻塞了,比方說遠程讀取某個數據吧,對端遲遲未返回又沒有設置超時時間,那麼你的整個程序在數據返回回來之前就停止運行了。多線程可以防止這個問題,多條線程同時運行,哪怕一條線程的代碼執行讀取數據阻塞,也不會影響其它任務的執行。
(3)便於建模
這是另外一個沒有這么明顯的優點了。假設有一個大的任務A,單線程編程,那麼就要考慮很多,建立整個程序模型比較麻煩。但是如果把這個大的任務A分解成幾個小任務,任務B、任務C、任務D,分別建立程序模型,並通過多線程分別運行這幾個任務,那就簡單很多了。
『玖』 Java多線程問題
System.out.println("End of method.");
可虛蘆含能在System.out.println("run.");之前也可能在之後執行。
但是一旦throw new RuntimeException("Problem");執行就不會再執行System.out.println("End of method.");
所以就是三種可能性。
這里因為輸出和拋出異嘩改常的操作都差笑是同步的,所以可以看成原子操作。另外就是發生異常程序就會停止。
『拾』 資料庫事務不提交或提交失敗需要回滾嗎
1.
在同一事務條件下,回滾和不提交,表現是一樣的
但是還有些差別
事務處理,是將操作事件交給資料庫(模擬)運行,直到吵渣commit操作,才使得修改實際產生效果,你可以看做是未提交事務都是處於一個臨時庫中進行
回滾是對於同一個事務,如果產生了錯誤,那麼取消這個臨時庫中的操作,不對實際數據產生影響
最主要的區別在於,如果不回滾,這些臨時操作會持續到這個御滲個connection結束為止,也就是雖然你看不到,但是臨時庫的操作依然存在,而回鎮碰脊滾是即時生效,其實都是回滾了,只是時間點的不一樣
2.
我說你在開玩笑吧。沒有提交事務並不代表你對資料庫的改變不存在,如果是臟讀的隔離層級你修改數據到提交完成前的變更其他訪問者也是可以看到的。只有你提交後這部分修改才確認不會變更而已,哪怕設定了其他隔離級別也可以看到了。
如果你不回滾,那麼線程就停在哪裡擱著?製造出資料庫死鏈放著不管直到資料庫認為這個連接超時自動斷開並自動回滾?
ISOLATION_READ_UNCOMMITTED:允許讀取其他並發事務還未提交的更新,會導致事務之間的3個缺陷發生,這是速度最快的一個隔離級別,但同 時它的隔離級別也是最低