我有以下情况:
如果有一个带有 InnoDB 表的 MySQL 数据库,我用它来存储唯一的数字。我开始一个事务,读取值(例如 1000471),将该值存储在另一个表中并更新增量值(100472)。现在我想避免其他人甚至在我的事务运行时读取该值。
如果我使用普通的 MySQL,我会做这样的事情:
执行(“锁定 tbl1 读取”);
执行(“从 tbl1 中选择 ...”);
执行(“插入到 tbl2”);
执行(“解锁表”);
但由于我使用 SubSonic 作为 DAL 并且代码应该独立于 mysql,所以我必须使用 TransactionScope。
我的代码:
TransactionOptions TransOpt = new TransactionOptions();
TransOpt.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
TransOpt.Timeout = new TimeSpan(0, 2, 0);
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, TransOpt))
{
// Select Row from tbl1
// Do something
ts.Complete();
}
根据 TransactionOptions 的帮助
system.transactions.isolationlevel
我想要达到的效果可以用 IsolationLevel.ReadCommitted 来实现,但是我仍然可以从事务外部读取行(如果我尝试更改它,我会得到一个锁,所以事务正在工作)
有人有建议吗?TransactionScope 甚至可以实现读锁吗