事务的问题
假如我执行了begin tran,但不执行commit或rollback,对服务器有没有影响? 问题点数:100、回复次数:18Top
1 楼pbsql(风云)回复于 2004-11-01 11:55:01 得分 1
那就是资源一直被占用着,并且别的相关访问也要一直等到该事务commit或rollback为止Top
2 楼kendison(loving Ayumi!!!)回复于 2004-11-01 12:05:55 得分 0
这个begin tran是在外部程序调用的,用事件查看器查看程序执行完后会显示audit logout,audit logout之后是否会把这个tran自动释放?Top
3 楼netcoder(朱二)回复于 2004-11-01 12:32:58 得分 1
这问题有意思,以前还没有想过呢
去试试看Top
4 楼liweiswin(▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲)回复于 2004-11-01 13:57:50 得分 1
那样的话begin tran后面的语句起不到预期的目的,因为你并没有提交事务Top
5 楼zjcxc(邹建)回复于 2004-11-01 14:02:02 得分 1
看你的begin tran后面跟了什么内容Top
6 楼hdhai9451(☆新人类☆)回复于 2004-11-01 14:02:14 得分 1
//begin tran,但不执行commit或rollback
運行時會產生語法錯誤。begin tran后面至少要帶commit或rollback的其中一個Top
7 楼heibai520(Crazy Java)回复于 2004-11-01 14:02:19 得分 1
是一直都是占的内存的!
一直到提交OR回滚!而你所执行的操作是没有效的!Top
8 楼heibai520(Crazy Java)回复于 2004-11-01 14:02:27 得分 1
是一直都是占的内存的!
一直到提交OR回滚!而你所执行的操作是没有效的!Top
9 楼zjcxc(邹建)回复于 2004-11-01 14:03:13 得分 1
如果没有任何内容,则只会有一个挂起的事务,不会有影响Top
10 楼kendison(loving Ayumi!!!)回复于 2004-11-01 15:10:21 得分 0
这个挂起的事务假如没有命名的话,可以找出来吗?我用sp_who查看过,没有该连接的任何信息,是否意味着它没有占用服务器资源?
我的语句是这样的
begin tran
insert into xx(zz) values('zz')
.
.
.
几十句,其中有一句insert插入了重复值,因为我用php的,错误处理机制后就不执行下面的操作了,所以出现了我说的这种情况Top
11 楼zjcxc(邹建)回复于 2004-11-01 15:20:04 得分 1
这样会导致 xx 这个表被锁住,你用 select * from xx 就会立即有反应了.Top
12 楼kendison(loving Ayumi!!!)回复于 2004-11-01 15:31:17 得分 0
select * from xx 是正常的Top
13 楼zjcxc(邹建)回复于 2004-11-01 15:36:17 得分 1
不可能吧? 应该你的事务已经提交或者回滚了(处理程序退出的话,如果有未提交的事务,SQL会自动回滚事务),否则不可能可以执行下去的
不信的话,楼主在查询分析器中做如下测试:
--查询分析器开一个窗口,执行下面的语句:
create table xx(a int)
go
begin tran
insert xx values(100)
--再开一个窗口(注意这个不能和上面的在同一窗口中执行),执行下面的语句:
select * from xx
--则这个执行会挂起Top
14 楼kendison(loving Ayumi!!!)回复于 2004-11-01 16:18:55 得分 0
哦,我先试试:PTop
15 楼kendison(loving Ayumi!!!)回复于 2004-11-01 16:27:21 得分 0
在查询分析器里开两个窗口
第一个窗口:
begin tran
insert into Pub_User(sName) values('hoho')
第二个窗口:
select * from Pub_User
这样执行确实出现你说的死锁情况
当我用php程序执行
begin tran
insert into Pub_User(sName) values('hoho')
后,在查询分析器执行
select * from Pub_User
不会出现死锁情况,以下是我在事件跟踪器里跟踪到的结果,php我是用sa1用户登录的,查询分析器我是用sa用户登录的
1. SQL:BatchCompleted insert into Pub_User(sName1) values('haha') PHP 5 SYSTEM sa1 0 9 0 0 656 55 2004-11-01 16:18:02.030
2. Audit Logout PHP 5 SYSTEM sa1 0 40 0 16 656 55 2004-11-01 16:18:02.013
3. SQL:BatchCompleted select * from Pub_User
SQL 查询分析器 Administrator Administrator 0 2 0 0 3336 53 2004-11-01 16:18:06.233
是否用select查询不死锁就说明了该事条已被释放呢?Top
16 楼kendison(loving Ayumi!!!)回复于 2004-11-01 16:29:49 得分 0
跟踪的结果是下面这个才对,我复制少了两行
1.SQL:BatchCompleted begin tran PHP 5 SYSTEM sa1 0 0 0 0 656 55 2004-11-01 16:18:02.030
2.SQL:BatchCompleted insert into Pub_User(sName) values('haha') PHP 5 SYSTEM sa1 0 2 0 0 656 55 2004-11-01 16:18:02.030
3.SQL:BatchCompleted insert into Pub_User(sName1) values('haha') PHP 5 SYSTEM sa1 0 9 0 0 656 55 2004-11-01 16:18:02.030
4.Audit Logout PHP 5 SYSTEM sa1 0 40 0 16 656 55 2004-11-01 16:18:02.013
5.SQL:BatchCompleted select * from Pub_User
SQL 查询分析器 Administrator Administrator 0 2 0 0 3336 53 2004-11-01 16:18:06.233 Top
17 楼zjcxc(邹建)回复于 2004-11-01 16:46:42 得分 90
4.Audit Logout --注意到这个了吗? 你的PHP处理已经退出了,这时SQL已经自动回滚了事务(因为你的事务没有提交),所以不会锁后面的表,因为根本没有挂起的事务.Top
18 楼kendison(loving Ayumi!!!)回复于 2004-11-01 16:50:50 得分 0
哦,thanks,我也再看了一下sp_lock,果然锁被释放了,yes!!原来这个不用写程序来处理,谢谢大家了Top




