事务有4个关键的属性,一般称为ACID:
- 原子性 一次事务的工作不能再划分为更小的部分。不管一个事务里是否包含多条SQL语句,要么全部都执行,要不全部都不执行
- 一致性 事务必须操作一致性的数据视图,必须使数据处于一致的状态
- 孤立性 事务是独立运行的实体,一个事务不能影响其它正在运行的事务
- 持久性 提交事务时,必须持久化。
事务的孤立级别有以下操作:
- Dirty读取操作 能够读取还没有提交的数据。比如一个事务对某些行集的数据进行了修改,但是还未提交该事务,这时候另一个事务能够读取到这些已更新的事务,如果前一个事务回滚了,这会造成大问题。
- NoRepeatable读取操作 指的是一个事务多次读取同一行数据时,另一个事务在该过程中修改该行的数据。
- Phantom读取操作 指一个事务多次读取同一个行集时,另一个事务在该过程中添加或删除该行集的行。
ADO.NET中事务的孤立级别:
- Read Uncommitted 其它事务的修改情况能够对某个事务的查询造成影响。支持Dirty,NoRepeatable,Phantom读取操作。如果设置为该级别,无并发模型,在读取过程中,不会获取锁也不会使用锁。
- Read Committed 这是SQL Server的默认设置。已提交的更新在事务间是可见的,支持NoRepeatable,Phantom读取操作。
- SnapShot 相当于另外实现的Read Committed,表示在一个事务中读取的数据永远也不会反映同时进行的其它事务的修改。事务使用事务开始时候存在的数据行版本,它不会获取锁。(Sql Server 2005支持)
- Repeatable Read 在一个事务中,所有的读取操作都是一致的,其它事务不能影响该事务的查询结果。支持Phantom读取操作
- Serializable 在所访问的行集上放置一个范围锁,防止在该事务完成之前,其它用户更新数据集或者添加、删除该数据集。