在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都没有插入数据