0 0

关于数据查询前插入数据问题15

如果有个业务场景:
比如有张库存表 inv,有个字段物料 material,有个字段数量 qty,当然还有ID。
每次入库,先查找库存是否有这个物料,如果有的话,则数量需要加上去,如果不存在,需要生成一条这样的记录,包含物料以及数量。

我只是打个比方,这个在一般系统里面都会初始化的,没个物料都有一条默认的数量为0的记录,我就不说了。

如果不能初始化,我需要动态的添加,则情况如下,比如 M1物料入库10公斤
如果存在 就数量加 不存在就新加一行
if(inv exists 'M1') {
  update inv set qty=qty+10 where material='M1'
}else{
  insert inv (material,qty) values ('M1',10)
}
如果并发的话,比如 人员A、B同时做入库单
A 执行 查看 exists 时间为t1
B 执行 查看 exists 时间为t2
A 执行 查看 insert 时间为t3
B 执行 查看 insert 时间为t4
t1<t2<t3<t4,如果刚好遇到这样的情况,大家查的时候都不存在,每个人都入了,怎么办,处理这种情况,这样导致物料M1存在2条数据,当然 可以对物料进行唯一索引,但是这样B插入就会报错,请问大家有什么办法让这种情况不发生,不能唯一索引,也不能lock table,谢谢
2013年5月21日 10:29

2个答案 按时间排序 按投票排序

0 0

采纳的答案

1:必须采用事务,否则会出现丢失更新的情况。
2:在并发情况下,如何设计这个事务。
  2.1:数据库有默认的锁机制,就像我们执行一条简单的“update table set .... where ...”,数据库会瞬间加排他锁,其它所有的操作等待。
  2.2:数据库加锁时间取决于数据库的设计以及程序处理事务的方法,尽可能的减少事务执行时间。

3:解决办法
  3.1:开始事务,读加排他锁
  3.2:判断并执行插入或更新操作
  3.3:提交事务

2013年5月21日 17:57
0 0

if(inv exists 'M1') {
  update inv set qty=qty+10 where material='M1'
}else{
  insert inv (material,qty) values ('M1',10)
}

把这个放到一个事务里面就好了,t1,t3,执行完后才会执行t2,t4,

2013年5月21日 10:55

相关推荐

    labview 数据库的表格创建,数据更新,数据删除,数据查询,数据插入,数据显示。

    在LabVIEW中与数据库交互是常见的需求,本教程将详细介绍如何使用LabVIEW进行数据库的表格创建、数据更新、数据删除、数据查询以及数据插入,并展示如何显示这些数据。 首先,我们需要理解LabVIEW中的数据库接口。...

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    在处理大量数据插入SQL Server数据库的过程中,可能会遇到插入速度慢或者数据丢失的问题。这种情况通常出现在需要批量插入数千甚至上万条记录的场景中。本文将详细介绍如何解决SQL Server在大数据量插入时出现的速度...

    07-数据表中数据插入方式(4种)

    本文介绍了四种常见的数据插入方式,它们分别是:向表中所有字段插入数据、向表中某字段插入数据、同时插入多条记录以及将查询结果插入至数据表。以下是这四种数据插入方式的详细介绍: 1. 向表中所有字段插入数据 ...

    sqlite避免重复插入数据

    根据提供的文件信息,本文将详细解析如何在SQLite数据库中避免重复数据插入的问题,并结合实际应用场景进行探讨。 ### SQLite 数据库避免重复数据插入 在数据库管理中,确保数据的唯一性是非常重要的,特别是在...

    kettle对数据分表插入

    5. **数据写入**:每个子表对应一个"表输出"步骤,负责将数据插入到对应的Oracle分区表。 在实际操作中,我们需要确保Java脚本能够正确地计算哈希并进行分区决策,同时考虑到负载均衡和数据分布的均匀性。此外,还...

    SQL Server中关于临时表概念及创建和插入数据等问题

    因此,在插入数据前,需要确保连接没有关闭。 此外,SQL Server 还支持会话临时表和事务临时表。会话临时表的数据只在当前会话内有效,关闭当前会话或者进行新的连接之后,数据表中的内容就会被清除。事务临时表的...

    VB 利用INSERT语句向数据表中插入数据

    在VB(Visual Basic)编程中,向数据表中插入数据是一项基本操作,通常涉及与数据库的交互。在本教程中,我们将深入探讨如何利用INSERT语句来实现这一目标。INSERT语句是SQL语言的一部分,用于在数据库表中创建新的...

    批量插入大量数据

    6. **并行插入**:如果数据库支持,可以考虑并行插入,即同时开启多个线程或进程进行数据插入。 7. **异步处理**:在某些应用环境中,可以采用异步插入,将数据先放入队列,后台服务负责批量处理,避免阻塞主线程。...

    spark或mr引擎插入的数据,hive表查询数据为0

    其中一种常见的问题是,在使用Spark或MR引擎对Hive表进行数据插入后,通过Hive查询这些数据时,结果却显示为0条记录。具体表现为用户反馈在使用Tez引擎查询时可以得到正确结果,但在使用Spark-SQL查询同一张表时却...

    往数据库插入数据,相同的不插入

    ### 往数据库插入数据,相同的不插入 在Java开发中,常常会遇到需要将一系列数据插入数据库的需求。但在实际操作过程中,为了避免重复数据的插入,我们需要实现一种机制来判断待插入的数据是否已存在于数据库中。这...

    C#.NET中如何批量插入大量数据到数据库中

    在C#.NET中批量插入大量数据到数据库是一个常见的任务,特别是在处理诸如从Excel文件导入数据等场景时。这里,我们将探讨如何使用C#.NET高效地完成这个任务,并提供一个简单的示例来说明整个过程。 首先,我们需要...

    java批量插入Oracle数据方法

    在IT领域,特别是数据库操作与Java编程中,批量插入数据是一项常见且重要的任务。通过优化这一过程,可以显著提升应用程序的性能,特别是在处理大量数据时。以下是对“java批量插入Oracle数据方法”的深入解析,包括...

    c#插入多条数据datagridview

    以下是一个简单的示例代码片段,展示了如何将DataTable中的数据插入到数据库: ```csharp // 假设已有DataTable myDataTable,且已填充了用户输入的数据 using (SqlConnection connection = new SqlConnection...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    在IT行业中,数据库操作是应用开发中的重要环节,特别是在大数据量的情况下,如何高效地进行数据插入成为了一个关键问题。MyBatis,作为一个优秀的Java持久层框架,提供了多种优化手段,其中包括多线程和批处理技术...

    详细讲解C#在向ACCESS中插入数据时判断数据是否已存在.pdf

    在尝试插入数据前,使用SELECT语句和COUNT函数来检查指定条件下的记录数。这里的关键点是构造一个SQL查询语句,其格式通常为: ```sql SELECT COUNT(*) FROM 表名 WHERE 判断条件; ``` 在构造查询语句时,需要特别...

    C#窗体测试数据查询、插入、更新、excel数据模板合成、导出等

    2. **数据插入**:插入新数据到数据库时,使用SQL的INSERT INTO语句,结合SqlCommand对象的ExecuteNonQuery方法执行。例如,`cmd.CommandText = "INSERT INTO TableName (Column1, Column2) VALUES (@Value1, @Value...

    mysql大批量数据插入

    MySQL 大批量数据插入优化方法 MySQL 大批量数据插入是指在短时间内将大量数据插入到 MySQL 数据库中,需要设计目标要求能支持平均每秒插入 1000 条数据以上。MySQL 提供了多种方法来实现大批量数据插入,包括使用...

    java快速插入千万级数据

    java快速插入千万级数据,亲测91秒插入1700万数据!!!

    ACCESS和SQL批量插入数据工具

    这款工具专为数据库管理员和开发人员设计,用于快速、高效地向ACCESS和SQL Server数据库中批量插入数据,尤其在进行负荷测试时,它能显著提高工作效率。 首先,我们来了解一下ACCESS。ACCESS是Microsoft Office套件...

Global site tag (gtag.js) - Google Analytics