私は次の状況にあります:
一意の番号を格納するために使用するInnoDBテーブルを持つMySQLデータベースがある場合。トランザクションを開始し、値(1000471など)を読み取り、この値を別のテーブルに格納して、増分値(100472)を更新します。ここで、トランザクションの実行中に他の誰かが値を読み取ることさえ避けたいと思います。
プレーンなMySQLを使用する場合は、次のようにします。
Exceute( "LOCK tbl1 READ");
Execute( "SELECT ... from tbl1");
Execute( "INSERT into tbl2");
Execute( "UNLOCK TABLES");
ただし、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でも読み取りロックは可能ですか