`
cfan_haifeng
  • 浏览: 120293 次
  • 性别: 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能不丢失嘛。。。

相关推荐

    数据库课程设计-图书馆管理信息系统.doc

    数据库课程设计报告 -------图书馆管理信息系统 目 录 一、系统开发平台 1 二、数据库规划 1 2.1 任务陈述 1 2.2 任务目标 1 三、系统定义 2 3.1 系统边界 2 3.2 用户视图 3 四、需求分析 3 4.1 用户需求说明 3 ...

    数据库工具连接hive的驱动包

    使用dbeaver或者其他数据库管理工具连接hive时使用到的驱动

    D-数据库卸载工具.rar

    1、本工具用于完整卸载MSSQL,使用前务必先备份好数据,因使用该工具而导致的网站或系统数据丢失与本工具无关! 2、推荐使用组件卸载方式,也可以使用Windows的控制面板正常卸载,如果正常卸载不干净,可以用本工具...

    数据库资料

    软件测试阶段:…… 安装部署:…… 设计数据库的步骤4-1 收集信息: 与该系统有关人员进行交流、坐谈,充分理解数据库需要完成的任务 设计数据库的步骤4-2 标识对象(实体-Entity) 标识数据库要管理的关键对象或...

    数据库第三方操作工具DBTOOLS

    当表结构发生变化时,数据不会丢失。 4。程序执行前后,表中的数据发生了哪些变化 5。根据EXCEL中的表结构,生成建表语句SQL文。 6。多用户使用该软件时,可以随时记录某个用户对数据库的操作。 7。可以为进行压力...

    数据库大作业-Java基于SSM实现的失物招领系统设计与实现毕业源代码+文档说明+sql文件

    寻物启事: 寻物id,标题,丢失物品,物品照片,丢失时间,丢失地点,物品描述,报酬,联系电话,学生,发布时间 失物招领: 招领id,标题,物品名称,捡得时间,拾得地点,描述说明,联系人,联系电话,发布时间 认领: 认领id,招领...

    查看oracle数据库是否归档和修改归档模式

    在ORACLE 数据库的开发环境和测试环境中,数据库的日志模式和自动归档模式一般都是不设置的,这样有利于系统应用的调整,也免的生成大量的归档日志文件将磁盘空间大量的消耗。但在系统上线,成为生产环境时,将其...

    数据库课程设计-图书馆管理信息系统(1).doc

    数据库课程设计报告 -——-—-—图书馆管理信息系统 目 录 一、系统开发平台 1 二、数据库规划 1 2.1 任务陈述 1 2.2 任务目标 1 三、系统定义 2 3.1 系统边界 2 3.2 用户视图 3 四、需求分析 3 4.1 用户需求说明 3 ...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    01-安全优化-项目开发流程及数据库更新流程.avi 02-DBA参与项目数据库设计及培训开发人员高效设计MYSQL库语句.avi 03-老男孩核心思想-项目周期的制定思想.avi 04-linux进程占用cpu高的解决方案案例.avi 05-数据库...

    Oracle数据库管理员技术指南

    第1章 建立和配置数据库 1.1 数据库创建规划 1.1.1 规划以及提出正确的问题 1.1.2 怎样确定恰当的数据块尺寸 1.2 组织文件系统 1.2.1 怎样命名数据库文件 1.2.2 使用最佳灵活结构 1.2.3 怎样配置符合 OFA 的 ...

    在数据库设计中.doc

    数据库试运行的主要工作包括(C) 程序测试和性能测试 性能测试和应用测试 功能测试和性能测试 功能测试和应用测试 10. 在整个设计过程中,最困难、最耗费时间的阶段是(A) 需求分析阶段 概念设计阶段 逻辑设计...

    ASP实现SQL数据库的备份和恢复工具

    这是用ASP写的一款MSSQL数据库备份和恢复工具,即使您没有远程操作MSSQL数据库的权限也没有关系,只要你有FTP的管理权限,把数据库备份或恢复程序放到网站上,访问其地址同样可以实现备份和恢复功能。备份功能本人有...

    易语言程序免安装版下载

    易语言5.0测试版2相对于测试版1的更新内容: 1. 修改了很多由于符号冲突而导致无法完成静态编译的BUG 易语言5.0测试版1发布于2009/12/28,是易语言5.0静态编译版第一个公开测试版本 **********************...

    华南理工大学2020年数据库实验4(SQLserver编写)

    实验要求: 1.采用实验一的建库脚本和数据插入脚本创建... 分别设置不同的隔离级别, 让两个并发事务交错执行的程序或事务,能分别显示每种隔离级别下,是否出现丢失更新,脏读,读值不可复现以及幻象记录四种情况。

Global site tag (gtag.js) - Google Analytics