最简单的方式 你用try catch 进行事务操作 把查询数据和添加作为一个事务
这样只要一个没执行成功就会回滚
我有try,也有事物。前提是,插入是不会失败的。
假如服务器上在卖苹果,有一个人预约了一筐苹果,如果想要从服务器上拿到这框苹果,就需要一个标识码。那么,这个时候,同时有两个人拿着这个标识码。
那么,服务器需要先看这个标识码有没有用过,如果没有用过,存记录,把苹果给你
可是服务器是并行的
也就是说,这个本来唯一的标识码会出现在数据库里两条,
服务器会给两个人每人一框苹果
API 你是没法防的。
最终的问题其实就是,数据库的并发。
你搜索下 “数据库的并发”
恩恩,这个我再研究下。。。
所以你的问题是:数据库怎么做"更新或插入"的原子性操作.
呃。。可以说的再详细些么。。。
@临冰听雪丶:
可以进行锁表操作
我试着用官方文档中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 }
@临冰听雪丶: http://www.cnblogs.com/dolphin0520/p/3923167.html
加事物注解
这是个数据库领域的问题,和你的API没有半点关系。
百度:数据库 事务 乐观锁 悲观锁
谢谢各位,之前有想过类似乐观锁区解决问题,但是乐观锁搜到的文章都是用来并发修改数据,而不是并发添加数据。然后我忽然想到了楼下大佬说的try,然后就突发奇想,把本来不应该重复的数据变为联合主键,然后当第一次出错的时候,方法重新调用。这样第二次就会检索到先到的数据,就会返回正常数据了。虽然不知道这样好不好,但总归解决了我的问题。再次谢谢各位大佬~
– 临冰听雪丶 6年前