`
wangking717
  • 浏览: 262519 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

保证数据正确性,乐观锁的控制!

 
阅读更多

 

wangking 写道
为了保证数据的完整性以及正确性,我们总得挖空心思的找寻一些解决方案。保证数据的正确性,控制同步问题,有2中,一种乐观锁,一种悲观锁。这次项目中我采用的是乐观锁,就口水活,记下来!

 

一般用乐观锁进行同步控制的时候,都喜欢在表上建立一个版本监控的字段,姑且叫“version”吧。

 

如表User:

 

User     username      user_id       balance        version

               wangking           1            100                   1

 

 

比如balance字段引起的变化由多处控制,如充值的时候,交易的时候,都会对balance造成影响。所以我们要对user表进行乐观锁控制,以防止数据的不正确。

 

 

事例一(充值):

 

//充值卡
User user = get(1);
Card card = get(2);
int userFinalMoney = user.balance + card.money;
user.setBalance(userFinalMoney);
User user2 = get(1);
if(user.version == user2.version){
    updateByTrans(user,card); //version++,卡过期,账号充值
}else{
     //提示系统繁忙,请稍后再试!
}

 

事例二(交易):

 

//卖家发布任务的时候,[钱]和[发布点]已经扣除到【交易任务】上
//【交易任务】的状态修改
//买家  增加 [钱]和[发布点]
User user = get(1);
Task task = get(3);
int userFinalMoney = user.balance + task.money;
int userFinalPiontNum = user.pointNum + task.pointNum;
user.setBalance(userFinalMoney);
user.setPiontNum(userFinalPiontNum);
User user2 = get(1);
if(user.version == user2.version){  //当如果事例一(充值)处先执行了,那么version值++了,所以这里version值匹配不过来,就不会对数据造成影响!
	updateByTrans(user,task); //version++,update user,task
}else{
      //提示系统繁忙,请稍后再试!
}

 

是不是很简单吧,还不快来试试?

 

分享到:
评论
3 楼 521069108 2011-09-21  
在数据库中统一执行事务最好
2 楼 wangking717 2011-03-17  
shansun123 写道
其实不用两次查询吧
//充值卡
User user = get(1);
Card card = get(2);
int userFinalMoney = user.balance + card.money;
user.setBalance(userFinalMoney);
User user2 = get(1);
if(user.version == user2.version){
    updateByTrans(user,card); //version++,卡过期,账号充值
}else{
     //提示系统繁忙,请稍后再试!
}

update table_XX set XXXX where version=#version#就好了,这里把version=1传入

这个得看需求了。如果要version控制的是在一个transaction的话,那么即便update table_XX set XXXX where version=#version#影响的行数为0,但是transaction的另外的执行SQL语句同样成功执行,所以这个时候就会用到我说的那种方法,比较通用。。

当然如果只是单表控制的话,你的那种方法更优,而我那种方法更通用。
1 楼 shansun123 2011-03-15  
其实不用两次查询吧
//充值卡
User user = get(1);
Card card = get(2);
int userFinalMoney = user.balance + card.money;
user.setBalance(userFinalMoney);
User user2 = get(1);
if(user.version == user2.version){
    updateByTrans(user,card); //version++,卡过期,账号充值
}else{
     //提示系统繁忙,请稍后再试!
}

update table_XX set XXXX where version=#version#就好了,这里把version=1传入

相关推荐

    面试必备之乐观锁与悲观锁.pdf

    版本号机制是在数据表中增加一个版本号字段,每次更新数据前,都会检查数据的版本号是否发生变化,从而实现乐观锁的控制。CAS算法是一种无锁算法,它通过比较内存中的值与预期值是否相等来决定是否更新该值,如果...

    基于Django的乐观锁与悲观锁解决订单并发问题详解

    悲观锁适用于并发较低,但需要保证数据一致性的场景,因为它会增加数据库锁的竞争,可能导致性能下降。 相对而言,乐观锁是一种更为宽松的并发控制策略。它假设数据在大多数情况下不会发生冲突,只有在更新数据时才...

    省级业务运营支撑系统业务技术规范-数据一致性管理机制分册

    3. 数据版本控制:采用乐观锁或悲观锁策略,防止并发操作导致的数据冲突。 4. 数据校验:在数据写入前进行验证,确保数据符合业务规则,防止非法数据进入系统。 5. 数据同步:通过主从复制、双活架构等方式,确保多...

    并发的事务中保证数据表数据完整性的一些思考.rar

    综上所述,保证并发事务中的数据完整性是一门涉及多方面知识的复杂科学,包括事务管理、并发控制策略、锁机制、MVCC以及分布式事务处理。理解和掌握这些概念对于构建高可用、高性能的数据库系统至关重要。

    微服务架构下的数据一致性:概念及相关模式.zip

    6. **版本控制与乐观锁**:通过添加版本号或时间戳,可以实现乐观锁,使得多个并发操作在冲突时能检测到并适当处理。 在Java开发中,Spring Cloud Data Flow和Axon Framework等框架提供了对Saga模式和事件驱动架构...

    Web应用中并发控制的实现.pdf

    在Web应用中,并发控制是确保数据一致性与正确性的关键...总的来说,Web应用中的并发控制是复杂且重要的,开发者需要深入理解各种并发控制机制,结合具体业务场景选择合适的方法,以保证数据的正确性和系统的高效性。

    深思写锁,2018.10最新数据

    因此,合理的锁管理策略,如使用行级锁而不是表级锁,或者采用乐观锁(在更新前检查数据是否被其他线程修改)来减少锁的使用,都是提高系统并发性能的重要手段。 对于"广联达"的用户来说,理解写锁的概念以及如何在...

    552写锁及 授权

    在多用户环境中,写锁能确保数据的正确性,防止多个用户同时修改同一条记录,造成数据冲突。此外,它也是乐观锁和悲观锁策略中的重要组成部分。乐观锁假设很少发生并发冲突,只在提交时检查冲突;而悲观锁则在开始...

    实时数据的一致性保障技术.pptx

    **基于版本控制的并发控制**是一种无需加锁的方式来保证数据一致性: 1. **多版本数据存储**:每个数据项都有多个版本,每个版本附带一个时间戳。事务在读取数据时,获取相应的时间戳版本,从而避免读写冲突。 2. *...

    java中的各种锁详细介绍.docx

    悲观锁适合写操作频繁的场景,可以确保写操作时数据的正确性。 两种锁各有优缺点。乐观锁在读操作多的场景下表现出良好的性能,因为它避免了加锁带来的开销,但在高并发的写操作下,可能会因为不断的重试而导致性能...

    数据库中锁机制的学习

    总的来说,数据库中的锁机制是保证数据安全和事务正确执行的关键。通过理解不同类型的锁和它们在不同隔离级别下的行为,开发者可以更好地设计和优化并发应用程序,以达到高效且一致的数据库操作。在实际开发中,应...

    多核与并发数据结构-用于列车售票的可线性化并发数据结构.zip

    6. **乐观锁与悲观锁**:乐观锁假设冲突较少,只有在提交操作时才检查数据是否被其他线程修改;悲观锁则在操作开始前就获取锁,防止其他线程改变数据。在高并发系统中,根据实际情况选择合适的锁策略。 7. **队列的...

    元数据管理架构设计

    4. **并发性处理**:采用乐观锁机制来处理高并发下的数据一致性问题,确保交易的正确性。 综上所述,构建一个高效的元数据管理架构对于大数据项目的成功至关重要。通过合理利用 Elasticsearch 的功能特性,可以有效...

    华中科技大学数据库并发控制PPT学习教案.pptx

    较高的隔离级别虽然保证数据正确性,但可能限制并发性能。应用需要根据其需求选择合适的隔离级别,以平衡数据一致性和系统性能。 综上所述,数据库并发控制是数据库管理的关键组成部分,它通过一系列技术手段确保了...

    分布式数据库 第八章 分布式并发控制

    * 乐观并发控制:使用乐观并发控制来避免操作冲突和数据不一致性,乐观并发控制是指在事务执行过程中,不对数据进行加锁,而是在事务提交时检查事务执行的正确性。 分布式数据库系统中的分布式并发控制是指在分布式...

    mysql中的事务、锁讲解和操作

    MySQL中的事务和锁是数据库管理中的关键概念,对于保证数据的一致性和完整性至关重要。事务是数据库操作的基本单元,它确保一组操作要么全部成功,要么全部失败,从而避免数据的不一致状态。在MySQL中,事务支持ACID...

    oracle锁机制

    总之,Oracle的锁机制是其并发控制的核心,通过不同类型的锁和封锁策略,保证了数据的正确性和事务的并发执行,从而维护数据库的一致性。理解并合理使用这些机制,对于优化数据库性能和避免并发问题至关重要。

    SAP ABAP应用程序中"锁"的介绍

    在SAP ABAP应用程序中,锁机制是保证数据一致性、防止并发访问时产生数据不一致性的关键工具。本文将深入探讨SAP锁的概念、重要系统参数、锁管理以及锁的应用。 首先,SAP锁概念的核心在于防止多个进程同时修改相同...

Global site tag (gtag.js) - Google Analytics