我有一个名为User
的类的两个实例。这些对象中的每一个都有自己的DataSet,SQLiteConnection,SQLiteDataAdapter等。我正在尝试模拟学校工作中的“丢失更新”异常。
数据库表如下所示:
ID Name Salary
---------------------
1 John 10
在构建User
个对象时填充数据集。每个对象都更新同一行。第一个对象将行ID 1的工资增加2,结果为12.第二个对象也将工资增加5,结果为15,但是我们预期17,或者至少是异常,因此回滚事务。但没有例外。我做错了什么?
以下是我在User
类
public bool IncreaseSalary(int raise)
{
int currentSalary = Convert.ToInt32(_dataSet.Tables["Employees"].
Rows[0]["Salary"]);
_dataSet.Tables["Employees"].Rows[0]["Salary"] = currentSalary + raise;
_connection.Open();
SQLiteTransaction transaction = _connection.BeginTransaction();
_employeesDataAdapter.SelectCommand.Transaction = transaction;
_employeesDataAdapter.UpdateCommand.Transaction = transaction;
_employeesDataAdapter.DeleteCommand.Transaction = transaction;
_employeesDataAdapter.InsertCommand.Transaction = transaction;
int result = _employeesDataAdapter.Update(_dataSet);
transaction.Commit();
_dataSet.Clear();
_employeesDataAdapter.Fill(_dataSet);
return result > 0;
}
答案 0 :(得分:0)
您可以使用 Optimistic Concurrency 。指定UpdateCommand以用于检查原始值的位置,以防其他人更改原始值。一个例子:
...
myAdapter.UpdateCommand = new SQLiteCommand("UPDATE Dept SET DeptNo = :DeptNo, DName = :DName WHERE DeptNo = :oldDeptNo", sqConnection);
myAdapter.UpdateCommand.Parameters.Add("DeptNo", SQLiteType.Int32, 0, "DeptNo");
myAdapter.UpdateCommand.Parameters.Add("oldDeptNo", SQLiteType.Int32, 0, "DeptNo").SourceVersion = DataRowVersion.Original;
...
调用更新后,请检查受影响的记录数;如果没有,那么它是丢失的更新。