两个用户同时尝试做同样的事情

时间:2016-06-26 13:53:28

标签: mysql database vb.net

我正在使用visual basic 2015和MySql数据库编写程序,之前我曾在其他地方问过这个问题,但他们无法帮助我。

例如,我们有一个名为“users”的表:

username   |   coins   
user1      |      3 
user2      |      5

我想更改硬币值并且此代码工作正常但在此代码中:1-我得到列的值。 2-我在值中添加一个单位。 3-我把值放在列中。所以问题是,如果数据库在线并且两台不同的计算机运行程序并尝试同时更改该值,该怎么办?例如,其中一个试图给用户1 2个硬币而另一个试图给用户4个硬币。然后他们同时点击添加硬币。第一台计算机得到的值,它是3.第二台计算机得到的值,它是3.第一台计算机添加2个硬币(3 + 2 = 5),并在列中放入5。现在第二台计算机添加4个硬币(3 + 4 = 7)并在列中添加7个。所以我们的列中有7个,但我们应该有9个,因为3 + 2 + 4 = 9

所以问题是:有没有办法直接向列添加值,还是有另一种方法可以解决这个问题?

MysqlConn = New MySqlConnection
    MysqlConn.ConnectionString = "Server='" & TextBox_MYSQL_Host.Text & "';UserID='" & TextBox_MYSQL_Username.Text & "';Password='" & TextBox_MYSQL_Password.Text & "';Database='" & TextBox_MYSQL_Database.Text & "';Character Set=utf8"

    Try
        MysqlConn.Open()
        DataAdptr = New MySqlDataAdapter
        DataTable = New DataTable
        MysqlComd = New MySqlCommand
        With MysqlComd
            .Connection = MysqlConn
            .CommandText = "Select * FROM users WHERE username ='" & user1.text & "';"
        End With
        DataAdptr.SelectCommand = MysqlComd
        DataAdptr.Fill(DataTable)
        If DataTable.Rows.Count = 0 Then
            ' Error!
        Else
            Dim gold As Integer = DataTable.Rows(0).Item("coins").ToString()
            gold = gold + 1
            MysqlComd = New MySqlCommand
            MysqlComd.Connection = MysqlConn
            MysqlComd.CommandText = "UPDATE users SET coins='" & gold & "' WHERE username='" & user1.Text & "'"
            MysqlComd.ExecuteNonQuery()
        End If
        MysqlConn.Close()
    Catch ex As MySqlException
        ' Connection Error
    Finally
        MysqlConn.Dispose()
    End Try
End Sub

1 个答案:

答案 0 :(得分:1)

无论评论中提到的代码存在问题,有两种方法可以解决您特别询问的问题。

首先,您可以按照自己的方式继续这样做并使用乐观并发。这样做是假设每个用户都是唯一一个编辑数据的用户,并保存好像是这样的情况,然后如果结果不是则抛出异常。具体而言,当保存记录时,将数据库中的当前值与该用户检索的原始数据进行比较,并且当且仅当它们匹配时,将保存新值。如果他们不这样做,那么你可以抓住被抛出的ConcurrencyException并做任何合适的事情。这通常会再次检索数据,要么用户再次开始编辑,要么将当前数据与现有修改合并。

另一个选择是简单地增加数据库中的内容而不是保存特定值,例如

UPDATE MyTable SET MyColumn = MyColumn + 1 WHERE ID = @ID