1. 程式人生 > >Thread.sleep對事務的影響?

Thread.sleep對事務的影響?

我的測試程式碼如下:事務隔離級別為repeatable read
//來自《精通Hibernate》
package com.test;

import java.util.ArrayList;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.model.Account;

public class TestHql3 extends Thread{
private String transactionType;
private Log log;
private static Session session = HibernateSessionFactory.getSession();
public TestHql3(String transactionType, Log log) {
super();
this.transactionType = transactionType;
this.log = log;
}

public void run() {
try {
if (transactionType.equals("withdraw"))
withdraw();
else
transferCheck();
} catch (Exception e) {
e.printStackTrace();
}
}
public void withdraw() throws Exception {

Transaction tx = session.beginTransaction();
log.write("withdraw():開始事務");
Thread.sleep(500);
Account account = (Account)session.get(Account.class, new Integer(1));
log.write("withdraw():查詢到存款餘額為:balance="+account.getBalance());
Thread.sleep(500);

account.setBalance(account.getBalance()-100);
log.write("withdraw():取出100元,把存款餘額改為:"+account.getBalance());

log.write("withdraw:提交事務");
tx.commit();
Thread.sleep(500);

}
public void transferCheck() throws Exception {
//Thread.sleep(10);

-----------------------------------------------------------
Transaction tx = session.beginTransaction();
log.write("transferCheck():開始事務");
Thread.sleep(500);

Account account = (Account)session.get(Account.class, new Integer(1));

log.write("transferCheck():查詢到餘額為:balance = "+account.getBalance());
Thread.sleep(500);

account.setBalance(account.getBalance()+100);
log.write("transferCheck():匯入100元,把餘款改為:"+account.getBalance());

log.write("transferCheck():提交事務");
tx.commit();
Thread.sleep(500);
}
public void registerAccount() throws Exception {

}
public static void main(String args[]) throws Exception {
Log log = new Log();
Thread withdrawThread = new TestHql3("withdraw",log);
Thread transferCheckThread = new TestHql3("thransferCheck",log);

withdrawThread.start();
transferCheckThread.start();
while(withdrawThread.isAlive()||transferCheckThread.isAlive())
Thread.sleep(100);
log.print();
session.close();
}

}

class Log {
private ArrayList<String> logs = new ArrayList<String>();

synchronized void write(String text) {
logs.add(text);
}

public void print() {
for (String s : logs) {
System.out.println(s);
}
}
}

輸出:

1.當標記為紅色的哪行為Thread.sleep(0)是一切正常:

transferCheck():開始事務
withdraw():開始事務
withdraw():查詢到存款餘額為:balance=900
transferCheck():查詢到餘額為:balance = 900
withdraw():取出100元,把存款餘額改為:800
transferCheck():匯入100元,把餘款改為:1000
withdraw:提交事務
transferCheck():提交事務

2.當標記為紅色的哪行為Thread.sleep(5),輸出出錯:

java.lang.NullPointerException
    at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:471)
    at org.hibernate.jdbc.AbstractBatcher.closeStatement(AbstractBatcher.java:218)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:198)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at com.test.TestHql3.withdraw(TestHql3.java:44)
    at com.test.TestHql3.run(TestHql3.java:24)
withdraw():開始事務
transferCheck():開始事務
withdraw():查詢到存款餘額為:balance=1000
transferCheck():查詢到餘額為:balance = 1000
withdraw():取出100元,把存款餘額改為:900
transferCheck():匯入100元,把餘款改為:1100
withdraw:提交事務
transferCheck():提交事務

3.當標記為紅色的哪行為Thread.sleep(10),輸出出錯:

java.lang.ArrayIndexOutOfBoundsException: 1
    at org.hibernate.util.IdentityMap.entryArray(IdentityMap.java:199)
    at org.hibernate.util.IdentityMap.concurrentEntries(IdentityMap.java:59)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:113)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at com.test.TestHql3.transferCheck(TestHql3.java:63)
    at com.test.TestHql3.run(TestHql3.java:26)
java.lang.ArrayIndexOutOfBoundsException: 1
    at org.hibernate.util.IdentityMap.entryArray(IdentityMap.java:199)
    at org.hibernate.util.IdentityMap.concurrentEntries(IdentityMap.java:59)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:113)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at com.test.TestHql3.withdraw(TestHql3.java:44)
    at com.test.TestHql3.run(TestHql3.java:24)
withdraw():開始事務
transferCheck():開始事務
withdraw():查詢到存款餘額為:balance=1000
transferCheck():查詢到餘額為:balance = 1000
transferCheck():匯入100元,把餘款改為:1100
withdraw():取出100元,把存款餘額改為:900
transferCheck():提交事務
withdraw:提交事務


4.當標記為紅色的哪行為Thread.sleep(100),輸出出錯://這個應該是巢狀事務出錯

org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)
    at com.test.TestHql3.transferCheck(TestHql3.java:63)
    at com.test.TestHql3.run(TestHql3.java:26)
withdraw():開始事務
transferCheck():開始事務
withdraw():查詢到存款餘額為:balance=1100
transferCheck():查詢到餘額為:balance = 1100
withdraw():取出100元,把存款餘額改為:1000
withdraw:提交事務
transferCheck():匯入100元,把餘款改為:1100
transferCheck():提交事務

相關推薦

Thread.sleep事務影響

我的測試程式碼如下:事務隔離級別為repeatable read//來自《精通Hibernate》package com.test;import java.util.ArrayList;import org.hibernate.Session;import org.hiber

Mysql加鎖過程詳解(4)-select for update/lock in share mode 事務並發性影響

per inno targe 允許 evel transacti 修改 not null warn select for update/lock in share mode 對事務並發性影響 事務並發性理解 事務並發性,粗略的理解就是單位時間內能夠執行的事務數量,常見的單

MySQL可重復讀采坑記錄-事務B進行更新時,事務A提交的更新會不會影響事務B

但是 start clas 行數 通過 基礎上 transacti 隔離 delete 之前線上出現數據重復插入的問題,通過對問題進行排查發現該問題和MySQL的默認隔離級別-Repeatable Read(可重讀)有關系,可重復讀確保同一事務的多個實例在並發讀取數據時,會

shiro事務影響

記一個 No transaction aspect-managed TransactionStatus in scope 錯誤的解決方法  昨天出現一個BUG,事務沒有加回滾成功,修改管理員密碼事務沒有回滾成功 報錯  No transaction aspect-managed

Redis事務裡錯誤事務影響

網友寫的 Redis的事務 並沒有對裡面的 case3:全體連坐 和 case4 :冤頭債主(哪個執行失敗就失敗,其他成功就成功) 並沒有解釋兩個區別。其實 Redis Transactions 裡 “Errors inside a

Thread.Sleep()導致界面卡死問題

color cati sleep blog col logs 資料 開發 關閉 最近開發一個界面,為了實現界面延時自動關閉,加了一句代碼Thread.Sleep(2000)。開發過程中未發現問題。後來測試發現,如果這個時候點擊界面,會導致系統崩潰。 於是找了一些資料,得到如

事務的深入理解

技術 回滾 平臺 com 一個 許多事 isolation 自己的 管理 1.事務是對一系列動作的組合 2.事務是對一系列動作的組合 3.事務是對一系列動作的組合 4.事務是對一系列動作的組合,要麽全都成功,要麽全都失敗回滾 5.事務是對一系列動作的組合,要麽全都成

Thread sleep()休眠

ktr cep int new t static 中斷線程 print sets ring Thread sleep()休眠就是讓線程進入休眠狀態TIMED_WAITING,sleep("毫秒數"),當休眠時間到了之後繼續線程。當然也可以用中斷線程interrupt()來中

JavaSE8基礎 多線程Thread.sleep 休眠1秒鐘

pack image tar sys alt 技術 測試類 ++i todo 禮悟: 好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。 虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。 os

Spring事務的支持

bsp ddt nag 支持 切點 requires comm 特定 eas 1、ThreadLocal   在寫Spring對事務的支持之前要先了解一下ThreadLocal,當多個線程訪問同一個成員變量時,如果這個變量不做處理,那肯定會造成線程不安全的問題啊。使用Thr

事務的學習,從jdbc開始:jdbc事務的支持與實現

如何實現 ransac 阻止 事務隔離 完成後 value 事務提交 val ack   在使用spring對項目進行開發時,所有的事務都是由spring來管理的。這樣一來我們就可以不需要操心事務,可以專心的處理業務代碼。   但是,事務的底層究竟是如何實現的呢?那就從j

Spring4(7)—— 事務 的支持

持久 strong -c result fin framework ida 內部 back 1.事務 滿足一下四個條件: 1. 原子性; 2. 一致性; 3. 隔離性; 4. 持久性; 場景:轉賬 ( 成功從A轉出,但未成功轉入B ,出現業務的不一致性,需要事務回滾)

Spring 事務管理的支援

Spring AOP @AspectJ進階 @AspectJ可以使用切點函式定義切點,我們還可以使用邏輯運算子對切點進行復核運算得到複合的切點,為了在切面中重用切點,我們還可以對切點進行命名,以便在其他的地方引用定義過的切點。當一個連線點匹配多個切點時,需要考慮織入順序的問題,此外一個重要的

Spring4(7)—— 事務 的支援

1.事務 滿足一下四個條件: 1. 原子性; 2. 一致性; 3. 隔離性; 4. 永續性; 場景:轉賬 ( 成功從A轉出,但未成功轉入B ,出現業務的不一致性,需要事務回滾) 2.程式設計式事務管理(用的少) Spring 提供的事務模版類

java中TimeUnit vs Thread.sleep的用法對比

xl_echo編輯整理,交流學習請加1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!! 本文轉載自:https://blog.csdn.net/u012843873/article/details/78624391 imeUnit

Thread.sleep() 執行緒睡眠

通俗的理解 :        就是放在你想讓執行緒休息的地方,比如你列印一些隨機數的話,你想讓它列印的速率慢一點,這個時候,你就可以在列印那個地方sleep()一下。 定義理解: Thread.Sleep()方法用於將當前執行緒休眠一定時間 時

影響最深的三個老師

和我 一聲 沒有 但是 物理 接下來 真的 自己 早就 轉眼自己已是一名大學生,林老師布置的這個作業讓我回想起從我讀書以來教過我的老師。她們對我的影響很大,我想要不是她們就不會有今天的我。 第一個是五年級英語老師,因為來自農村,教育比較落後,以致到五年級才開始接觸英語,而別

回憶印象中影響最大的三位老師

在人一生記憶的長河中,總有著一些人。他們說的一些話,做的一些事,銘刻在你的生命中伴隨著你成長。今天,我來就來說說記憶中對我影響最大的三位老師。 郭小龍, 我的初中班主任,也是我的死對頭。說到這可能很多人覺得奇怪。死對頭?那不是應該是提都不想提的嗎。恰恰相反,其實包括後面要說的老師,還都算和我“命裡犯衝”的。那

ssm框架中通過自定義異常實現事務的管理

什麼時候回滾事務? 在spring的事務管理中我們首先要明白這個問題,一般是在丟擲執行期異常的時候會進行事務的回滾。而spring的宣告式事務管理只接受執行期異常。 異常通常分為執行期異常和編譯期異常。 在java中常見的執行期異常有: NullPointerExcept

事務的小結

事務註解transaction註解是spring框架的。 通過觀察原始碼,可知transaction的屬性: value:事務管理器 propagation 傳播行為,預設不存在事務則新建,否則新增到已有事務 isolation 隔離級別 readOnly 是否讀寫