`

threadLocal的使用场景--事务下的日志记录

    博客分类:
  • java
阅读更多
threadLocal在系统中的使用场景,每发生一笔交易,无论成功失败都要进行数据库记录作为交易日志,成功的不需要多少,失败的时候就需要做一些事务回滚,这里使用的事务回滚是通过异常机制来控制(也可以手动回滚)。当发生异常时就事务回滚,并通过threadLocal记录异常发生时的交易快照以及失败原因,在调用层进行获取并记录;看起来是很正常的一个方案,线上不久就开始出现问题:插入交易日志时,交易流水号重复的问题(每一笔一个唯一流水号)。
根据业务分析一下场景
场景1,如果是交易正常结束,则正常返回一个交易日志,并进行流水日志保存
场景2,如果交易失败,会抛出异常进行事务回滚,在controller 层会对此异常进行捕捉, 并对threadlocal中的值的保存,
原本以为是保存后并没有对threadLocal 中的值进行清理,导致了这个问题,所以就很开心的添加了清理操作,愉快的上线了,但是依然出现了上述问题,好吧装逼失败,只能继续定位
一步步来,发生了异常,对当前threadLocal 进行set值,然后异常抛出到上层,在catch时进行threadLocal的获取日志信息,进行保存,这个时候能对应threadLocal 清理的问题已经无所谓了,因为如果发生了异常就会对threadLocal 中进行覆盖,然后再在ctrl获取,这样进行循环,一切都看起来那么自然,但是问题总归是客观存在的,能出现上述的问题只能是在某一个异常的地方没有对threadLocal 进行覆盖,导致最后保存的还是上一个失败交易的日志,最终保存的时候出现问题
经过代码review 确实是一个第三方异常没有做覆盖处理,导致了此问题

此问题 的引申,是否有更好的方式可以解决此问题,1 request,因为每次的request必须是新的,不会出现request共享问题,所以也可以解决上述的问题

2使用异常机制,将异常机制做到足够细致,可以包含各个细节的异常都可以以枚举的形式,这样不需要threadLocal 或者request,只需要根据异常的信息进行保存就可以知道出现的详细信息了
分享到:
评论

相关推荐

    java事务 - threadlocal

    在具体实践中,开发者需要根据业务场景合理选择事务管理方式和ThreadLocal的使用,以保证系统的性能和数据一致性。例如,在分布式服务中,可能会使用分布式事务解决方案如两阶段提交(2PC)、补偿事务(TCC)等,而...

    java中ThreadLocal类的使用

    下面我们将深入探讨`ThreadLocal`的工作原理、使用场景以及常见误区。 `ThreadLocal`类的主要方法有以下几个: 1. `void set(T value)`:设置当前线程的线程局部变量的值。 2. `T get()`:返回当前线程的线程局部...

    ThreadLocal原理及在多层架构中的应用

    - **日志记录器**:在日志系统中,每个线程可以有自己的日志记录器实例,避免在多线程环境下对同一日志对象进行同步。 ### 3. ThreadLocal的优缺点 优点: - **简单易用**:ThreadLocal提供了一种简单的线程间数据...

    Java源码解析ThreadLocal及使用场景

    Java源码解析ThreadLocal及使用场景 ThreadLocal是Java中一个非常重要的类,它在多线程环境下经常使用,用于提供线程本地变量。这些变量使每个线程都有自己的一份拷贝,使得多个线程可以独立地使用变量,不会彼此...

    正确理解ThreadLocal.pdf

    3. **日志记录**:在多线程环境中,`ThreadLocal`可以用于维护每个线程的日志上下文,如线程ID、用户名等,便于日志信息的记录和分析。 4. **性能优化**:在某些计算密集型应用中,`ThreadLocal`可以用于缓存线程...

    ThreadLocal,你真的了解吗?

    3. 实现线程本地配置,如日志记录器、线程优先级等。 总结,ThreadLocal 提供了一种线程隔离的变量存储方式,而 Java 中的四种引用类型则帮助我们更好地控制对象的生命周期和内存管理,理解这些概念对于理解和使用 ...

    理解ThreadLocal

    此外,ThreadLocal 还有很多其他的应用场景,例如在事务管理、日志记录、会话管理等方面都可以使用 ThreadLocal 来实现线程局部变量的管理。 ThreadLocal 的应用非常广泛, Java 开发者应该掌握它来提高开发效率和...

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    - 容器内部使用:例如Spring框架中的TransactionTemplate就是利用ThreadLocal来管理事务的。 以上是对ThreadLocal的简单介绍和源码分析,实际使用中还需要结合具体业务场景进行合理设计和优化。通过深入理解...

    Java 并发编程之ThreadLocal详解及实例

    - **日志记录**:为每个线程设置一个日志对象,便于区分不同线程的日志输出。 4. **实例代码** ```java import java.util.concurrent.atomic.AtomicInteger; public class UniqueThreadIdGenerator { private...

    java 中ThreadLocal 的正确用法

    * 日志记录的线程关联 * 等等 ThreadLocal 的注意事项 在使用 ThreadLocal 时,我们需要注意以下几点: * ThreadLocal 变量应该是 private static 的,以避免外部访问和修改。 * 在使用 ThreadLocal 时,需要确保...

    笔试面试题国内知名公司

    - ThreadLocal原理及应用场景 - 并发工具类:CountDownLatch、CyclicBarrier、Semaphore等 5. **Java IO/NIO** - 字节流、字符流的使用 - 文件操作 - 缓冲区、转换流 - NIO(New IO)的介绍,包括Channel、...

    有关ThreadLocal的面试题你真的懂了吗

    3. ThreadLocal的使用场景:ThreadLocal常用于解决多线程程序的并发问题,如每个请求的关联、事务管理、日志记录等。 4. ThreadLocal的优点:ThreadLocal提供了一种解决多线程程序并发问题的思路,可以避免某些情况...

    高频的java面试题,java后端面试必备

    - 高可用与高并发场景下的MQ解决方案。 这些知识点涵盖了Java后端开发的关键技术,深入理解并能灵活运用它们,对于提升开发效率、优化系统性能、解决实际问题至关重要。面试中,面试官可能通过这些问题来检验候选...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    在多数据源场景下,Druid可以为每个数据源提供独立的连接池,保证了资源的隔离和高效使用。 3. **AtomikosDataSource与分布式事务** Atomikos是著名的JTA(Java Transaction API)实现之一,提供了分布式事务管理...

    缺失的Bank系统

    例如,银行交易通常涉及到用户的账户信息,使用ThreadLocal可以保证每个线程在处理用户请求时都有自己的账户对象副本,避免了多线程环境下的数据竞争问题,提高了事务处理的正确性和效率。 1. **理解ThreadLocal**...

    2024最新阿里、京东、蚂蚁等大厂面试题

    - **失效场景**:在非事务方法中调用事务方法、使用异步方法等情况下,`@Transactional`可能不起作用。 #### Dubbo框架 - **服务注册与发现**:基于Zookeeper等注册中心实现服务发现。 - **负载均衡**:支持多种...

    slf4j中的MDC

    - 虽然MDC提供了便利,但在高并发场景下,频繁的MDC操作可能带来一定的性能开销,因此需要权衡其使用。 7. **最佳实践**: - 只在必要时才使用MDC,避免无谓的性能消耗。 - 使用有意义的键来存储信息,以便在...

    DAO多线程的技巧.rar_dao

    - **日志跟踪**:通过日志记录DAO操作的耗时,帮助定位性能瓶颈。 - **JMX监控**:利用Java Management Extensions(JMX)监控DAO的运行状态,例如连接池的使用情况、SQL执行性能等。 综上所述,DAO在多线程环境...

    Java高手笔记-工程师必须知道的事

    CopyOnWriteArrayList可能会出现性能问题,解决方法是读多写少的场景下使用CopyOnWriteArrayList,写多的场景下使用ArrayList。 数据库事务 数据库事务中可能出现两种错误写法导致Spring声明式事务未生效的坑。...

Global site tag (gtag.js) - Google Analytics