我很困惑。从表面上看,在 C# 中执行事务似乎很简单。从这里:
http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleTransactionClass.htm
string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT COUNT(*) FROM MyTable";
// Start a transaction
OracleTransaction txn = con.BeginTransaction(
IsolationLevel.ReadCommitted);
try
{
// Insert the same row twice into MyTable
cmd.CommandText = "INSERT INTO MyTable VALUES (1)";
cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery(); // This may throw an exception
txn.Commit();
}....
因此,创建一个连接,在该连接上开始一个事务,然后离开,直到您想要提交或回滚。
但是,其他来源,例如这里:
https://forums.oracle.com/thread/319121
提倡设置 OracleCommand 对象本身的 Transaction 属性。例如
cmd.Transaction = txn;
然而其他消息来源说这个属性是只读的。它实际上并不是只读的,但似乎没有任何地方清楚地说明它的作用。
因此,我的困惑是,OracleCommand 对象上 Transaction 属性的存在似乎表明它应该用于执行该命令作为事务的一部分,但 Oracle 自己的文档并未使用此属性。那么它是干什么用的呢?
所以我的问题是:
- 我是否需要设置我的 OracleCommand 的 Transaction 属性,如果需要,这到底是做什么的?
- 如果我在连接上启动了事务,那么在该连接上执行的所有后续命令(直到提交或回滚)是否都是该事务的一部分,即使我没有在这些命令上设置 Transaction 属性?