好像spring的事务注解方式没法在子线程中起作用,查了下网上都用编程式手动代码去控制子线程事务,是否还有其他更简便的方式?
题主一些问题没说清楚,下面就假设推论一下:
先假设题主是想当子线程异常时候,回滚主线程事务吧:
1、主线程和子线程是独立的两个线程,这两个线程的执行是异步的,即:有可能主线程事务已经执行完了,子线程仍在执行中,这时候,子线程无论出什么错,主线程的事务也不可能回滚了。
2、假设题主 会自行控制,在主线程中阻塞等待 子线程执行完成,然后再根据子线程的执行状态(是否有异常)决定是提交或者回滚主线程事务。
如果主线程使用了Spring注解事务,那么就简单了,只需要观察到子线程执行异常,那么主线程同样丢出异常就可以了,这样主线程的事务就会自动回滚。
3、常见的主线程阻塞等待子线程执行完毕,并获取执行结果的方法,可以把子线程的执行逻辑包装成一个Runnable或者Callable,然后放到线程池中执行,在主线程中根据Future.get()来实现阻塞等待、以及获取子线程的异常(假如有)。
事务和线程绑定,一个线程的事务管不了另外一个线程的,只能通过获取另一个线程的执行状态来控制各个线程的执行状态的一致性.
另外使用多线程会使效率降低的,cpu资源是一定的,使用多线程会加大时间片的获取概率,但是jvm在用户态和内核态中切换线程会造成大量的消耗.
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
spring事务就是和线程绑定,实现线程隔离,你这操作是反spring事务设计,违背了它的设计方案,那你还能坚持用它?