懂数据库事务(asp.ne)的高手进!500分等你拿!

大楷意思就是下面(代码只是我想要描述的意思):
Transaction = BRUtility.BeginTransaction();//开始事务

try{
insert into 表1(主键,姓名,年) values(1,'张三',22);

insert into 表2(姓名,成绩) select 表1.姓名,90 from 表1
where 主键=1
BRUtility.Commit(Transaction);
}
catch (Exception e)
{
BRUtility.Rollback(Transaction);
}
上面的代码表示,开始一个事物,目的就是对上面两个操作(1.往表1中增加一条记录,姓名是张三,2.往表2中增加一条记录,姓名是刚刚往表1中增加的姓名)要么都执行,要么都不执行。

问题:在没有提交整个事务之前,第2个操作能否检索到刚刚第1个操作的信息?
如果给出了正确答案和合理解释,加满500分!
兄弟,你稍微等一下,我可能不在同一个事务里面,呵呵,我再试一下,我代码好象是有点错误!
多谢兄弟提醒,如果我实验成功了,马上给你分!
谢谢哈!

你跟踪的时候是同一个事物里面的吗?
如果不是那么看不到是正常的。
只有在commit后,数据库才被真正的更新。
oracle事务处理有保存这个数据在一个临时地方。
---------------------
我这个是标准的sqlserver查询语句
如果有问题
肯定是你代码写的时候什么地方有疏忽
再给你一个小例子
---------------
BEGIN TRANSACTION T1

UPDATE TBL1 SET F1 = 'FT1' WHERE FID = 1

ROLLBACK TRANSACTION T1

BEGIN TRANSACTION T2

UPDATE TBL1 SET F1 = 'FT1' WHERE FID = 1

UPDATE TBL2 SET F1 = ( SELECT F1+ 'NEW' AS F1
FROM TBL1
WHERE TBL1.FID=TBL2.FID
AND TBL1.FIDX = TBL2.FIDX)
FROM TBL2,TBL1
WHERE TBL2.FID = 1

COMMIT TRANSACTION T2

-------------------

给你个小例子
--------------
BEGIN TRANSACTION T1

UPDATE TBL1 SET F1 = 'FT1' WHERE FID = 1

ROLLBACK TRANSACTION T1

BEGIN TRANSACTION T2

UPDATE TBL1 SET F1 = 'FT2' WHERE FID = 1

UPDATE TBL1 SET F1 = F1 + 'NEW' WHERE FID = 1

COMMIT TRANSACTION T2
-----------------------------
同一个事务当中的SQL语句能够相互影响的。
所以你大胆的用好了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-06-26
不会的
我朋友也说不会

√ 不变 19:49:48
大楷意思就是下面(代码只是我想要描述的意思):
Transaction = BRUtility.BeginTransaction();//开始事务

try{
insert into 表1(主键,姓名,年) values(1,'张三',22);

insert into 表2(姓名,成绩) select 表1.姓名,90 from 表1
where 主键=1
BRUtility.Commit(Transaction);
}
catch (Exception e)
{
BRUtility.Rollback(Transaction);
}
上面的代码表示,开始一个事物,目的就是对上面两个操作(1.往表1中增加一条记录,姓名是张三,2.往表2中增加一条记录,姓名是刚刚往表1中增加的姓名)要么都执行,要么都不执行。
√ 不变 19:50:12
象这样的事物
在没有提交整个事务之前,第2个操作能否检索到刚刚第1个操作的信息?
````````` 19:50:15
???
````````````````19:50:22
干吗?
√ 不变 19:51:17
一个事物的两个操作
插入数据
查找数据
如果这个事物没有完成
1会被插入到表中吗
``````````` 19:51:22
不会
√ 不变 19:51:35
哦?
√ 不变 19:52:12

我有空试下
`````````` 19:52:12
在C#里面你用System.Transaction可以确保这个是原子操作
(2007-06-26 19:54:32) ``````````
在SQL里面你必须要设置XACT_ABORT 为ON
(2007-06-26 19:54:51) `````````
否则产生的效果可能不如你所愿
(2007-06-26 19:55:12) √ 不变
什么意思呢?

(2007-06-26 19:55:13) `````````
http://wrfwjn.blog.hexun.com/6107672_d.html
第2个回答  2007-06-26
可以,一般数据库的提交都将操作提交到临时的一个地方,然后在执行commit的时候才真正的提交到数据库的存储中去,通常auto commit是关闭的,所以需要自己输入commit才真正的提交
因为这个样子,你上面说的这个问题可以得到解答,前面的操作把数据放入一个临时的区域,而你引用到的记录也是从这个区域中取得的