[英]Lost Update in ADO.NET and DataSets
我有一个名为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;
}
您可以使用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;
...
调用更新后,检查受影响的记录数; 如果没有,那么这是一个丢失的更新 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.