日期:2014-05-17  浏览次数:20897 次

oracle在ado.net级别事务为提交之前,不会对表加锁吗?
本帖最后由 x_wy46 于 2013-01-14 14:33:35 编辑
 

 SqlCommand myCom = new SqlCommand();
            myCom.Connection = con;
            myCom.Transaction = myTran;
            try
            {
                myCom.CommandText = "insert into tablename values ()";
                myCom.ExecuteNonQuery();

//执行完ExecuteNonQuery()之后,并未提交之前,
//select max(id) from tablename,在sqlserver中时查询不到(直到事务提交),
//在oracle中能查询到。
//难道oracle不会自动在表上加锁吗(现在开启了事务处理,再当前事务未提交之前,其他查询可以对表操作?)?
                myTran.Commit();
                Response.Write("成功执行");

            }
            catch (Exception Ex)
            {
                myTran.Rollback();
                //创建并且返回异常的错误信息
                Response.Write(Ex.ToString());
                Response.Write("写入数据库失败");
            }
            finally
            {
                con.Close();
            }



------解决方案--------------------
在事务提交之前 ,事务中修改的行 都会有个行独占锁、表锁

------解决方案--------------------
Oracle 任何的事务操作 不会阻塞查询。

------解决方案--------------------
oracle和sqlserver事务处理机制不同。
sqlserver中如果一个事务的insert语句还没有提交,另外一个事务试图取max(id)时会被阻塞,因为他默认是读取所有已提交事务,确保了全局一致性。

oracle的话即使有一个事务的insert没有提交,另外一个事务取max(id)时会取那条insert之前的数据库的maxid。
insert提交以后,你取到的那条id已经不是目前数据库的最大id了。多个事务一起读取会产生重复问题。


但你如果只是想insert之后取刚才insert的那个id,这么写是没问题的,这次insert的记录确实是本次事务中的maxid。

------解决方案--------------------
引用:
oracle和sqlserver事务处理机制不同。
sqlserver中如果一个事务的insert语句还没有提交,另外一个事务试图取max(id)时会被阻塞,因为他默认是读取所有已提交事务,确保了全局一致性。

oracle的话即使有一个事务的insert没有提交,另外一个事务取max(id)时会取那条insert之前的数据库的maxid。
insert提交以后,你取到的那条id已经不是目……

+1
------解决方案--------------------
引用:
引用:oracle和sqlserver事务处理机制不同。
sqlserver中如果一个事务的insert语句还没有提交,另外一个事务试图取max(id)时会被阻塞,因为他默认是读取所有已提交事务,确保了全局一致性。