IsolationLevel 属性
指示 Connection 对象的隔离级别。
设置和返回值
设置或返回以下某个 IsolationLevelEnum 值。
常数 说明
adXactUnspecified 指示提供者正在使用非指定的 IsolationLevel,但其级别无法确定。
adXactChaos 默认值。指示无法从更高级隔离事务覆盖挂起的更改。
adXactBrowse 指示从某事务中可以查看其他事务中未提交的更改。
adXactReadUncommitted 同 adXactBrowse。
adXactCursorStability 默认值。表明只有在事务提交后才能从某事务中查看它们的更改。
adXactReadCommitted 同 adXactCursorStability。
adXactRepeatableRead 指示无法从某事务中查看其他事务中所作的更改,但通过查询可以得到新记录集。
adXactIsolated 指示该事务在与其他事务隔离的情况下执行。
adXactSerializable 同 adXactIsolated。
说明
使用 IsolationLevel 属性可设置 Connection 对象的隔离级别。IsolationLevel 的属性为读/写。直到下次调用 BeginTrans 方法时,该设置才可以生效。如果您请求的隔离级别不可用,提供者可能返回下一个更高的隔离级别。
远程数据服务用法 当用于客户端 Connection 对象时,只能将 IsolationLevel 属性设置为 adXactUnspecified。
由于用户正在使用客户端缓冲区中已断开的 Recordset 对象,所以可能会出现多用户问题。例如,当两个不同的用户对同一记录进行更新时,Remote Data Service 只允许首先更新该记录的用户实现更新操作。第二个用户的更新请求将失败,并产生错误。
ADO的IsolationLevel
作者:未知 文章来源:cww 点击数: 274 更新时间:2005-2-6
来源:cww
请先叁照RDO 的IsolationLevel一文中,对Isolation Level的介绍,在这里,要提出的
是OpenLink Informix ODBC Driver的限制,使得我们只能用Client端的Scroll Cursor,
如果用Server端的Cursor,则要以adFrowardOnly的Cursor来开启。而Informix只有在
Server端的Cursor才能设定IsolationLevel,而且要在Transaction之下才能够有作用,
使得ADO Connection物件的IsolationLevel属性的设定不能起作用,而有其特殊的用法。
但在这里得再特别提出说明,建议只能设定成Dirty Read/Read Committed,不要设定成
Cursor Stability,经我的测试,使用Cursor Stability时,不像RDO有预期的效果
Dim WithEvents cn As ADODB.Connection
Private WithEvents rs As ADODB.Recordset
Private qry As ADODB.Command
Private adoerr As ADODB.Errors
Private Sub Form_Load()
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.ConnectionString = connstr
cn.Open
cn.BeginTrans
cn.Execute "SET ISOLATION TO DIRTY READ" '这要在Transaction启动时用,且在
'Recordset建立前设定
sql = "Select * from qppfa where case_no = 'E8701761' and seq between 1 and 80"
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseServer '设定成Server端的Cursor
rs.Source = sql
rs.CacheSize = 1
rs.Open , cn, adOpenForwardOnly, adLockReadOnly, adCmdText
rs.MoveNext
cn.RollbackTrans
然而在SQL Server 6.5呢,则有不错的效果。特性如下:
1.在Connection物件开启前便设定IsolationLevel,如果是Repeatable Read,则在Recordset
开启之前便得Begin Transaction。Read Committed/ Dirty Read可不必在Transaction中
开启Recordset。
2.就算是Client端的Cursor,设定为Repeatable Read的IsolationLevel,也会使Recordset
内的资料在其上有一个Share Lock,而不是只有 Server端的 Cursor会如此。然而,
Read Committed/ Dirty Read是针对Server端的Cursor所设定的,也就是说,如果我们
设定Read Committed而且是Client端的Cursor,而某一笔Data被其他Process修正了且未
Committed,那麽我们Move到该笔时,并不会因而停下来,因为我们此时读取的是在Client
端的资料。
3.如果设定为 adOpenForwardOnly, adLockReadOnly的Recordset,则除非IsolationLevel
设定为 Repeatable Read,否则会是Dirty Read的行为方式
4.Read UnCommitted或Dirty Read必需是在adOpenForwardOnly, adLockReadOnly时才能
开启
Dim WithEvents cn As ADODB.Connection
Private WithEvents rs As ADODB.Recordset
Private qry As ADODB.Command
Private adoerr As ADODB.Errors
Private Sub Form_Load()
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
connstr = "Data Source=OPEN_VIEW;User=cww;Password=jjh5612;Initial Catalog=cwwtest"
cn.Provider = "SQLOLEDB"
cn.ConnectionString = connstr
cn.IsolationLevel = adXactRepeatableRead '在此设定IsolationLevel
'如果省略会以Read Committed的方式读取
cn.Open
cn.BeginTrans 'Repeatable Read必需under Transaction
'如果不是Repeatable Read则这行可省略
sql = "Select * from qppfa where case_no = 'E8701761' and seq between 1 and 80 "
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseServer
rs.Source = sql
rs.Open , cn, adOpenKeyset, adLockOptimistic, adCmdText
rs.MoveNext
Debug.Print rs!case_no, rs!seq
rs!kind = "k"
rs.Update
cn.RollbackTrans
IsolationLevel 和 Mode 属性范例
该范例使用 Mode 属性打开独占连接,使用 IsolationLevel 属性打开独立于其他事务执行的事务。
Public Sub IsolationLevelX() Dim cnn1 As ADODB.Connection
Dim rstTitles As ADODB.Recordset
Dim strCnn As String ' 将连接字符串赋给变量。
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; " ' 打开连接和标题表。
Set cnn1 = New ADODB.Connection
cnn1.Mode = adModeShareExclusive
cnn1.IsolationLevel = adXactIsolated
cnn1.Open strCnn
Set rstTitles = New ADODB.Recordset
rstTitles.CursorType = adOpenDynamic
rstTitles.LockType = adLockPessimistic
rstTitles.Open "titles", cnn1, , , adCmdTable
cnn1.BeginTrans ' 显示连接模式。
If cnn1.Mode = adModeShareExclusive Then
MsgBox "Connection mode is exclusive."
Else
MsgBox "Connection mode is not exclusive."
End If ' 显示独立级别。
If cnn1.IsolationLevel = adXactIsolated Then
MsgBox "Transaction is isolated."
Else
MsgBox "Transaction is not isolated."
End If ' 更改 psychology 标题的类型。
Do Until rstTitles.EOF
If Trim(rstTitles!Type) = "psychology" Then
rstTitles!Type = "self_help"
rstTitles.Update
End If
rstTitles.MoveNext
Loop ' 打印记录集中的当前数据。
rstTitles.Requery
Do While Not rstTitles.EOF
Debug.Print rstTitles!Title & " - " & rstTitles!Type
rstTitles.MoveNext
Loop ' 恢复原始数据。
cnn1.RollbackTrans
rstTitles.Close
cnn1.CloseEnd Sub
• ADO的IsolationLevel
請先參照RDO 的IsolationLevel一文中,對Isolation Level的介紹,在這裡,要提出的是OpenLink Informix ODBC Driver的限制,使得我們只能用Client端的Scroll Cursor,如果用Server端的Cursor,則要以adFrowardOnly的Cursor來開啟。而Informix只有在Server端的Cursor才能設定IsolationLevel,而且要在Transaction之下才能夠有作用使得ADO Connection物件的IsolationLevel屬性的設定不能起作用,而有其特殊的用法。
但在這裡得再特別提出說明,建議只能設定成Dirty Read/Read Committed,不要設定成Cursor Stability,經我的測試,使用Cursor Stability時,不像RDO有預期的效果
Dim WithEvents cn As ADODB.Connection
Private WithEvents rs As ADODB.Recordset
Private qry As ADODB.Command
Private adoerr As ADODB.Errors
Private Sub Form_Load()
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.ConnectionString = connstr
cn.Open
cn.BeginTrans
cn.Execute "SET ISOLATION TO DIRTY READ" '這要在Transaction啟動時用,且在
'Recordset建立前設定
sql = "Select * from qppfa where case_no = 'E8701761' and seq between 1 and 80"
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseServer '設定成Server端的Cursor
rs.Source = sql
rs.CacheSize = 1
rs.Open , cn, adOpenForwardOnly, adLockReadOnly, adCmdText
rs.MoveNext
cn.RollbackTrans
然而在SQL Server 6.5呢,則有不錯的效果。特性如下:
1. 在Connection物件開啟前便設定IsolationLevel,如果是Repeatable Read,則在Recordset開啟之前便得Begin Transaction。Read Committed/ Dirty Read可不必在Transaction中開啟Recordset。
2. 就算是Client端的Cursor,設定為Repeatable Read的IsolationLevel,也會使Recordset內的資料在其上有一個Share Lock,而不是只有 Server端的 Cursor會如此。然而,Read Committed/ Dirty Read是針對Server端的Cursor所設定的, 也就是說,如果我們 設定Read Committed而且是Client端的Cursor,而某一筆Data被其他Process修正了且未 Committed,那麼我們Move到該筆時,並不會因而停下來,因為我們此時讀取的是在Client端的資料。
3. 如果設定為 adOpenForwardOnly, adLockReadOnly的Recordset,則除非IsolationLevel設定為 Repeatable Read,否則會是Dirty Read的行為方式
4. Read UnCommitted或Dirty Read必需是在adOpenForwardOnly, adLockReadOnly時才能開啟
Dim WithEvents cn As ADODB.Connection
Private WithEvents rs As ADODB.Recordset
Private qry As ADODB.Command
Private adoerr As ADODB.Errors
Private Sub Form_Load()
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
connstr = "Data Source=OPEN_VIEW;User=cww;Password=jjh5612;Initial Catalog=cwwtest"
cn.Provider = "SQLOLEDB"
cn.ConnectionString = connstr
cn.IsolationLevel = adXactRepeatableRead '在此設定IsolationLevel
'如果省略會以Read Committed的方式讀取
cn.Open
cn.BeginTrans 'Repeatable Read必需under Transaction
'如果不是Repeatable Read則這行可省略
sql = "Select * from qppfa where case_no = 'E8701761' and seq between 1 and 80 "
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseServer
rs.Source = sql
rs.Open , cn, adOpenKeyset, adLockOptimistic, adCmdText
rs.MoveNext
Debug.Print rs!case_no, rs!seq
rs!kind = "k"
rs.Update
cn.RollbackTrans
使用ADO.NET配置SQL Server事务处理
作者:aiso8 来源:网络搜索 时间:2006-3-9 [ 收藏此页到: 天天 ┊ 和讯 ┊ 博采 ┊ ViVi ┊ 狐摘 ┊ 我摘 ┊ 天极 ]
ADO.NET提供了处理后台数据所需要的一切功能,并且使用起来就如同从一张表格中读取一个数据那样简单。事务处理(transaction)允许你把数据库操作归为一组,由此来保证所有的操作都能够执行。因为一旦其中的一项操作执行失败,则整个事务处理都会失败。现在让我们来看看在.NET Framework下是如何使用事务处理的。
事务处理概况
事务处理是把一组操作合并为一个逻辑上的工作单元。在系统中没有出现错误的情况下,开发人员可以使用事务处理来控制并保持事务处理中每一个动作的连续性和完整性。
使用这样的方法可能导致向两个极端情况发展:要么在事务处理中的所有操作都得到执行,要么没有任何操作得到执行。这样的方法对于实时应用程序来说非常必要。
银行业务是一个范例。事务处理应当包括从一个帐户到另一帐户的转帐过程。这一过程属于事务处理,原因是从某帐户中支出和在另一帐户存入两个动作必须被作为一个整体来执行——任何一方都不允许失败。在深入研究ADO.NET编程之前,让我们先来看看在SQL中是如何进行事务处理的。
SQL事务处理
SQL允许开发人员使用两个简单的声明来使用事务处理
Begin Transaction (启动事务处理)
Commit Transaction (提交事务处理)
在两条声明中的所有语句都成为事务处理的一部分。命令Begin Transaction位于整个事务处理的起始位置,因此其后的所有命令只有在执行到命令Commit Transaction时才会被一并执行。ADO.NET方法就这么简单。
ADO.NET事务处理
事务处理需要一个数据库连接以及一个事务处理对象。在SQL Server和ADO.NET中使用事务处理的难点在于SqlTransaction类。此类名称随所使用的数据库平台的不同而会有一些变化。例如,对于OLEDB数据库来说,事务处理类名为OleDbTransaction。
System.Data.SqlClient namespace包括了SqlTransaction类。此类包括了两个属性:
Connection:指示同事务处理相关联的SqlConnection对象;
IsolationLevel:定义事务处理的IsolationLevel。
属性IsolationLevel是包括如下成员的枚举对象:
Chaos:从高度独立的事务处理中出现的pending changes不能被覆盖;
ReadCommitted:当数据需要被非恶意读取时,采用共享锁定(shared locks),但数据仍然可以在事务处理结束时被更新,这造成了非重复性的数据读取(nonrepeatable reads)或phantom data的产生;
ReadUncommitted:恶意读取数据是可能发生的,这表示没有使用共享锁定(shared locks),并且没有实现独占锁定(exclusive locks);
RepeatableRead:锁定查询中所用到的所有数据,由此避免其他用户对数据进行更新。在phantom rows仍然可用的状态下,这可以避免非重复性的数据读取(nonrepeatable reads);
Serialisable:在DataSet中进行范围锁定,由此防止其他用户在事务处理结束之前更新数据或在数据库中插入行;
IsolationLevel定义锁定记录的级别,但这一概念不在本文论述范围之内。对象SqlTransaction也提供了类似的方法。你可以使用以下方法来进行事务处理:
Commit:提交数据库事务处理;
Rollback:从未决状态(pending state)反转(roll back)事务处理。事务处理一旦被提交后即不能执行此操作;
Save:在事务处理中创建savepoint可以对事务处理的一部分进行反转,并且指定savepoint名称。
以下的C#示例将这些部分综合起来。
这一简单的控制台程序将通过以下步骤将两行插入到Northwind数据库的表格中:
调用Connection对象的BeginTransaction方法以标记事务处理的起始位置。BeginTransaction方法对事务处理返回了一个坐标(reference),此坐标被指定给事务处理所用到的Command对象。
将Transaction对象指定给将要执行的Command的Transaction属性。如果某Command在活动Transaction中的Connection上被执行,并且Transaction对象还没有被指定到Command的Transaction属性,则会产生一个异常。
调用Transaction对象的Commit方法来结束事务处理,或者调用Rollback方法来取消事务处理。
等价的VB.NET代码与之类似。
事务处理结束
尽管这是一个简单的示例,但它还是充分显示了在.NET应用程序中使用事务处理是多么的简单。请记住,事务处理只有在处理一组命令时才是必要的。