`
cfan_haifeng
  • 浏览: 122088 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

数据库-丢失更新测试

阅读更多

 1.前言     

 

      “丢失更新”是一个很经典的问题。具体什么是“丢失更新”大家百度一下就知道了。

 

      预测我们的程序可能会出现 “丢失更新”问题。据我所知解决方法有两种(在隔离等级不为“可串行”的情况下):悲观锁、乐观锁。但同事认为update tablename set 字段1=字段1+1;这种类似的sql可以阻止“丢失更新”问题。我认为绝对不行(从隔离事物等级推断而出)。讨论无果,测试说话。

 

      经测试我的结论是正确的,呵呵。运行TestUpdateLost即可查看效果。

      此时数据的隔离等级,经SELECT @@tx_isolation;或者SELECT @@global.tx_isolation;查询都是REPEATABLE-READ

 

 

 

2.实验1

 

   目的:证明uppdate tablename set 字段1=字段1+1;这种类似的sql无法避免“丢失更新”。

   思路:启动N个多线程调用如下sql语句

 

 

update  ACCOUNT set VERSION = VERSION+1 where ACC_ID = 1 

 

   如果最终VERSION中的值与线程个数N不相同,则任务无法避免。

 

   代码实现说明:这事情本和语言,框架无关,但我们总需要用具体代码实现一下。我用了java、ibatis。

 

2.1 主要代码

 

2.1.1 主要java代码

 

   TestUpdateLost片段1:

 

//经测试size=!VERSION(实际情况是VERSION=6096,size=10000),故而:update tablename set a=a+1;是不能阻止“丢失更新”的。
		int size=10000;
		for (int i = 1; i <=size; i++) {
			TestUpdateLost t = new TestUpdateLost();
			new Thread(t).start();
		}// end of for
 

   TestUpdateLost片段2:

 

public void run() {
		try {
			Thread.sleep((int) (Math.random() * 1000));
			SimpleExample.updateVersionForUpdateLost(id);//执行sql语句
			System.out.println("-----------------"
					+ Thread.currentThread().getName()
					+ "-----------------------------------------" + count++);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
  

 

2.2 实验结果

 

     实验结果是数据库中VERSION=6096,此时线程个数为1w。故而:update tablename set a=a+1;这种类似的sql是不能阻止“丢失更新”的。



2.实验2-乐观锁的一种实现

   目的:提供一种通过版本号递增的方式实现乐观锁

   思路:启动N个多线程调用如下sql语句

 

 

update ACCOUNT set VERSION = VERSION+1 where ACC_ID = #id# AND VERSION=#version#
 

   并通过如下java代码乱判断是否即将出现“丢失更新”:

 

 

/**
	 * 更新版本,如果版本不一致则抛出乐观锁异常
	 * 
	 * @param id
	 * @throws SQLException
	 * @throws SQLException
	 */
	public static void updateVersionForOptimisticLock(int id,int version)
			throws OptimisticLockException, SQLException {
		Map<String, Integer> map=new HashMap<String, Integer>();
		map.put("id", id);
		map.put("version", version);
		final int count = sqlMapper
				.update("updateVersionForOptimisticLock", map);
		if (count <= 0) {
			// throw new SQLException("乐观锁异常");
			throw new OptimisticLockException("乐观锁异常");//这里把javaee.jar包导入了
		}

	}

 

  下载代码后,初始化sql,运行TestOptimisticLock即可看到效果。

分享到:
评论
5 楼 dongxz 2014-12-16  
我下载你的程序,测试结果为: 实验结果是数据库中VERSION=10000,此时线程个数为1w。
mysql version: 5.6.19; REPEATABLE-READ

4 楼 cfan_haifeng 2014-12-16  
changxxg 写道
先select再update能不丢失嘛。。。

直接update的呀
3 楼 shantouyyt 2014-08-11  
update 不是会加锁吗。。。应该不会出现吧。。
2 楼 shantouyyt 2014-08-11  
我用c# 测试了下。。。好像不会。。。
1 楼 changxxg 2013-08-10  
先select再update能不丢失嘛。。。

相关推荐

    达梦数据库-备份与还原-国产数据库-DM8备份与还原.pdf

    检查点操作有助于提高数据库的整体性能,并且减少了发生故障时数据丢失的风险。 **1.2.5 备份集** 备份集是指一组相关的备份文件集合,它包含了数据库的一个或多个表空间的数据文件以及相关的归档日志。备份集通常...

    ssms备份数据库-龙谷情.docx

    标题中的“ssms备份数据库-龙谷情.docx”指的是...在实际生产环境中,数据安全至关重要,因此在进行备份和还原之前,最好进行充分的规划和测试,以防止数据丢失或损坏。同时,定期备份数据库是最佳实践,以备不时之需。

    数据库--图书管理系统

    10. **测试与维护**:系统开发完成后,需进行单元测试、集成测试和性能测试,确保所有功能正常。后期还需要定期维护和更新,以适应业务变化和技术发展。 通过学习和实践这些知识点,开发者能够构建出一个功能完善、...

    SQL-数据库---图书管理系统.docx

    - **传统方式的问题**:传统的图书管理通常采用纸质文档记录,这种方式容易导致信息丢失且不易查询。 - **现代化需求**:随着信息技术的发展,建立一个高效的图书管理系统变得尤为重要,不仅可以提升工作效率,还能...

    如何恢复数据库-SQL Server 2014

    在SQL Server 2014环境中进行数据库恢复是一项关键技能,特别是在遇到数据丢失或损坏的情况下。本文将详细介绍如何使用SQL Server Management Studio (SSMS)来恢复数据库的过程,并提供必要的步骤和注意事项。 ####...

    如何恢复数据库-SQL Server 2008

    在SQL Server 2008中,数据丢失或损坏的情况时有发生,为了确保业务连续性和数据完整性,掌握正确的数据库恢复方法至关重要。本文将详细介绍如何使用SQL Server Management Studio (SSMS)来恢复一个名为“Data”的...

    21-08-04_FMDemo(004_通过迁移定义在MicrosoftSQLServer中自动生成相应的数据库-表-字段-约束规则).rar

    这个过程通常涉及到在开发过程中更新数据库结构,以适应应用程序的变更,确保数据的一致性和完整性。 描述 "nopCommerce_4.40.3 示例代码" 提到的是nopCommerce,这是一个流行的开源电子商务平台,基于.NET Core...

    数据库-图书管理系统

    同时,定期备份数据库,以防数据丢失。 在实现上,一般采用关系数据库管理系统(RDBMS),如MySQL、Oracle或SQL Server,因为它们提供强大的数据管理功能和事务处理能力。开发语言可以选择Java、Python或PHP,结合...

    数据库-教材订购系统.doc

    学校教材的采购与发放以往依赖于人工操作,导致效率低下,易出错且易丢失数据。为提高管理效率和减少资源浪费,开发教材订购系统成为必要,它可以快速响应教师的需求,确保教材的及时发放,并避免管理问题。 2. **...

    分布式关系型数据库恢复点目标测试方法.pdf

    RPO指标的测试方法通常包括基于场景的测试,其中以写入数据库的事务数量与数据库中记录数的差值表征数据丢失情况。 在实际工程实践中,为了测试和评价分布式关系型数据库的RPO,可以搭建测试环境,并利用测试工具如...

    IBM+Portal+Express+V6[1].1迁移到oralce数据库-2配置向导切图.pdf

    在IT领域,数据库迁移是一项复杂而关键的任务,尤其是在将IBM WebSphere Portal Express V6.1的数据从原有的数据库环境迁移到Oracle数据库时。这一过程不仅考验着IT专业人员的技术能力,也直接影响到系统的稳定性和...

    android 数据库表结构更新步骤

    - 在进行重大更新时,为了防止数据丢失,可以考虑提供备份和恢复策略,让用户在更新前备份数据,并在更新后提供恢复选项。 通过以上步骤,我们可以在Android应用中安全地更新数据库表结构,同时保持对旧版本程序的...

    数据库备份与恢复测试

    数据库备份与恢复测试是确保数据安全的关键步骤,它不仅能够验证备份策略的有效性,还能确保在灾难发生时能够快速恢复数据,减少数据丢失的风险,从而保障业务连续性。 ### Oracle数据库备份策略 #### RMAN...

    MYSQL官方最新测试数据库 test_db.zip

    6. **备份与恢复**:定期备份数据库以防止数据丢失,可以通过mysqldump工具进行逻辑备份,或利用InnoDB引擎的物理备份。 7. **权限管理**:MySQL的GRANT和REVOKE命令用于管理用户访问权限,确保数据安全。 8. **...

    数据库,shell,测试知识

    在IT领域,数据库管理、Shell脚本编程以及测试知识是至关重要的技能,这些技术广泛应用于系统维护、自动化任务执行和软件质量保证。以下是对这些关键知识点的详细解释: ### 数据库 - Oracle Oracle数据库是全球最...

    数据库-oracle12C新特性——之RMAN恢复表--嘉为科技[定义].pdf

    因此,我们需要创建一个新的表空间和用户,然后在这个新环境中进行测试。例如,创建一个名为DAVE的表,插入一些数据,并进行备份。 接下来,通过RMAN的`BACKUP AS COMPRESSED BACKUPSET DATABASE FORMAT`命令,我们...

    oracle数据库备份与恢复测试

    Oracle数据库备份是指为了防止数据丢失或损坏而进行的数据复制过程。备份通常分为全备(Full Backup)、增量备(Incremental Backup)等类型。恢复则是在数据丢失或损坏后,将备份数据还原到数据库的过程。 ### ...

    数据库实习报告(附数据库)---运动会管理系统

    总的来说,“运动会管理系统”数据库实习项目是一个全面学习数据库管理和系统开发的平台,涵盖了数据库设计、实施、编程接口、安全性、测试等多个方面,是理论与实践相结合的典范。通过这个项目,学生能够提升自身的...

Global site tag (gtag.js) - Google Analytics