------------------------------------------------------------------------------------------------imgdata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApoAAAFPCAIAAABidfmpAAAgAElEQVR4nOzd61dTaZo//OsvaNZ6VvNiWE8x7fo9xa9rRtfUjDPaPq3d2o6tv8catdvKeOhytDy0h9JStA4ey7NWWVqlUmp5xvMJLVFRC+UMgUCAQEJCAgkhIYRASELO2Yf7el4kQICAWFKl6PVZvICde9/33mHDd++dvfcFTkIIIYQMc4CEEEIIGeYozgkhhJBhj+KcEEIIGfZ+hjhnPNqMWKvBBityDBFR8GO7He2dX202bGnr/jH85fIjG7DbdgWm38ViC9o7vxm4fbTWUrx7FwuMz5iFBVCagXcz0BIcdNeEvHYCNqxvQgERETkXKopRpkKvgIjIBGzWYUk+FivRI/SYK2hHnRa1nV9G+zP+3GwFmJqFXNQUTyOq9JF/GoiIHD5NxSJbVIu+UwjpX+8t6jU3tHHOsCkPFyYiQOfXDHzSgpa0qCn9fM261uMPuy/tIQTA9UWiuvMbYdC/JOV2BMClj4SBf6+iC9cBArBCp/imbACE9BQ0Y3IiwkbmEZG34aaROHoem52EE75iTgHrv0cAnP0/7PeAiZ8wW1Sim69H/0WzxXdYaMCBdCmYtFPwRv2p1exBWMMcXX0GcEcSO6oVROx/CnnzmK7h6I3o6ud/dPSrvbeo19wz4vxhiWbr6Ucbv8+I/tp6+tFjWW2M1m4FTgAEYB8d55/m8vcuCHPeYgfVgjkc538Vzl0SLl0SUk8J35/nL50VZgACsFVHhEuXhPsKLtiZz2IQrQ2oUmC1Btv8kc7DcZ5cwKkPRr7hO/+mQx3Y0oIOP7pMqNKhT0DGYaMaddbIEYbXghoVp2/j/M5IS7cZlWp0Ru9BiOi0Yl2tqKrh7H5BROTcqFOiogatnuc4E0DI8CU48ZtpOHE0xn3KO3mx/hTGfSTaApzPKMyJE2+ZRKcOmz0cx3Fupfg7EB/ZuoPVfB3jFguWANeFF8SQHeUFKFWgi0dE9Legvhk5PzZZsOYoJm0XjFpWUIB1DmSIfhvWmbiAIIbasbwAZeW4LoEd1fACw75TOBcqpJhfhvZgZ88WdJqwpDDSG3l9MLTXYUkxKvXo86H0AMLfBJlaNNiQc6OuGoulWFGHQYYs0ONVX+cWJXhQp0C5MrK1dOF7zh7Wq3HIjgopymrQqEebHxF7b3vRwtuhTYsFJWgLIOdAeREqLSgMONcQeUacbzn1MBDiEVEUxWDA73E7nfYWs9mw5eTDPm0FzP4IAfC/znHuECcIgiiKwTahro033UIAfOtzXq0XDAbBaBFCAs97hT0jEEC8aeR4QRAEoWs33ZjaYzf/khbZgHEefmnEjMgsf9yGX0oi856Jmne9lGkOIQAmzYq0jF/XfXjBvLi5c0SpU7Rk4viuZUhkSn+f9SXk9cL8eGMpLroqVhxlCZ/yzqD4eCnOvMz7eBGDeHQsSy7geYYoiiE/qq7jiJmi1tP1V4jm6xj3P0JDhxgMYjCInIgeFUoApy5ji/+IiR8xYxB1KQhj2aw4hPlYdBgBEBLY/zceIYllt2H9CUzcIrbpcCHgqNls/mQEYEc1nLvPFE8dLk9EyQa2/n2WsKSzZ0CIx/cmIPwbK+14me8kGUoMtakII3D1WjYtnq1LxzUjEYBNncE23Gb1lzFuNFuynP0n4B+/wXZTj1c1nVvU8nh8ZxZbOI3B0h6nlBp7zu4W0V8X3VhsUON8wLHz2MI/MwCWohP99b23vWiR7fAdnBSPMIvNfQcnTWEA4i3pQHMNkWfE+cbvMxCRCwV9ng6Xo7Wtxdxsrm/U14Sn9xTEw2MQgB1WcwErS7+JN27gjZsoaxWbep1sX8nsAmIA90XinO912typwqJq3mzh5BdFAHxrB+9hz47z320VMm6IYwAB2L7b4pVkBoCTT/L+PvOO2SI8ui/+BRBAzLB29iKgsYqtfwsBxPxm/pvRCMBOyblmA595ha/zDP7UPiHDEId5O3DKAdYa5LTHWMJngtMvXpmJH97nggJDDi/NwEX3uZCIXBNKAAHwcBkfiPrb7XmyHTeX4f1FOPuS4AlxnEPYP4Z9XiTUpiDMEPMNvNvDqQ6zuI8Es4/jPPyFmfjXK4L6BCZ+zt/5O5tyXHCFOM7Df/E2O6LiH/0de09ZjovuCn6O49zCwd+x/dWCLgXh74LBw4Vc/PYRbHslnZB/XYTw5ET8KIc
一个很好的方法,但是如果你授予代表权,那么它应该是第一个接受它的人。唯一的问题是插入它仍然是两个IO操作。
MS Sql2008 merge从SQL:2003标准介绍:
merge tablename with(HOLDLOCK) as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert ( idfield, field1, field2, ... )
values ( 7, source.field1, source.field2, ... )
现在它只是一个IO操作,但是可怕的代码:-(
不要忘记交易。性能是好的,但简单(IF EXISTS ..)方法是非常危险的。
当多个线程将尝试执行插入或更新时,您可以轻松地获得主键违例。
@Beau Crawford&@Esteban提供的解决方案显示了一般想法,但容易出错。
为了避免死锁和PK违规,你可以使用这样的东西:
begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
update table set ...
where key = @key
end
else
begin
insert into table (key, ...)
values (@key, ...)
end
commit tran
要么
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran
相似问题