数据库开发018 事务处理
程序员文章站
2022-05-07 14:36:26
...
事务具有以下两个作用。
- ①一致性:同时进行的查询和更新彼此不会发生冲突,其他用户不会看到发生了变化但尚未提交的数据。
- ②可恢复性:一旦系统故障,数据库会自动地完全恢复未完成的事务。
如果不加控制地并发存取数据会产生错误。
- ①丢失修改,即当多个事务并发修改一个数据时,不加控制会得出错误的结果,一个修改会覆盖掉另一个修改;
- ②读的不可重复性,即当多个事务按某种时间顺序存取若干数据时,如果对并发存取不加控制,也会产生错误;
- ③脏读(Dirty Read),而当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
在ADO.NET中,使用Connection和Transaction对象来控制事务。事务建立顺序包括:
- ①调用Connection对象的BeginTransaction方法来标记事务的开始;
- ②将Transaction对象分配给要执行的Command的Transaction属性;
- ③执行所需的命令:
- ④调用Transaction对象的Commit方法来完成事务,或调用Rollback方法来取消事务。
可以使用Connection对象的BeginTransaction()方法来声明事务开始,利用Transaction对象的Commit()方法来提交事务,利用Transaction对象的Rollback()方法来回滚事务。
Imports System.Data.SqlClient
Public Class Form1
Dim conn As SqlConnection
Dim da As SqlDataAdapter
Dim ds As DataSet
Private Function GetConnection() As SqlConnection
Return New SqlConnection(My.Settings.SalesConnectionString)
End Function
Private Sub DisplayData(ByVal str As String)
DataGridView1.DataSource = Nothing
conn = GetConnection()
conn.Open()
Dim comm As New SqlCommand(str, conn)
Dim dr As SqlDataReader = comm.ExecuteReader
Dim dt As New DataTable
dt.Load(dr)
conn.Close()
DataGridView1.DataSource = dt
End Sub
Private Sub UpdateData()
conn = GetConnection()
conn.Open()
Dim comm As New SqlCommand
Dim trans As SqlTransaction
trans = conn.BeginTransaction
comm.Connection = conn
comm.Transaction = trans
Try
comm.CommandText = "Update grade set 数学=95 Where 姓名 like '%周%'"
comm.ExecuteNonQuery()
comm.CommandText = "Update grade set 数学=65 Where 姓名 like '%张%'"
comm.ExecuteNonQuery()
trans.Commit()
Label1.Text = "事务运行成功"
Catch ex As Exception
trans.Rollback()
Label1.Text = "有错"
Finally
conn.Close()
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DisplayData("select * from grade")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
UpdateData()
DisplayData("select * from grade")
End Sub
End Class