事物隔离的问题

太久 2010-07-13 02:40:31
现在有表A,其中自增长列id。
一个存储过程PROC,往表A中插入一条数据,并返回该条数据的id。(查一下最大的那个id,返回)
1.如果多人同时调用该PROC会不会第一个PROC返回的是id是第二个PROC插入的数据呢?(第一个PRCO刚写完,去读的时候第二个PROC刚好插入)
2.了解了一下事物的隔离级别,但是并不清楚到底怎么实现。比如设置了
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

是仅仅当前这个存储过程遵循序列化,还是对这个表的所有操作?
3.怎么解决呢?
先谢大家。。

...全文
64 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
feilniu 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xys_777 的回复:]

SQL code
select scope_identity()

只取本连接的插入的标识值,不会得到其他连接插入的id
[/Quote]

如果ID是标识列,这种方法最好。
feilniu 2010-07-13
  • 打赏
  • 举报
回复

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRANSACTION

INSERT INTO tb VALUES('value')

SELECT * FROM tb

--该事务提交之前其它会话不可能修改tb表
COMMIT TRANSACTION
andy_liucj 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xys_777 的回复:]

SQL code
select scope_identity()

只取本连接的插入的标识值,不会得到其他连接插入的id
[/Quote]看好这个,不要用max(identity列)
幸运的意外 2010-07-13
  • 打赏
  • 举报
回复
update所处的默认隔离级已经足可以控制了,不用额外的提升隔离级。只要控制好存储过程就行。
v1ctory1216 2010-07-13
  • 打赏
  • 举报
回复
楼主担心的问题不正好就是并发时引起的不可重复读的问题么!
把隔离级别设置为

set transaction isolation level repeattable read

就好了
永生天地 2010-07-13
  • 打赏
  • 举报
回复
select scope_identity() 

只取本连接的插入的标识值,不会得到其他连接插入的id
永生天地 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 zengyi906 的回复:]
现在有表A,其中自增长列id。
一个存储过程PROC,往表A中插入一条数据,并返回该条数据的id。(查一下最大的那个id,返回)
1.如果多人同时调用该PROC会不会第一个PROC返回的是id是第二个PROC插入的数据呢?(第一个PRCO刚写完,去读的时候第二个PROC刚好插入)
2.了解了一下事物的隔离级别,但是并不清楚到底怎么实现。比如设置了

SQL code
SET TRANS……
[/Quote]
1、既然是自增可以这样返回 select scope_identity() 刚刚插入的id,而不要用selet max
2、序列化的并发非常差,慎用。
3、。。。
水族杰纶 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]
查询的时候加锁

SQL code
with(xlock,pagelock)
[/Quote]
写错个单词
with(xlock,paglock)
水族杰纶 2010-07-13
  • 打赏
  • 举报
回复
查询的时候加锁
with(xlock,pagelock)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧