Ado.net如何开启GBase8s事务并指定事务隔离级别

本文详细介绍了数据库事务的隔离级别,包括Chaos、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable和Snapshot,讨论了它们对并发性能的影响,并通过Ado.net展示了如何在GBase8s中开启事务并指定隔离级别,提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.名词解释
在步入正题前,先介绍几个概念,以便更好的理解事务隔离级别。
1.数据库隔离级别
是指在数据库操作中,为了有效保证并发读取数据的正确性提出的。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
2.事务隔离级别(IsolationLevel)
事务的特性(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)Chaos
无法改写隔离级别更高的事务中的挂起的更改。
2)ReadCommitted
在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
3)ReadUncommitted
可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。
4)RepeatableRead
在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。
5)Serializable
在 dataset上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。
6)Snapshot
通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。
7)Unspecified
正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 当使用 OdbcTransaction 时,如果不设置IsolationLevel 或者将 IsolationLevel 设置为 Unspecied,事务将根据基础 ODBC 驱动程序的默认隔离级别来执行。
默认事物隔离级别为ReadCommitted
4.常用状态分析
  1)ReadUncommitted
    表示:未提交读。当事务A更新某条数据的时候,不容许其他事务来更新该数据,但可以进行读取操作
  2)ReadCommitted
    表示:提交读。当事务A更新数据时,不容许其他事务进行任何的操作包括读取,但事务A读取时,其他事务可以进行读取、更新
  3)RepeatableRead
    表示:重复读。当事务A更新数据时,不容许其他事务进行任何的操作,但是当事务A进行读取的时候,其他事务只能读取,不能更新
  4)Serializable
    表示:序列化。最严格的隔离级别,当然并发性也是最差的,事务必须依次进行。
5.读取现象
通过一些现象,可以反映出隔离级别的效果。这些现象有:
更新丢失(lost update):当系统允许两个事务同时更新同一数据时,发生更新丢失。
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
6.隔离级别与读取现象
隔离级别 脏读
Dirty Read 不可重复读取
NonRepeatable Read 幻读
Phantom Read
未授权读取/未提交读
read uncommitted 可能发生 可能发生 可能发生
授权读取/提交读
read committed - 可能发生 可能发生
重复读
read repeatable - - 可能发生
序列化
serializable - - -

二.示例
在 .net 中,可以使用 GBaseConnection 和 GBaseTransaction 对象来控制事务。可以使用 GBaseConnection.BeginTransaction 启动本地事务。一旦开始一个事务,就可以使用 GBaseCommand 对象的 GBaseTransaction 属性在该事务中登记命令。然后,可以根据事务组件的成功或失败情况,使用 GBaseTransaction 对象提交或回滚在数据源中所做的修改。
代码如下:
在这里插入图片描述

Conn.BeginTransaction 开启事务。参数指定事务的隔离级别
Commit();提交数据库事务
Rollback() 从挂起状态回滚事务。
注意:
事务的定义必须在连接打开后,提交必须在关闭以前
使用事务时必须及时把事务添加到GBaseCommand中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值