`
by5739
  • 浏览: 3107 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

如何能在多个web服务器1个DB的情况下保证数据唯一?

 
阅读更多
公司里做的项目, 打算用多个web服务器, 共同连一个DB, 在某个基础表里的数据需要逻辑唯一, 既某对象(attr1="a", attr2="b")在数据库里只能存在一条记录, 由于这个基础表在用户使用中是用户自定义的, 因此有可能a,b2个用户通过web服务器a和web服务器b同时提交对象(attr1="a", attr2="b")...那么在这种情况下如何使DB里面最终只有一条记录?

公司的做法是:
public synchronized A save(A a){
    //查找数据库看有没有a
    if(没有记录){
        //锁表

        //插入记录
    }else{
        //返回数据库记录
    } 

}


但我觉得这样还是有问题啊, 因为在查数据库完了之后, 有可能另一台服务器正在保存了, 不过他们解释如果另一台服务器如果正在保存, 这边这台锁表不会成功的, 请问一下, 大家遇到这种情况是怎么处理的?

=================================
也许是我没说清楚, 后面有个同学说得对, 说白了就是多服务器下并发插入的问题, 如何能做到并发插入时保证数据唯一
下面是大家的一些方案(排名不分先后 ), 看看还有没有其他的方案:
1. 把save交给一台机器处理,然后暴露API给其他机器使用
2. 乐观锁(这个我觉得似乎不能解决并发插入问题啊)
3. 联合主键
4. 唯一索引
5. 直接往数据库里面插数据,加个时间字段,精确到毫秒级就差不多了,取最新的那个时间字段的行
6. 做一个数据库操作锁,方法调用前都要取锁,取到锁的才用执行,否则等待,这个锁可以放在缓存服务器中,集群中的所有节点连上这台缓存服务器

===============================
加说一下: 这个表是有pk的..比如表结构是:A(id pk auto_increment, attr1, attr2, attr3....)
id是数据库自己递增的, 业务要求是:attr1, attr2....任意2条数据不能重复, - -!这样是不是用唯一性索引就能解决了?
分享到:
评论
29 楼 kunee 2009-08-10  
乐观锁当然可以解决
28 楼 rain2005 2009-08-10  
by5739 写道
rain2005 写道
by5739 写道
rain2005 写道
可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行

建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题


所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么?


不太明白啊。。。比如顺序是这样的:
a服务器检查DB发现没有数据
b服务器检查DB发现没有数据
b服务器插入版本为1,id=1的数据
a服务器插入版本为1,id=2的数据

id是db自动生成,这样好像不能控制数据唯一吧?

如何发现没有数据呢?所以才说要加版本行啊,不是版本列,在初始数据库数据是就插入这个版本行,插入数据时修改版本行数据,如果插入A或者B后版本行变化回滚就可以了。
27 楼 ipconfiger 2009-08-10  
如果不想锁表,且又必须保证两边的提交都不会出错,那么可以采用以下异步的方式来实现;
假设有对象
A{
att1,
att2
}
那么,针对这个对象建立两个表,一个是主数据表,保存状态,另外一个是脏数据表,用于提交状态修改的内容,两个表列基本一致,脏数据表多一个时间戳字段。所有的提交都insert到脏数据表,这样子不用锁表,但是又保证了每次提交都快速得到响应,然后在之后的任意一次读取属性的时候都尝试合并脏数据。
假设T1,T2,T3都在同时提交,
T1提交{'aa','bb'},T2提交{'11','22'},T3提交{'12','fr'}虽然说是同时提交,但是总有先后顺序,假设数据库中脏表此时如下
T1{'aa','bb'}2009-8-10 10:04:33 123
T3{'12','fr'}2009-8-10 10:04:33 125
T2{'11','22'}2009-8-10 10:04:33 127
每次入库都相差2ms,然后T2开始读取属性了,那么此时就开始尝试合并,其实合并很简单,就是取最后提交的那一条,这里是T2,那么根据T2在脏表中的数据update主表的值后将主表记录返回,同时删除脏表中的数据,之后T1,T3再来读取的话,当发现脏表无数据就直接返回主表的数据。

由此能够在不锁表的情况下实现高效率的并发访问。
26 楼 by5739 2009-08-10  
dmewy 写道
PK是干嘛的?

如果pk是DB自动生成的...估计也不行吧?
25 楼 anky_end 2009-08-10  
dmewy 写道
PK是干嘛的?

唯一性约束比较好吧,不一定用pk,能不用联合主键尽量不用吧,特别是大表
24 楼 nychen2000 2009-08-10  
利用数据库的锁机制解决,不同的数据库有所不同。
23 楼 dmewy 2009-08-10  
PK是干嘛的?
22 楼 popufig 2009-08-09  
N多人提版本,也不看人家说的是并发插入问题,版本只解决更新问题

做成复合主键比较实在简单
21 楼 vvggsky 2009-08-09  
jxsgy 写道
attr1和attr2做成主键,这样让数据库帮你检查。

20 楼 chandler 2009-08-09  
  用最高级别的序列化读?
  脏读,不可重复读,幻读?到底是哪个问题呢?
19 楼 kenvin9 2009-08-09  
修改的时候where里面带上修改前的值,如:

update table set attr1='a2',attr2='b2' where attr1='a1' and attr2='b2'
18 楼 9981661 2009-08-09  
悲观锁 or  乐观锁, 悲观锁用在必发比较少的情况, 可以不用修改现有的数据库,
乐观锁 用于 并发相对较多的情况, 需要加一个version 字段
17 楼 zlowly 2009-08-09  
感觉这就和以前C/S一样。
直接用数据库建立唯一性索引就可以解决,应用只需要处理好异常就可以了。期望Web应用来实现的话,太麻烦而且不一定可靠。
16 楼 case0079 2009-08-09  
并发操作概率不大的话用乐观锁就可以了。
15 楼 linzy410 2009-08-09  
做一个数据库操作锁,方法调用前都要取锁,取到锁的才用执行,否则等待,这个锁可以放在缓存服务器中,集群中的所有节点连上这台缓存服务器
14 楼 坏孩子 2009-08-09  
by5739 写道
rain2005 写道
by5739 写道
rain2005 写道
可以在数据库里面建一个版本行。。。
如果提交a或者b就更新版本行

建版本好像不能解决问题啊,不管有没版本,都要先查询数据库有没有记录才能决定是插入还是不插入(或者更新),但是这个2个动作之间要是被人抢先插入,就会出问题


所以说才加个版本行啊,提交是看版本有没有变化撒,如果版本行版本发生变化就会滚事务,不是很easy的事么?


不太明白啊。。。比如顺序是这样的:
a服务器检查DB发现没有数据
b服务器检查DB发现没有数据
b服务器插入版本为1,id=1的数据
a服务器插入版本为1,id=2的数据

id是db自动生成,这样好像不能控制数据唯一吧?


直接往数据库里面插数据,加个时间字段,精确到毫秒级就差不多了,取最新的那个时间字段的行
13 楼 whaosoft 2009-08-09  
到是锁了 不过就是慢啊
12 楼 showtime520 2009-08-09  
交给数据库。。。设计好数据库的数据规范就行
11 楼 beeke 2009-08-09  
乐观锁,版本号。参考hibernate实现
10 楼 ywlqi 2009-08-09  
唯一索引。。。。

相关推荐

    架设web服务器 test

    - **负载均衡器**:用于分发流量到多个Web服务器,提高响应速度和系统稳定性。 - **高可用性集群**:确保在某个组件出现故障时,系统仍能正常运行,提升整体可靠性。 #### 三、Web服务器配置 ##### 3.1 Web服务器...

    web服务器性能测试报告

    - **测试目的**:通过对Web服务器进行性能测试,旨在评估系统在特定负载下的响应时间与稳定性,特别是针对大量用户同时在线的情况。 - **具体目标**: - 常用操作(如进入列表、编辑、查看等)的响应时间需控制在7...

    从考勤机自动上传数据到服务器C#

    综上所述,实现“从考勤机自动上传数据到服务器C#”这一功能,需要掌握Web Service开发、C#服务编程、接口设计、数据库操作、数据安全、异常处理等多个方面的技能。通过合理的架构设计和代码组织,可以构建出一个...

    最新Web服务器与数据库服务器的连接.ppt

    【Web服务器与数据库服务器的连接】是现代互联网应用的核心组成部分,允许Web应用程序处理和存储用户数据。本文档详细介绍了Web服务器如何与数据库服务器交互,以及几种常见的数据库系统和连接方式。 首先,Web...

    解决Mysql数据库在web开发中乱码问题

    在Web开发中,数据流经多个环节:客户端输入、服务器端处理、数据库存储、服务器端读取、最后呈现给客户端。如果在任一环节的字符集设置不当,都可能引起乱码。 ### 二、解决乱码的关键步骤 #### 1. 数据库层面的...

    OLEDB驱动程序大全 PostgreSQL-OleDB-Provider

    OLEDB(Object Linking and Embedding, Database)驱动程序是一种数据访问接口,它允许应用程序以统一的方式访问多种数据源,包括数据库、文件系统、Web服务等。在本话题中,我们将深入探讨“OLEDB驱动程序大全”中...

    python配置多数据源.docx

    通过以上步骤,我们可以成功地在Django项目中配置多个数据源。这种配置方式不仅可以提高系统的性能和扩展性,还可以方便地进行数据隔离和管理。对于初学者来说,掌握这一技能对于开发复杂的Web应用具有重要意义。在...

    Microsoft oLE DB provider for DB2

    OLE DB是Microsoft的一种数据访问技术,它为应用程序提供了一种标准的方式来访问多种数据源,包括数据库、文件、Web数据等。 在深入理解"Microsoft OLE DB Provider for DB2"之前,我们首先需要了解OLE DB的基本...

    数据提供程序 ole db

    数据提供程序OLE DB是微软开发的一种数据访问接口,它允许应用程序通过统一的方式访问各种不同的数据源,包括数据库、文件系统、Web数据等。OLE DB基于组件对象模型(COM)架构,使得开发人员能够构建跨平台的数据...

    IndexedDB:浏览器里内置的数据库

    IndexedDB是Web应用程序在浏览器中存储大量数据的一种强大工具,它是HTML5标准的一部分,为离线存储和...学习和掌握IndexedDB能让你在开发高性能的Web应用时游刃有余,特别是在需要离线存储和高效数据管理的场景下。

    ASP.NET Web 数据访问 [中文]

    ### ASP.NET Web 数据访问 #### 重要知识点概览 1. **从数据库中获取数据**:介绍如何通过ASP.NET中的`SqlDataSource`控件连接到数据库,并从数据库中获取数据。 2. **数据源控件**:解释了数据源控件的概念及其在...

    一个超级简单小型的基于promise采用IndexedDB的健值存储

    - **离线可用**:数据存储在本地,即使在网络断开的情况下也能访问。 **4. idb-keyval的高级特性** - **批量操作**:通过`batch()`方法可以一次性设置多个键值对,提高性能。 - **观察变化**:使用`onchange`监听...

    Microsoft SQL Server 2012 Express LocalDB.zip

    在Visual Studio (VS) 2017中,如果你尝试打开一个依赖于数据库的.NET项目,可能会遇到错误提示,指出"web项目需要安装SQL Server 2012 Express LocalDB"。这个提示意味着你的开发环境缺少SQL Server的一个轻量级...

    SpringBoot操作多数据源(JPA+JdbcTemplate)

    在Spring Boot应用中,我们经常遇到需要连接和操作多个数据库的情况。这个场景通常出现在大型系统中,例如,可能有一个数据库用于存储用户数据,另一个数据库用于处理业务数据。本篇文章将探讨如何在Spring Boot中...

    cpp-Metaweb图形存储库服务器

    总的来说,"cpp-Metaweb图形存储库服务器"是一个深度参与图形数据管理的项目,它涉及到了图形数据库的多个关键方面,包括数据模型、查询处理、并发控制和持久化存储。开发者在构建这样一个系统时,需要深入了解图形...

    各个web服务器安装文档,及连接池的配置

    在IT行业中,Web服务器是支撑网站运行的重要基础设施。它们负责处理HTTP请求,向客户端返回响应,使得用户能够访问网页内容。本压缩包包含了三个主流的Web服务器——Tomcat、WebLogic和WebSphere的安装文档以及关于...

    metadata.db

    在Calibre中,每个电子书的条目对应数据库中的一个记录,包含多个字段,用于保存各种元数据信息。 2. 元数据类型:除了基本的书籍信息,如标题、作者、出版社、ISBN号等,metadata.db还可能包含自定义元数据,比如...

    DB2开源开发文档

    - **通用性强**:Python是一种多用途语言,不仅适用于Web开发,还广泛应用于科学计算、数据分析等多个领域。 - **易用性**:Python语法简洁明了,学习曲线平缓,是新手入门编程的好选择。 - **数据访问**:Python...

    web.py官方文档

    文档还提到了一种情况,即对于多个同名的输入项,web.input()会将它们作为列表返回,这对于处理复选框等场景非常有用。文件内容还涉及到文件上传的处理,这是Web应用程序中常见的需求之一。 其次,文档内容中涉及到...

Global site tag (gtag.js) - Google Analytics