【发布时间】:2009-06-02 10:13:48
【问题描述】:
我有以下情况:
如果有一个带有 InnoDB 表的 MySQL 数据库,我用它来存储唯一数字。 我开始一个事务,读取值(例如 1000471),将该值存储在另一个表中并更新增量值(100472)。现在我想避免在我的事务运行时其他人甚至读取该值。
如果我使用普通的 MySQL,我会这样做:
Exceute("LOCK tbl1 READ");
执行("SELECT ... from 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 甚至可以实现读锁
【问题讨论】:
-
请注意,将 TransactionScope 与远程 MySQL 服务器一起使用时,本地和远程计算机上都需要一个分布式事务协调器。
-
这不是真的,需要 DTC a) 如果实现需要它 b) 总是如果您使用多个事务,例如using (TransactionScope ts = new TransactionScope()) { - 删除文件(在 vista 文件操作支持 TransactionScope 上) - 从服务器 1 上的表中选择 * - 插入到服务器 2 上的表中 - 从服务器 1 上的表中删除 }
标签: c# mysql subsonic transactions transactionscope