在插入一条数据的同时更新另一条数据,现在这个操作用事务保持一致性,在不用存储过程的条件下,怎么实现若更新的数据不存在则不插入数据,若更新的数据存在才插入数据。
谢谢
自己在代码里面写逻辑咯
判断逻辑上提到C#代码层面
可是这样也不能保证我执行插入数据操作时更新的数据一定存在
@不会代码的椰子:
想的太多了。
先判断更新的数据是否存在,存在就插入,然后更新,不存在不做操作
有什么问题?
不用事务?又想保持一致性?
差不多是这个意思,我现在用事务保持一致性,但是测试的时候就发现如果更新的数据不存在也不会影响插入数据,但是逻辑上来说若更新的数据不存在则不应该插入数据,有什么办法在现在的事务基础上改动实现吗?
开启一个事务.更新表,然后再插入.就能保证
至于你说的先插入会造成表锁影响性能.
PS:从来不用存储过程.
Ado.net的api里有开启事务,提交事务的方法,把这个两操作放了一个事务里是可以用C#代码控制的,为什么不用事务?
1,开启事务,
2,更新
3,如果更新成功,插入
4,提交事务
这样有什么不妥吗
用事务还是好些,如果你写SQL语句,同时有多人操作,怎么保证数据一致性了,插入的时候报错了呢,或者插入成功,更新不成功怎么办,
用事务还是好些,如果你写SQL语句,同时有多人操作,怎么保证数据一致性了,插入的时候报错了呢,或者插入成功,更新不成功怎么办,
你是想用最终一致性解决这个问题么?
先说写入吧,这个不开启事务也能做到,表上加个时间戳字段,先select再update(update带上时间戳作为条件),那么有且只有一条成功,后面再insert。
再说回滚,一般最终一致性比较简单的保证方法就是补偿,你这块就是轮询,为了你这个奇葩需求你要再建一张表,里面记录的就是你在某某时刻开始做这个事了,然后后面开始做前面提到的写入过程,当写入完毕后把这个表的这条记录标明下已经搞完了。另一边,一个轮询的过程不停的扫这个表,找里面超时且未完成的,然后按步骤逐一检查,补全缺失过程后再标记完成。
最后说读取,相关读取不能单独以涉事的这两个表中的一个作为后续逻辑判断条件,必须同时判定两张表是否都符合你的逻辑,否则则认为读取到“脏”数据。
if exists。。。
if exists 存在就更新,或者判断更新受影响的行数,有了这些依据就知道是否需要插入;事务是为了保证更新和插入的一致性
在保存的方法里用 lock锁住,然后想怎么搞就怎么搞了,至于性能方面,再想想办法