在步入正题前 , 先介绍几个概念 , 以便更好的理解事务隔离级别 。
是指在数据库操作中,为了有效保证并发读取数据的正确性提出的。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
事务的特性(ACID)
1
)
、原子性(Atomicity)
事物是数据库的逻辑工作单位,事务中的诸多操作要么全做要么全不做
2
)
、一致性(Consistency)
事务执行结果必须是使数据库从一个一致性状态变到另一个一致性状态
3
)
、隔离性(Isolation)
一个数据的执行不能被其他事务干扰
4
)
、持续性/永久性(Durability)
一个事务一旦提交,它对数据库中的数据改变是永久性的
隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好.
3 .Ado .net 提供的事务隔离级别
System.Data.IsolationLevel 共定义了 7 种级别 。
public enum IsolationLevel
{
Chaos = 16,
ReadUncommitted = 256,
ReadCommitted = 4096,
RepeatableRead = 65536,
Serializable = 1048576,
Snapshot = 16777216,
Unspecified = -1
}
1) C haos
无法改写隔离级别更高的事务中的挂起的更改。
2) Read Committed
在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
3) ReadUncommitted
可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。
4) RepeatableRead
在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。
5) Serializable
在 dataset上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。
6) Snapshot
通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。
7) Unspecified
正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 当使用 OdbcTransaction 时 , 如果不设置IsolationLevel 或者将 IsolationLevel 设置为 Unspecied,事务将根据基础 ODBC 驱动程序的默认隔离级别来执行。
默认事物隔离级别为 Read Committed
1) ReadUncommitted
表示:未提交读。当事务A更新某条数据的时候,不容许其他事务来更新该数据,但可以进行读取操作
2) ReadCommitted
表示:提交读。当事务A更新数据时,不容许其他事务进行任何的操作包括读取,但事务A读取时,其他事务可以进行读取、更新
3) RepeatableRead
表示:重复读。当事务A更新数据时,不容许其他事务进行任何的操作,但是当事务A进行读取的时候,其他事务只能读取,不能更新
4) Serializable
表示:序列化。最严格的隔离级别,当然并发性也是最差的,事务必须依次进行。
通过一些现象,可以反映出隔离级别的效果。这些现象有:
更新丢失(lost update) :当系统允许两个事务同时更新同一数据时,发生更新丢失。
脏读(dirty read) :当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不重复读(nonrepeatable read) :同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(phantom read) :同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
|
隔离级别 |
脏读 Dirty Read |
不可重复读取 NonRepeatable Read |
幻读 Phantom Read |
|
未授权读取/未提交读 read uncommitted |
可能发生 |
可能发生 |
可能发生 |
|
授权读取/提交读 read committed |
- |
可能发生 |
可能发生 |
|
重复读 read repeatable |
- |
- |
可能发生 |
|
序列化 serializable |
- |
- |
- |
在 .net 中,可以使用 GBase C onnection 和 GBase Transaction 对象来控制事务。可以使用 GBase Connection.BeginTransaction 启动本地事务。一旦开始一个事务,就可以使用 GBase Command 对象的 GBase Transaction 属性在该事务中登记命令。然后,可以根据事务组件的成功或失败情况,使用 GBase Transaction 对象提交或回滚在数据源中所做的修改。
代码如下 :

Conn.Begin Tra nsaction 开启事务 。 参数指定事务的隔离级别
C ommit(); 提交数据库事务
Rollback () 从挂起状态回滚事务。
注意 :
事务的定义必须在连接打开后,提交必须在关闭以前
使用事务时必须及时把事务添加到
GBase
Command
中去。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69993860/viewspace-2838086/ ,如需转载,请注明出处,否则将追究法律责任。