`
laolinshi
  • 浏览: 41388 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

集群环境下防止并发的一种实现

阅读更多

 

近来研究定时器Quartz集群的实现原理时,发现了一种利用数据库锁的方式来实现集群环境下进行并发控制的方式。由于现在的系统多是部署在集群环境中,需要进行并发控制时,这是一种很好的实现方法,现将原理介绍如下:

 

首先,在数据库中建立一张拥有锁标识的表,建立表的SQL语句如下:

        CREATE TABLE TB_LOCKS

   (	LOCK_NAME VARCHAR2(40) NOT NULL, 
	PRIMARY KEY (LOCK_NAME)
   )

        表创建好之后,插入一些数据, 这些数据是根据数据库的业务逻辑操作抽象出的系统所拥有的表的类型,如"TRIGGER_ACCESS"就表示对任务触发器相关的信息进行修改删除操作时所需要获得的锁。每当要进行与某种业务相关的数据库操作时,先去这张表中查询操作相关的业务对象所需要的锁,如Quartz中需要修改触发气的状态,下次触发时间时,就需要获得"TRIGGER_ACCESS"所表示的锁。这时,执行查询这个表数据的SQL形如“select * from TB_LOCKS t where t.lock_name='TRIGGER_ACCESS' for update”,在select之后加了“for update”,就如JAVA语言中的为方法加上Symchriozed一样,起到了串形化访问修改所需数据的作用。当一个线程使用上述的SQL对表中的数据执行查询操作时,若查询结果中包含相关的行,数据库就会对这些行进行ROW LOCK。若此时又有另外一个线程使用相同的SQL对表的数据进行查询时,由于查询出的数据行已经被数据库锁住了,此时这个线程就只能等待,直到拥有这些行锁的线程完成了相关的业务操作,执行了commit动作后,数据库才会释放了相关行的锁,这个线程才能继续执行。通过这样的机制,在集群环境下,结合乐观锁的机制就可以防止一个线程对数据库数据的操作的结果被另外一个线程所覆盖,从而可以避免一些难以觉察的错误发生。当然,达到这种效果的前提是需要把Connection设置为手动提交,即autoCommit为false,下面是执行相关步骤的程序代码:

 

/**
     * Execute the given callback having optionally aquired the given lock.
     * This uses the non-managed transaction connection.
     * 
     * @param lockName The name of the lock to aquire, for example 
     * "TRIGGER_ACCESS".  If null, then no lock is aquired, but the
     * lockCallback is still executed in a non-managed transaction. 
     */    
protected Object executeInNonManagedTXLock(
            String lockName, 
            TransactionCallback txCallback) throws JobPersistenceException {
        boolean transOwner = false;
        Connection conn = null;
        try {
            if (lockName != null) {
                if (getLockHandler().requiresConnection()) {
                    conn = getNonManagedTXConnection();
                }
                //获得相关的锁,通过带有"for update"的select语句实现,如果这个锁被其他线程占用,执行这个操作的线程只能等待
                transOwner = getLockHandler().obtainLock(conn, lockName);
            }
            
            if (conn == null) {
                conn = getNonManagedTXConnection();
            }
            
            Object result = txCallback.execute(conn);//执行相关的业务逻辑操作,获得操作的结果
            commitConnection(conn);//提交操作结果,释放锁
            return result;
        } catch (JobPersistenceException e) {
            rollbackConnection(conn);//撤销操作结果,释放锁
            throw e;
        } catch (RuntimeException e) {
            rollbackConnection(conn);//撤销操作结果,释放锁
            throw new JobPersistenceException("Unexpected runtime exception: "
                    + e.getMessage(), e);
        } finally {
            try {
                releaseLock(conn, lockName, transOwner);
            } finally {
                cleanupConnection(conn);
            }
        }
    }
    
分享到:
评论

相关推荐

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,...

    spring实现集群同步锁

    可以使用JUnit和Mockito等测试框架,模拟多线程环境,检查锁是否能有效防止并发冲突。 通过以上步骤,我们成功地使用Spring和Redis实现了集群同步锁。这只是一个基础示例,实际项目中可能需要根据业务需求进行更...

    RabbitMQ集群环境生产实例部署

    在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,用于解耦应用程序的不同组件,提高系统的可扩展性和稳定性。RabbitMQ作为最广泛使用的开源消息代理和队列服务器,由Erlang编程语言构建,以其高可用...

    一种web服务器集群自适应动态负载均衡设计与实现.pdf

    总结来说,本文主要探讨了一种针对Nginx的优化策略,即在Web服务器集群中采用自适应动态负载均衡方法,通过监控后端服务器的实时状态,动态调整服务器权重,以实现更高效的负载分配。这种技术对于构建高可用、高性能...

    基于AKKA实现的搞并发设计

    AKKA是基于Scala语言和Erlang虚拟机的一种框架,用于构建并发、分布式和容错的应用程序。其核心理念和设计灵感源自于斯堪的纳维亚地区的萨米神话中的智慧与美丽的女神以及瑞典拉普兰地区一座风景秀丽的山峰。在AKKA...

    数据库集群搭建代码

    数据库集群是一种将多台计算机通过网络连接在一起,共同提供数据库服务的系统。这种架构能够提高数据的可用性、可扩展性和容错性,是大型企业和高并发应用的常见选择。在"数据库集群搭建代码"中,我们将探讨如何利用...

    集群式项目解决一个账号只能登录一次。

    这里我们探讨的是一种集群环境下的解决方案,它允许我们确保一个账号在同一时间只能在一个地方登录,即实现“单点登录”功能。这个方案主要基于Spring Boot和Redis技术栈来实施。 **Spring Boot** 是一种基于Java的...

    百万服务器并发代码实现

    `mul_port_client_epoll.c`的名称暗示了它可能涉及到Linux下的epoll机制,这是一种高效处理大量并发I/O事件的方式。epoll通过内核事件触发机制,减少了用户态和内核态的上下文切换,提高了性能。 4. **负载均衡**:...

    高并发场景防止库存数量超卖少卖

    实际应用中,可根据业务需求和技术栈选择合适方案,如结合Redis作为库存中间件,辅以分布式锁策略防止集群环境下超卖。此外,还可借助消息队列进行削峰填谷,确保系统稳定可靠。总的来说,解决商品超卖问题需要综合...

    服务器集群方案汇总图集

    在IT行业中,服务器集群是一种常见的高可用性和高性能计算解决方案,用于提供连续服务并处理大量并发请求。本篇文章将深入探讨标题“服务器集群方案汇总图集”所涵盖的关键知识点,包括服务器集群、集群方案、网络...

    Go-集群生命周期管理器CLM配置和更新多个Kubernetes集群

    CLM与集群注册表和配置来源紧密协作,注册表存储了集群的元数据和状态信息,而配置来源则提供了一种方式来定义和更新集群的期望配置。 CLM的实现通常会利用Go语言的特性,例如它的标准库提供了丰富的网络和并发支持...

    tomcat集群配置

    3. **安全性:** 集群环境下的安全策略需要考虑节点间的通信安全,防止恶意攻击。 4. **日志和监控:** 定期查看节点的日志,以及使用监控工具,以便及时发现并解决问题。 **六、源码与工具** 了解Tomcat集群的...

    tomcat集群部署.

    集群是一种通过多台服务器协同工作来提高服务可用性和性能的技术。在Tomcat集群中,多台Tomcat服务器共享相同的Web应用,能够互相备份,实现负载均衡和故障转移。 2. **集群的优点**: - **负载均衡**:通过将...

    red5集群cluster方案

    Red5集群方案是一种提高视频流服务可扩展性和稳定性的技术实践。通过构建集群,可以将负载分散到多个服务器上,确保即使在高并发情况下也能提供流畅的服务,避免单点故障,提升用户的学习体验。 1. **方案背景** ...

    nginx+lua+redis 集群 连接插件和脚本

    总的来说,这个资源包提供了在Nginx、Lua和Redis集群环境下实现高效、安全的Web服务连接的工具和脚本。通过合理配置和使用,可以构建出一套可扩展、可维护的分布式系统,满足高并发、大数据量的业务需求。

    Tomcat原理详解和各种集群的实现1

    Java是一种跨平台的、面向对象的编程语言,它的核心包括Java程序设计语言、Java Class文件格式、Java应用编程接口(API)和Java虚拟机(JVM)。Java运行环境由JVM和Java API组成,提供了一个统一的运行时环境,使得...

    基于Hadoop的分布式集群大数据动态存储系统设计.pdf

    为了解决这些问题,本文提出了一种基于Hadoop的分布式集群大数据动态存储系统的设计方案。 首先,需要明确Hadoop在大数据处理中的地位和作用。Hadoop是一个开源的分布式存储和计算平台,它提供了一套完整的生态系统...

    揭开J2EE集群的面纱

    失败转移是一种自动化的容错策略,当检测到某个服务器出现故障时,集群中的另一个服务器会立即接管其职责,这一过程通常是透明的,不会对用户造成影响。失败转移机制的实现可以依赖于多种策略,如数据库持久化、内存...

    集群式通信

    例如,WCF(Windows Communication Foundation)是微软提供的一种用于构建分布式应用程序的服务框架,它支持多种通信协议,如HTTP、TCP和MSMQ,使得在集群环境中实现高效的消息传递成为可能。 基于SOA(Service-...

    Linux的服务器集群

    在IT领域,服务器集群是一种高级的计算架构,它通过将多台独立的计算机系统连接在一起,形成一个高度可用和可扩展的单一系统。这种松散耦合的多处理器环境使得集群能够提供高可靠性和性能,同时减少了单点故障的风险...

Global site tag (gtag.js) - Google Analytics