新开一个线程事务怎么控制?

在run方法里没法用@Transactional来做事务,run方法上又不能加exception,怎么能控制事务保证异常就回滚呢?

阅读 10.1k
4 个回答

run方法里调service方法。

写个函数就可以加@Transactional和抛出Exception了

ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Object> future = executorService.submit(new Callable<Object>() {
    @Override
    public Object call() throws Exception {
        // return results
        return null;
    }
});
// get results
future.get();

通过concurrent并发编程中的api可以拿到线程的返回值。

final Lock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
final AtomicReference<Object> results = new AtomicReference<>();
Thread t = new Thread() {

    @Override
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        lock.lock();
        // set results
        results.set("success");
        condition.signalAll();
        lock.unlock();
    }
};
t.start();

lock.lock();
condition.await();
// get results
System.out.println(results.get());
lock.unlock();

普通线程也可以使用上述方式模拟线程的返回值,来决定事务的commit/rollback

具体业务做的时候最好调用外部方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏