关于BeginTranscation()和Commit之间的代码

Sanfhhhh 2019-04-14 05:01:24
BeginTranscation()和Commit之间有个函数,会从一个表取数据再塞到这个表里。结果两个用户同时登陆,为什么取最新的一条数据是同一条?BeginTranscation()和Commit之间的代码不属于临界区么?中间的代码访问的表不是互斥访问的么?
...全文
124 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sanfhhhh 2019-04-15
  • 打赏
  • 举报
回复
谢谢大家,有很多不懂的地方,看到大家说的会学到一些,谢谢谢谢
奇点码农 2019-04-15
  • 打赏
  • 举报
回复
应该是你没有Commit(),所以数据库里面又有最新的数据,如果要实现你这个功能可以加一个标记字段,不成功就删除
  • 打赏
  • 举报
回复
引用 楼主 Sanfhhhh 的回复:
中间的代码访问的表不是互斥访问的么?
现在正规的数据库系统,没有哪一个默认是表锁的,不会动不动就“访问表是互斥”的。只有你设置为 Serializable 之类的级别才会看到你想的这种结果。 两个“同时登录”事务并不一定同时,自不过是你从业务操作角度以为是“同时”而已。只要是你没有修改、删除其它记录(从而检测出不同数据库实现不同的事务机制时有什么 bug),那么你感觉两个事务读取其它同一条记录这是很正常的。
  • 打赏
  • 举报
回复
ReadCommitted 模式下本来就是有可能重复读、幻象读,并不能保证没有幻象读记录。
秋的红果实 2019-04-14
  • 打赏
  • 举报
回复
事务强调的是要么都成功,要么撤销所有操作
  • 打赏
  • 举报
回复
对于 SQL Server 来说,默认地,事务的级别是 ReadCommitted 而并不是 Serializable。

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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