首先,我们使用这个测试表来测试IF OBJECT_ID('Test') IS NOT NULL DROP TABLE Test CREATE TABLE Test( Id int, Name nchar(100), [Counter] int,primary key (Id), unique (Name));GO
方法/步骤
1
我们统一创建存储过程通过来SQLQueryStress来测试并发情况,我们来看第一种情况。
2
解决方案二(降低隔离级别为最低隔离级别UNCOMMITED)此时问题依旧和解决方案一无异(如果降低级别为最低隔离级别,如果行记录为空,前一事务如果未进行提交,当前事务也能读取到该行记录为空,如果当前事务插入进去并进行提交,此时前一事务再进行提交此时就会出现插入重复键问题)
3
解决方案三(提升隔离级别为最高级别SERIALIZABLE) 此时将隔离级别提升为最高隔离级别会解决插入重复键问题,但是对于更新来获取排它锁而未提交,而此时另外一个进程进行查询获取共享锁此时将造成进程间相互阻塞从而造成死锁,所以从此知最高隔离级别有时候能够解决并发问题但是也会带来死锁问题。
4
解决方案四(提升隔离级别+良好的锁)此时我们再来在添加最高隔离级别的基础上增添更新锁,如下: 运行多次均未发现出现什么异常,通过查询数据时使用更新锁而非共享锁,这样的话一来可以读取数据但不阻塞其他事务,二来还确保自上次读取数据后数据未被更改,这样就解决了死锁问题。貌似这样的方案是可行得,如果是高并发不知是否可行。
5
解决方案五(提升隔离级别为行版本控制SNAPSHOT) 上述解决方案也会出现插入重复键问题不可取。
6
解决方案六(提升隔离级别+表变量) 经过多次认证也是零错误,貌似通过表变量形式实现可行。
7
解决方案七(提升隔离级别+Merge)
注意事项
参考如下博客
上一篇:java如何解决并发问题
下一篇:当前用户并发数已满怎么解决