EAS_AOP分布式事务

在System.Transactions事务体系中,为事务提供了7种不同的隔离级别。这7中隔离级别分别通过 System.Transactions.IsolationLevel的7个枚举项表示。

public enum IsolationLevel
  {
      Serializable,
      RepeatableRead,
      ReadCommitted,
      ReadUncommitted,
      Snapshot,
      Chaos,
      Unspecified
  }

 

7个隔离级别之中,Serializable具有最高隔离级别,代表的是一种完全基于序列化(同步)的数据 存取方式,这也是System.Transactions事务默认采用的隔离级别。按照隔离级别至高向低,7个不同的 隔离级别代表的含义如下:

 

* Serializable:可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据;

 

* RepeatableRead:可以在事务期间读取可变数据,但是不可以修改。可以在事务期间添加新数据;

 

* ReadCommitted:不可以在事务期间读取可变数据,但是可以修改它;

 

* ReadUncommitted:可以在事务期间读取和修改可变数据;

 

* Snapshot:可以读取可变数据。在事务修改数据之前,它验证在它最初读取数据之后另一个事务是 否更改过这些数据。如果数据已被更新,则会引发错误。这样使事务可获取先前提交的数据值;

 

* Chaos:无法覆盖隔离级别更高的事务中的挂起的更改;

 

* Unspecified:正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。如果设置了此值 ,则会引发异常。

 

先定义一个接口,Tran方法准备使用事务

namespace Drug.BLL
{
    public interface ITranTest
    {
        void Tran();
    }
}

 

业务层代码

namespace Drug.BLL
{
    [ServiceBind(typeof(ITranTest))]
    public class TranTest : ITranTest
    { 
     //给需要通过事务执行的方法打上Transaction标记,并设置事务隔离级别
     [Transaction(System.Transactions.IsolationLevel.Serializable)]
public void Tran() { Test1 t1 = new Test1(); t1.id = 1; t1.name = "Test1"; t1.Save(); Test2 t2 = new Test2(); t2.id = 1; //故意使长度超过数据库字段的长度,让操作失败 t2.tname = "Test2kkkkkkkkkkkkkkkkkkkkkkkkkkk"; t2.Save(); } } }

 

最后执行事务进行测试

            try
            {
                ITranTest ITrans = ServiceContainer.GetService<ITranTest>();
                ITrans.Tran();
                MessageBox.Show("事务执行成功!");
            }
            catch
            {
                MessageBox.Show("事务执行失败!");
            }

 

执行到t2.Save()的时候会提示字符串将被截断 事务操作不能成功,Test1和Test2都没有插入数据

 

posted @ 2013-09-25 15:47  docomo  阅读(423)  评论(0编辑  收藏  举报