首页 新闻 搜索 专区 学院

请问如何防止api被同时调用?

0
[已解决问题] 解决于 2018-05-29 16:36

假如在api被调用时,

我需要给数据库中的A表添加数据

在添加之前,我会先从A表检测有没有这条数据

当api同时被调用的时候

就会存到数据库中两条数据

想了一上午没想到合适的解决方案

请问有大佬能帮帮小弟么~

给个思路啥的。。。

临冰听雪丶的主页 临冰听雪丶 | 初学一级 | 园豆:4
提问于:2018-05-29 12:31

谢谢各位,之前有想过类似乐观锁区解决问题,但是乐观锁搜到的文章都是用来并发修改数据,而不是并发添加数据。然后我忽然想到了楼下大佬说的try,然后就突发奇想,把本来不应该重复的数据变为联合主键,然后当第一次出错的时候,方法重新调用。这样第二次就会检索到先到的数据,就会返回正常数据了。虽然不知道这样好不好,但总归解决了我的问题。再次谢谢各位大佬~

临冰听雪丶 2年前
< >
分享
最佳答案
0

最简单的方式    你用try   catch  进行事务操作   把查询数据和添加作为一个事务

这样只要一个没执行成功就会回滚

奖励园豆:5
河畔 | 小虾三级 |园豆:723 | 2018-05-29 13:28

我有try,也有事物。前提是,插入是不会失败的。

假如服务器上在卖苹果,有一个人预约了一筐苹果,如果想要从服务器上拿到这框苹果,就需要一个标识码。那么,这个时候,同时有两个人拿着这个标识码。

那么,服务器需要先看这个标识码有没有用过,如果没有用过,存记录,把苹果给你

可是服务器是并行的

也就是说,这个本来唯一的标识码会出现在数据库里两条,

服务器会给两个人每人一框苹果

临冰听雪丶 | 园豆:4 (初学一级) | 2018-05-29 14:31
其他回答(5)
0

API 你是没法防的。

最终的问题其实就是,数据库的并发。

你搜索下 “数据库的并发”

爱编程的大叔 | 园豆:30698 (高人七级) | 2018-05-29 12:58

恩恩,这个我再研究下。。。

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2018-05-29 14:31
0

 所以你的问题是:数据库怎么做"更新或插入"的原子性操作.

吴瑞祥 | 园豆:28841 (高人七级) | 2018-05-29 13:24

呃。。可以说的再详细些么。。。

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2018-05-29 14:25

@临冰听雪丶: 

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
支持(0) 反对(0) DanBrown | 园豆:1496 (小虾三级) | 2018-05-29 14:34
0

可以进行锁表操作

DanBrown | 园豆:1496 (小虾三级) | 2018-05-29 14:26

我试着用官方文档中lock的使用,发现并不行。。。

 1 class Account  
 2 {  
 3     decimal balance;  
 4     private Object thisLock = new Object();  
 5 
 6     public void Withdraw(decimal amount)  
 7     {  
 8         lock (thisLock)  
 9         {  
10             if (amount > balance)  
11             {  
12                 throw new Exception("Insufficient funds");  
13             }  
14             balance -= amount;  
15         }  
16     }  
17 }  

 

支持(0) 反对(0) 临冰听雪丶 | 园豆:4 (初学一级) | 2018-05-29 14:33

@临冰听雪丶: http://www.cnblogs.com/dolphin0520/p/3923167.html

支持(0) 反对(0) DanBrown | 园豆:1496 (小虾三级) | 2018-05-29 14:49
0

加事物注解

H2SO3 | 园豆:185 (初学一级) | 2018-05-29 15:14
0

这是个数据库领域的问题,和你的API没有半点关系。

百度:数据库 事务 乐观锁 悲观锁

西漠以西 | 园豆:1670 (小虾三级) | 2018-05-29 15:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册