【发布时间】:2015-04-13 11:08:58
【问题描述】:
我有一个存储过程,我需要使用 Entity Framework 4.0 作为更广泛事务范围的一部分来执行它。这是我所拥有的场景的快速演示:
private void button1_Click(object sender, EventArgs e)
{
using (var scope = GetTransaction(IsolationLevel.Serializable))
{
var model = new SPUpdateTestEntities();
var rows = model.TestTables.ToList();
Debug.WriteLine("rows:");
foreach (var row in rows)
{
Debug.WriteLine(row);
}
var random = new Random();
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var result = new string(
Enumerable.Repeat(chars, 8)
.Select(s => s[random.Next(s.Length)])
.ToArray());
model.UpdateTestTable(rows[random.Next(rows.Count())].Id, result, random.Next());
model.SaveChanges();
var rowsAgain = model.TestTables.ToList();
Debug.WriteLine("rowsAgain:");
foreach (var row in rowsAgain)
{
Debug.WriteLine(row);
}
scope.Complete();
}
}
private TransactionScope GetTransaction(IsolationLevel isolationLevel)
{
var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = isolationLevel;
transactionOptions.Timeout = TransactionManager.MaximumTimeout;
return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
存储过程UpdateTestTable 的目的是在TestTable 中插入和更新记录。
ALTER PROCEDURE [dbo].[UpdateTestTable]
@Id AS INTEGER,
@Text as VARCHAR(255),
@Number AS INTEGER
AS
BEGIN
INSERT INTO TestTable(Text, Number)
VALUES (CONVERT(varchar(255), NEWID()), ABS(CHECKSUM(NewId())) % 14)
UPDATE TestTable
SET Text = @Text, Number = @Number
WHERE Id = @Id
END
我期望的行为是allRowsAgain 包含在UpdateTestTable 中所做的任何修改。我得到的实际行为是返回插入的记录,但没有更新现有记录。
我已经尝试了隔离级别 Serializable(如图所示)、ReadComitted 和 ReadUncomitted,但这并没有像我希望的那样对结果产生影响。
编辑: 我添加了一些调试语句以使结果更清晰一些,这是输出:
第一次运行:
rows:
Id:2 - Number:1 - Text:Hello
rowsAgain:
Id:2 - Number:1 - Text:Hello
Id:19 - Number:1 - Text:0B22C83C-58E9-403C-96B4-FB3940E1F250
第二次运行:
rows:
Id:2 - Number:2135368409 - Text:CQCXCTAY
Id:19 - Number:1 - Text:0B22C83C-58E9-403C-96B4-FB3940E1F250
rowsAgain:
Id:2 - Number:2135368409 - Text:CQCXCTAY
Id:19 - Number:1 - Text:0B22C83C-58E9-403C-96B4-FB3940E1F250
Id:20 - Number:8 - Text:D5A6684B-D140-415F-A81B-36705915FAF6
谢谢, 蚂蚁
【问题讨论】:
-
也许这是因为事务范围正在等待数据库更改,直到事务完成?
-
我怀疑您可能是对的,但我希望能够在提交事务之前使用这些值。我也很好奇为什么插入的行可用但更新不可用。也许是 EF 缓存?
-
确实很奇怪。
标签: .net sql-server entity-framework transactionscope