说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

大家快来帮帮我啊!为了它我都快死了!

编辑:说三道四文库 发布时间:2018-08-16 02:32
HTML文档下载 WORD文档下载 PDF文档下载
问题是这样的:
现在有几个客户端同时连接一个表,但他们从表里获取的数据各不相同。
当几个客户端同一时刻对表进行修改的时候就出现了问题:有一个用户
能顺利的把操作完成,但其他的就出错了说什么“影响多行”之类的提示
反正就是不能同时进行同一操作(修改)!
有谁知道,就请大家帮帮我!
NO.1
在你的事務提交的時候,有沒有用commit;很重要
select 是共享锁
update ,insert ,delete是独占锁
考虑独占锁的以下事实
1。只有一个事务可以获得一个资源的独占锁
2。事务不能获得有独占锁资源上的共享锁
3。在资源上的所有共享锁释放后,才能获得它上面的独占锁

/**********  加锁   ***************
设table1(A,B,C)
A    B    C
a1   b1   c1
a2   b2   c2
a3   b3   c3

1)排它锁
新建两个连接
在第一个连接中执行以下语句
begin tran
   update table1
   set A='aa'
   where B='b2'
   waitfor delay '00:00:30'  --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
   select * from table1
   where B='b2'   
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

2)共享锁
在第一个连接中执行以下语句
begin tran
   select * from table1 holdlock -holdlock人为加锁
   where B='b2' 
   waitfor delay '00:00:30'  --等待30秒
commit tran

在第二个连接中执行以下语句
begin tran
   select A,C from table1
   where B='b2' 
   update table1
   set A='aa'
   where B='b2'   
commit tran

若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个连接中的共享锁结束后才能执行 即要等待30秒

3)死锁
增设table2(D,E)
D    E
d1   e1
d2   e2
在第一个连接中执行以下语句
begin tran
   update table1
   set A='aa'
   where B='b2' 
   waitfor  delay '00:00:30'
   update table2
   set D='d5'
   where E='e1' 
commit tran
   
在第二个连接中执行以下语句
begin tran
   update table2
   set D='d5'
   where E='e1' 
   waitfor  delay '00:00:10'
   update table1
   set A='aa'
   where B='b2'  
commit tran

同时执行,系统会检测出死锁,并中止进程


--------------------------------------------------------------
SET IMPLICIT_TRANSACTIONS  ON --用户每次必须显式提交或回滚。否则当用户断开连接时,
                              --事务及其所包含的所有数据更改将回滚

SET IMPLICIT_TRANSACTIONS  OFF --自动提交模式。在自动提交模式下,如果各个语句成功
                               --完成则提交。


你的表建了主键吗?加上一个就行了,或者加一个自增列也可以。
你的表中要设置主键.
应为你有两条一模一样的记录,这是由你的表没有主键引起的。


删除重复的,只留一条:

alter table 表 add  newfield int identity(1,1)

delete 表
where newfield not in(
 select min(newfield) from 表 group by 除newfield外的所有字段
                     )

alter table 表 drop column newfield
主鍵﹑和鎖可處理
你的表中有没有主键
在你的事務提交的時候,有沒有用commit
up
放到事务中进行应该没问题啊
主键
学习~~
我的表里有主键
那你更新的时候使用的选择条件中可能每用主键
我要执行的那段代码是大体是这样的!
//打开数据库显示在dbgrid里
adoquery1->close();
adoquery1->sql->clear();
adoquery1->sql->text="select * from cangku where appartment='"+apparment+"'";
adoquery1->open();
//对数据库进行修改操作
adoquery1->close();
adoquery2->close();
adoquery2->sql->clear();
adoquery2->sql->text="select * from cangku where appartment='"+apparment+"'";
adoquery2->open();
adoquery2->first();
while(adoquery2->eof!=true)
{
    adoquery2->edit();
    adoquery2->fielvalue["count"]=
    adoquery2->fielvalue["count"]-adoquery2->fielvalue["lq"];
    adoquery2->post();
}
adoquery2->close();
//从新显示
adoquery1->close();
adoquery1->sql->clear();
adoquery1->sql->text="select * from cangku where appartment='"+apparment+"'";
adoquery1->open();

上面就是我执行的大概代码!
怎么没人来
“影响多行”之类的提示一般是如下原因引起的
1:表中没有主键
2:触发器中更改了主键值
1.建立主键
2.使用事务
3.用独占锁
完成了这个三条,你就不应该有问题了
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘