English 中文(简体)
我在阅读实体框架4的数据时如何使用交易?
原标题:How do I use a transaction when reading data with Entity Framework 4?

I m 试图利用微软服务器2008 R2与实体框架4.0之间的SNAPSHOT交易孤立水平。 然而,这似乎像我最初认为的那样容易。

为了使用SNAPSHOT的隔离水平,必须使该系统能够进入数据库。 我这样做了。 我通过利用Salk管理演播室测试,SNAPSHOT的隔离水平在我的数据库中发挥了预期的作用。 我想利用这一孤立程度,因为我希望始终如一地理解,而不要锁定行或整个桌子。 因此,我的数据库可供我使用SNAPSHOT的孤立程度。 迄今情况良好。

在我重新提出的申请中,我有一个窗口,在申请中,我把一些数据从一个表格上载。 每次我点击一个 but子时,我装上5个牢房。 窗口是XAML:

<Window x:Class="EFSnapshotTransactionTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Name="UC" Closing="UC_Closing">
<DockPanel>
    <Button Click="Button_Click" DockPanel.Dock="Top">Load next 5</Button>
    <ScrollViewer>
        <ListView ItemsSource="{Binding ElementName=UC, Path=ViewModel.Items}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/>
                    <GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}"/>
                    <GridViewColumn Header="DocumentNumber" DisplayMemberBinding="{Binding DocumentNumber}"/>
                    <GridViewColumn Header="Amount" DisplayMemberBinding="{Binding Amount}"/>
                    <GridViewColumn Header="Text" DisplayMemberBinding="{Binding Text}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </ScrollViewer>
</DockPanel>

这是窗户的密码:

    public partial class MainWindow : Window
{
    private ViewModel _vm;

    public ViewModel ViewModel
    {
        get { return _vm; }
    }

    public MainWindow()
    {
        _vm = new ViewModel();
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _vm.LoadNextItems(5);
    }

    private void UC_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        _vm.Dispose();
    }

这里无所不知。 现在,《守则》要看模式,即行动发生地。

    public class ViewModel : INotifyPropertyChanged, IDisposable
{
    private ObservableCollection<Posting> _items;
    private SentaFinancialsEntities _db;
    private DbTransaction _dbTrans;

    public ObservableCollection<Posting> Items
    {
        get { return _items; }
        set
        {
            _items = value;
            OnPropertyChanged("Items");
        }
    }

    public ViewModel()
    {
        _items = new ObservableCollection<Posting>();
        _db = new SentaFinancialsEntities();
        _db.Connection.Open();
        _dbTrans = _db.Connection.BeginTransaction(System.Data.IsolationLevel.Snapshot);
    }

    public void LoadNextItems(int count)
    {
        int startAt = _items.Count;
        var dbPostings = (from b in _db.Postings
                          select b).OrderBy(b => b.Dato).Skip(startAt).Take(count);
        foreach (var singleDbPosting in dbPostings)
        {
            Posting dto = new Posting(singleDbPosting);
            _items.Add(dto);
        }
    }

    public void Dispose()
    {
        _dbTrans.Commit();
        _dbTrans.Dispose();
        _db.Dispose();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

我试图在此做的是打开数据库的链接并保持开放。 我试图开始交易,并要求将SNAPSHOT与外界隔绝。 这样,我就可以在打开窗户时阅读5个行文,并接上这些行文,即使有人在窗户开放时会ed、删除或插入行文。 但是,当我用车库简介仪进行追踪时,在窗口开放或我装满时,没有开始交易,也没有确定我要求的孤立程度。 当窗户开放时,建立了联系,实体框架将交易孤立程度设定为READ COMMITTED,这是违约的孤立程度。 如果我使用翻译系统而不是翻译,情况也是如此(即无)。

因此,我的问题是:如果我的窗口开放,我怎么能够开始与SNAPSHOT的孤立水平交易,并保持开放。 交易的开放是绝对必要的,因此我可以不阅读其他用户在时间上增加的数据。

我知道,我可以与原指挥部一道这样做,但我希望尽可能避免这种情况。

副作用:人们对于不同程度的孤立存在不同的看法,但问题不是讨论SNAPSHOT的孤立程度是否与本案相比。 《SNAPSHOT》非常符合我们对这项任务的商业要求。 真正的问题可能是任何其他孤立程度,而其他孤立程度也不符合这一守则。

最佳回答

我很抱歉,我是浪费时间的。 令我感到惊讶的是,《守则》实际上发挥了作用。 我用Sall Profiler测试了我的节目,并观看了“BEGINTRANSACTION”声明和“SET TRANSACTIONISOLATION LEVELSPSHOT”。 然而,为了追踪交易,你需要具体选择在“SQ”中的活动清单中。 我不知道这一点。 我认为,将跟踪交易,作为简介员的正常结构。 此外,我发现,Kall Profiler无法追踪交易孤立程度的变化。 为了查明交易中交易与世隔绝的程度,你必须询问从制度角度看问题。 它有一个称为“交易-清算-水平”的栏目,其数字价值相当于孤立程度。 查阅,供查阅

当我认识到这一点时,我尝试了我的原法典,并询问了观点,并坚持! 这确实是在SNAPSHOT的孤立状态。

我希望这能够拯救其他人一些时间。

问题回答

使用<代码> 交易范围控制系统交易范围的孤立程度:

var TransactionOptions to = new TransactionOptions () 
 { IsolationLevel = IsolationLevel.Snapshot};
using (TransactionScope scope = new TransactionScope(
    TransactionScope.Required, to))
{
   // Do the work here
   ...
   scope.Complete ();
}

如果没有说明,该系统。 交易将使用<代码>可乘的孤立程度。 如果你能够读到数据库中的_committed_snapshot,你还可以使用<代码>ReadCommitted的孤立程度。

作为一般规则:

  • is better to open a connection just for the duration an operation and close it immediately. Connection pooling will take it from there.
  • is absolutely forbidden to hold a transaction for the lifetime of a form. Transaction can live only on a stack scope, for the duration of a specific operation (ie. for one button click). Otherwise Forgetful Fred will leave his form open and go to lunch, freezing the entire database with his pending transaction.




相关问题
Export tables from SQL Server to be imported to Oracle 10g

I m trying to export some tables from SQL Server 2005 and then create those tables and populate them in Oracle. I have about 10 tables, varying from 4 columns up to 25. I m not using any constraints/...

SQL server: Can NT accounts be mapped to SQL server accounts

In our database we have an SQL server account that has the correct roles to access some of the databases. We are now switching to windows authentication and I was wondering if we can create a NT user ...

SQL Server 2000, ADO 2.8, VB6

How to determine if a Transaction is active i.e. before issuing Begin Transaction I want to ensure that no previous transaction are open.. the platform is VB6, MS-SQL Server 2000 and ADO 2.8

热门标签