多个lol新客户端更新失败连接同一套数据,怎样防止同时更新

并发问题。多个客户端同时修改一条数据-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
并发问题。多个客户端同时修改一条数据
来源:互联网 发表时间: 11:46:08 责任编辑:李志喜字体:
为了帮助网友解决“并发问题。多个客户端同时修改一条数据”相关的问题,中国学网通过互联网对“并发问题。多个客户端同时修改一条数据”相关的解决方案进行了整理,用户详细问题包括:如题:客户端1&和&客户端2&同时打开一个表的某行数据就行修改,只能有一个客户端可以成功修改。当客户端1修改成功后,客户端2再次保存&会提示错误&如下:Row&changed&between&retrieve&and&update.No&changes&made&to&database.这个要怎么控制呢?是要客户端1打开要修改的数据后,客户端2再打开同一条记录提示已经打开?还是&客户端1&客户端2&都可以打开。但是在更新的时候&提示&数据已经更新呢?,具体解决方案如下:解决方案1:目前数据窗口本身的控制是最合理的,当数据检索后又被其它人更新了,你再更新就会提示错误,这就是并发处理你也可以允许用户更新,这样数据可能会发生错乱,参考以下内容吧PB中datawindow更新属性&如何控制数据库并发&对于Client/Server方式下的编程,不可避免地有并发操作处理的问题。为了说明问题,举一个不够恰当的例子:如果有两个用户A和B都试图访问同一员工记录并同时要求修改该员工工资时,会有什么情况发生呢?假设该员工的工资为1000元,两台机器修改记录之前读出用户工资均正确。A用户为此员工加本月奖金200元,查询到原来薪水为1000,加上200后变为1200,而此时B用户在不同的机器上扣除此员工的水电费50元,系统将salary字段置为950,显然这种修改是不能接受的,实际的结果应该是1150元。DataWindow是PowerBuilder中一个独特的对象,功能强大,是Sybase的专利技术,它可以方便而快速地处理数据。通过数据窗口,我们无需编写复杂的SQL语句,就可以实现对数据库的读写操作。实际上DataWindow&在更新数据时,会根据用户对&DataWindow&中的数据进行的各种操作自动地转换成&SQL&语句,然后再执行。例如:用户新增了一条记录,也就是脚本执行了InsertRow()&函数,输入数据后保存(调用&Update()&函数),此时&PB会将其自动转换成&SQL&语句,发送到数据库服务器。对于转换后的SQL语句,我们可以在datawindow的sqlpreview事件中,加脚本:MessageBox('SQL语句',sqlsyntax)来查看。这里有一点需要注意,如果数据库连接的binding参数设定为enable,则sqlsyntax返回将不完整,插入一条记录时sqlsyntax呈如下形式:INSERT&INTO&"personnel"&(&"id",&"name",&"birthday",&"technical_post",&"salary",&"notes"&)&VALUES&(&?,&?,&?,&?,&?,&?&)为了正确返回sqlsyntax,需将binding参数设为disabled,&设置方法是在dbprofile对话框中,将transaction标签页的Disable&Bind选项勾上,或者是在personnel.ini文件中DbParm改为:DbParm=Connectstring='DSN=database_server',DisableBind=1则sqlsyntax完整返回如下:INSERT&INTO&"personnel"&(&"id",&"name",&"birthday",&"technical_post",&"salary",&"notes"&)&VALUES&(&100,&'令狐冲',&'',&'工程师',&1000,&'软件开发'&)三、PowerBuilder中的并发控制PowerBuilder中可以通过数据窗口的更新属性(Update&Properties)来实现并发控制。打开&DataWindow&画笔板,点击&Rows-&Update&Properties菜单,进入“Specify&Updatae&Properties”对话框,其中“Where&Clause&for&Update/Delete”组合框中的三个选项就是三种处理数据并发问题的策略。1、选项“Key&Columns”:这种情况是比较更新前后Table的关键字是否发生了变化,即当前数据库中关键字的实际值和最初查询的值做比较,如果没有改变,则可以更新,反之不能更新。如用户A将员工号为100的职员的salary字段值改为1200并保存后,B用户也将员工号为100的职员的salary字段值改为950并点击“存盘”按钮,我们可以看到数据窗口sqlpreview事件中的sqlsyntax返回如:UPDATE&"personnel"&SET&"salary"&=&950&WHERE&"id"&=&100因为关键字id=100没有发生变化,Where条件成立,更新成功,将A用户的修改覆盖,salary值变为950元,员工损失了200元。显然这样没有达到并发控制的目的,未能保证数据的完整性。&2、选项“Key&and&Updateable&Column”:这种情况是比较更新前后Table的关键字和可修改(更新)的列值是否发生了变化,如果没有一项发生改变,更新成功;反之,若数据库中当前值中若任一项与数据窗口最初检索出的值不一致,则更新失败。对于此例,因所有字段都是可修改(更新)的,即检测是否有任一字段变化。同上,当用户A更新完后,B用户点击“存盘”按钮,我们可以看到sqlsyntax返回如:UPDATE&"personnel"&SET&"salary"&=&950&WHERE&"id"&=&100&AND&"name"&=&'令狐冲'&AND&"birthday"&=&''&AND&"technical_post"&=&'工程师'&AND&"salary"&=&1000&AND&"notes"&=&'软件开发'显然,id字段没有改变,而可修
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号15172人阅读
在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突;
据说办法有二:1。打开同时锁定表的记录 2。浦获错误,撤消其中一个用户的修改,但是很少见到具体实现的代码;请大家告诉具体的代码怎么写:
1。打开时如何锁定一条记录?
2。如何扑获更新错误?在delphi中调试时会报“该记录读出后已经被再次修改”,而在运行时如何判定错误为更新冲突?因为更新时其他的错误如输入不合法等也可能报错,如何把更新冲突和其他的分开?
=====================================================================
首先,这个问题只有在特殊情况下才算是问题,大多数情况下可以不作考虑。
然后,这是问题很难描述清楚,解决方案有多种,下面提供一种较方便易用的方式
场景(问题)描述如下:
0,用户A、B同时打开一个页面,页面显示,客户表T_CUSTOMER字段(C_NAME、C_AGE)
姓名:张三,年龄:25
1,A 将姓名“张三”改为“张三1”,然后保存
2,B 将年龄“25”改为“30”,然后保存
这样A的操作就被覆盖了,姓名又变回“张三”了,大家一般怎么处处这种情况?
这里给出一个较易用的解决方案
给表添加一字段:LAST_UPDATE,即最后更新时间
0,用户A、B同时打开一页面,面页显示:
姓名:张三,年龄:25,LAST_UPDATE: 13:45:00
1,A 将姓名“张三”改为“张三1”,然后保存
重点在这里:更新数据时WHERE条件里多一条件:AND LAST_UPDATE = ' 13:45:00'
更新成功,此时触发器会将当前时间“ 13:46:00”赋值给LAST_UPDATE
2,B 将将年龄“25”改为“30”,然后保存
B更新数据时WHERE条件里也有这个条件:AND LAST_UPDATE = ' 13:45:00',但此时LAST_UPDATE的值已经在A修改记录时变成 13:46:00
下面要做的就是给出提示了:喔哟,此信息在你发呆这段时间已被人改过啦,所以你需要返工。
触发器代码如下:
===================================================
CREATE OR REPLACE TRIGGER T_CUSTOMER
BEFORE UPDATE ON T_CUSTOMER
FOR EACH ROW
记录最后修改时间
:NEW.LAST_UPDATE := SYSDATE;
===================================================
如果触发器不熟悉或者只是不喜欢用触发器,完全可以修改记录时同时给LAST_UPDATE字段赋值,以此替代触发器的作用。
----------------------------------------------------------------------------------------------------------------
【并发操作】多用户并发操作的解决方案
【问题】在以前的系统开发中,经常遇到一个同样问题,就是多个用户同时并发操作一条记录,这次在交易系统开发过程中,又出现了这样问题。比如交易商A提交单子,由审核人员B审核,此时A正在修改单位,B也正在查看这条记录,A先修改保存后B再审核保存,导致B审核通过的记录不是他所看到的。
【分析】仔细考虑问题,大概分析了三个方法, 并确定了一个可行的方案,可能还有不完善的地方,但解决现有问题还是绰绰有余的。
最先想的是在交易业务代码中用lock对修改方法加锁,运行时注入单例,并且对方法加同步锁,保证了业务数据的正确性, 但是效率低下,用户在使用中不方便,背离了系统可以并发操作的原则。
然后考虑使用悲观锁,这次运行时注入原型,并发操作效率提高, 但是,在同步处理数据库表时又造成锁表,这样并发效率依旧很低。
最后考虑乐观锁, 只是一种数据版本校验机制,它不做数据库层次上的锁定,需要在要并发操作的主表中加入一个&VERSION&字段或者“LASTUPDATETIME”,如果研究过oracle的SCN应该有异曲同工之妙,它的原理是这样:运行时注入原型,这时数据表并不锁住,只是每次update或insert时将VERSION更新, 当下次update,insert时,会校验VERSION,如果不一致,此时提示信息已经修改过了,并且在事务控制下rollback,这样,保证了数据的正确性,并且也不影响并发操作的效率。但是出现的问题是:如果A读了数据,未来及更新,B先更新了数据,
那么他将提交不上数据,因为VERSION已经失效,这样就造成了A重新读取数据,重新填写单据信息。 这也是乐观锁一个缺点,可以在更新前临时保存A填写的数据,再在跳转页中加载这些数据,保证了交易商不用麻烦再次输入这些数据,更新成功则清空这些临时数据
乐观锁在并发操作问题上,保证了业务效率和数据的正确性,基本可以采用这种方案解决交易中并发问题。
●悲观锁:指在应用程序中显式地为数据资源加锁。悲观锁假定当前事务操
纵数据资源时,肯定还会有其他事务同时访问该数据资源,为了避免当前
事务的操作受到干扰,先锁定资源。尽管悲观锁能够防止丢失更新和不可
重复读这类并发问题,但是它会影响并发性能,因此应该很谨慎地使用悲
●乐观锁:乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问
该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用
程序采用版本控制手段来避免可能出现的并发问题。
----------------------------------------------------------------------------
.Net中的事务处理(多用户同时操作一条信息时是用-并发) [Web Applicaion in C#]
SqlConnection myConnection = new SqlConnection(&Data Source=Initial Catalog=NIntegrated Security=SSPI;&);
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction(); //使用New新生成一个事务
SqlCommand myCommand = new SqlCommand();
myCommand.Transaction = myT
mandText = &Update Address set location='23 rain street' where userid='0001'&;
myCommand.ExecuteNonQuery();
Console.WriteLine(&Record is udated.&);
catch(Exception e)
myTrans.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine(&Sorry, Record can not be updated.&);
myConnection.Close();
需要注意的是,如果使用OleDb类而不是Sqlclient类来定义SQL命令和连接,我们就必须使用OleTransation来定义事务。
数据库系统程序员需要比一般应用软件程序员懂得更多。一般程序员对事务处理的理解不够全面。事务处理的关键是在提交事务或者取消事务时,万一系统崩溃了,数据库在再次启动时,仍然需要保持数据可逻辑一致性。
最简单的事务处理过程如下:
1. 开始一个事务。进入“事务待命”状态。
2. 在“事务待命”状态,记录事务中改变的数据库记录。此改变不能直接改变数据库中的值,必须先用一个顺序的“事务日志”记录在一边。同时,对于要改变的原始记录加锁,让其它用户无法读和写。(考虑银行取款问题,可以发现如果此时两个用户都在对同一帐号取数,然后减去一定金额,在先后写回数据库,银行就亏钱了)。如果记录已经被其它事务加锁,则报错;同一事务中却可以重复加锁。
3. 在“事务待命”,如果用户给出commit transaction命令,则进入“事务拷贝”状态,拷贝所有加锁的记录成备份。
4. 上面3执行完,则进入“事务更新”状态,用“事务日志”中记录一一更新实际的数据库记录。
5. 上面4执行完,则进入“事务结束”状态,释放所有的记录锁,然后抛弃“事务日志”和备份的原数据库记录。
6. 上面5做完后,事务被删除。
但是,最为关键的是,事务系统必须执行以下过程:一但数据库由于软件、硬件问题发生故障,重启动后,一旦有事务没正常删除,则:
7. 如果在“事务待命”、“事务结束”状态,则重新从5中结束事务的动作开始执行。
8. 如果在“事务更新”状态,则重新从4开始更新记录,并继续想下执行。结果,虽然系统崩溃过,但事务仍然能正常提交。
Informix、Oracle、DB2等数据库的实际事务处理流程更复杂,目的是具有更好的抵抗系统错误性质,因为事务保护是业务系统安全稳定的最后一道防线(比用2个CPU、热备份等更重要。因为那些方法对已经混乱错误的数据照样保护,结果经常造成更多问题)。由于事务处理的流程比一般程序想像得复杂,因此可能会感到用起来比较繁琐。但是了解事务在保护数据库方面的良苦用心,就可以更好地设计出更灵活的业务流程。
如果“一个完整的事务可能包括a,b,c,d四个小事务”就比较奇怪。既然是个过程构成一个事务,没必要中间在划分为4个小事务,问为中间任何操作出错都需要整个“回滚”到a之前。在执行完a后用一个if语句判断要不要再执行“b,c,d”就行,end if之后提交事务。
应用中包含的事务应当尽量让它“瞬间”完成,避免在比较忙时造成用户进程的互锁。事务比较频繁的系统,一秒钟有几个用户互锁就可能造成严重问题,因为事务是以一个稳定的频率来的,而服务器上互锁的进程越积越多,几个小时后,可能有上百台机器都死掉了,只能一台一台地重新开机,花费很多时间、金钱,还会被用户骂死!
但是并不是说事务之间就不能有用户交互。可以在用户3分钟还没确认后,就自动报告错误,并且取消事务。不过我从不冒这个险,而是使用下面方法。
将事务拆分成两段,需要非常深入地研究用户业务流程,研究用户在发现业务数据不一致时是如何纠正的,并且继承用户手工操作流程。这样,软件分析的工作量相应加大了。有时,这是必然的,应当说服用户接受这种现象,并且与开发者一起逐步解决。
比如,卖彩票的交易,用户输入彩票号码,此时在POS机打印彩票并且记账。这并不需要在卖彩票时与后台服务器实时联网,只要每隔10分钟上传一次数据就行了。只有这样,才能在现有的硬件和网络条件下使得彩票销售开展起来。如果开发者固守者彩票号码录入、服务器记账、前台打印合并为一个事务的天真想法,其产品一定会在激烈的市场中败阵。
当然,随着硬件、软件、网络的不断变化,如何灵活应用事务的方法会不断变化,没有一定的规矩,关键要看软件的效果。虽然大的事务可能不断拆分成小的事务,中间用业务流程联系起来;同时,合并一些小的事务或者由计算机自动处理业务数据不一致问题,从而给用户提供网络上的“傻瓜相机”一样的易用、稳定的产品仍然是今天最有挑战意义的软件工程目标。
--------------------------------------------------------------------------------------
这个问题不是C#处理的,而是你调用的存储过程或批查询需要处理的,如果你用C#执行一系列的更新语句的话,你可以使用ADO .NET SqlClient的事务来控制并发时的数据完整性!
SqlConnection conn=new SqlConnection(connectionstr);
SqlTransaction mytran=conn.BeginTransaction();
SqlCommand cmd=new SqlCommand();
cmd.Connection=
cmd.Transaction=
<mandText=.....;
int rc=cmd.ExecuteNoQuery();
你可以通过错误处理机制来控制事务提交还是会滚...
--------------------------------------------------------------------------------------------
我在程序中使用一种原始的方法处理需要锁定的内容。
比如我的表中存储有订单的行项目,每次只允许一个用户对行项目进行编辑。
建立“锁定表”,每当用户编辑订单时,在&锁定表&中加入订单号。当加入失败时则说明已有用户在编辑订单,当用户退出订单或锁定时间超过一个阈&#20540;时则删除锁定记录,允许其他用户编辑并锁定订单。
这样处理适合锁定多行的订单类数据,锁定表中可以保存其他附加信息。
还有一种方法在数据库中使用事务。使用事务更新数据库,这样可以保证同一时间只有一个用户可以对行更新。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:81334次
排名:千里之外
原创:19篇
转载:52篇
(2)(1)(1)(1)(4)(41)(1)(2)(18)随笔 - 198&
评论 - 269&
&&&&&&&&&&&
& 最近公司安排我和另一个同事一起完成一个Socket通信服务器,多个Socket通信客户端,具体的是服务器在window系统下c#开发,客户端是在liunx系统下开发,实现交互通讯。Socket通信服务器启动时,Socket将侦听到的Socket连接传给接受Socket,然后由接受Socket完成接受、发送消息,当Socket存在异常时,断开连接。我负责服务器端功能,所以我这里简单说下我服务器的功能:
1、服务器一直监听当前客户端是否有连接
2、动态的保留当前有连接状态的客户端
3、服务器端和客户端进行交互数据
&&&&&& public void StartListenUp()&&&&&&& {&&&&&&&&&&& IPAddress myIP = GetIPAddress();&&&&&&&&&&& IPEndPoint localEndPoint = new IPEndPoint(myIP, _port);&&&&&&&&&&& Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
&&&&&&&&&&& try&&&&&&&&&&& {&&&&&&&&&&&&&&& listener.Bind(localEndPoint);&&&&&&&&&&&&&&& listener.Listen(10);&&&&&&&&&&&&&&& string userIP;
&&&&&&&&&&&&&&& while (true)&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& Socket newClient = listener.Accept();&&&&&&&&&&&&&&&&&&& userIP = ((IPEndPoint)newClient.RemoteEndPoint).Address.ToString();&&&&&&&&&&&&&&&&&&& _transmit_IP.Add(userIP, newClient);&&&&&&&&&&&&&&&&&&&& Thread clientThread = new Thread(new ParameterizedThreadStart(ThreadFun));&&&&&&&&&&&&&&&&&&& clientThread.Start(userIP);&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& catch (Exception e)&&&&&&&&&&& {&&&&&&&&&&&&&&& Console.WriteLine(e.ToString());&&&&&&&&&&& }&&&&&&& }
/// 线程执行体,消息传递给线程执行体的用户名,用以与用户通信&&&&&&& private void ThreadFun(object obj)&&&&&&& {&&&&&&&&&&& //通过转发表得到当前用户套接字&&&&&&&&&&& Socket handler = _transmit_IP[obj] as S
&&&&&&&&& // 业务处理
以上是服务器的主要代码并已经和客户端测试通过
希望大家批评指正。。。
ps:听人劝吃饱饭,查看了微软最新异步通讯的例子调试了下
代码如下:
&public static void StartListening()&&& {&&&&&&& // Data buffer for incoming data.&&&&&&& byte[] bytes = new Byte[1024];
&&&&&&& // Establish the local endpoint for the socket.&&&&&&& // The DNS name of the computer&&&&&&& // running the listener is "".&&&&&&& IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());&&&&&&& IPAddress ipAddress = ipHostInfo.AddressList[0];&&&&&&& IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
&&&&&&& // Create a TCP/IP socket.&&&&&&& Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
&&&&&&& // Bind the socket to the local endpoint and listen for incoming connections.&&&&&&& try&&&&&&& {&&&&&&&&&&& listener.Bind(localEndPoint);&&&&&&&&&&& listener.Listen(100);
&&&&&&&&&&& while (true)&&&&&&&&&&& {&&&&&&&&&&&&&&& // Set the event to nonsignaled state.&&&&&&&&&&&&&&& allDone.Reset();
&&&&&&&&&&&&&&& // Start an asynchronous socket to listen for connections.&&&&&&&&&&&&&&& Console.WriteLine("Waiting for a connection...");&&&&&&&&&&&&&&& listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
&&&&&&&&&&&&&&& // Wait until a connection is made before continuing.&&&&&&&&&&&&&&& allDone.WaitOne();&&&&&&&&&&& }&&&&&&& }&&&&&&& catch (Exception e)&&&&&&& {&&&&&&&&&&& Console.WriteLine(e.ToString());&&&&&&& }&&&&&&& Console.WriteLine("\nPress ENTER to continue...");&&&&&&& Console.Read();&&& }
&&& public static void AcceptCallback(IAsyncResult ar)&&& {&&&&&&& // Signal the main thread to continue.&&&&&&& allDone.Set();
&&&&&&& // Get the socket that handles the client request.&&&&&&& Socket listener = (Socket)ar.AsyncS&&&&&&& Socket handler = listener.EndAccept(ar);
&&&&&&& // Create the state object.&&&&&&& StateObject state = new StateObject();&&&&&&& state.workSocket =&&&&&&& handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);&&& }
&&& public static void ReadCallback(IAsyncResult ar)&&& {&&&&&&& String content = String.E
&&&&&&& // Retrieve the state object and the handler socket from the asynchronous state object.&&&&&&& StateObject state = (StateObject)ar.AsyncS&&&&&&& Socket handler = state.workS
&&&&&&& // Read data from the client socket. &&&&&&& int bytesRead = handler.EndReceive(ar);
&&&&&&& if (bytesRead & 0)&&&&&&& {&&&&&&&&&&& // There& might be more data, so store the data received so far.&&&&&&&&&&& state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
&&&&&&&&&&& // Check for end-of-file tag. If it is not there, read more data.&&&&&&&&&&& content = state.sb.ToString();&&&&&&&&&&& if (content.IndexOf("&EOF&") & -1)&&&&&&&&&&& {&&&&&&&&&&&&&&& // All the data has been read from the client. Display it on the console.&&&&&&&&&&&&&&& Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content);&&&&&&&&&&&&&&& // Echo the data back to the client.&&&&&&&&&&&&&&& Send(handler, content);&&&&&&&&&&& }&&&&&&&&&&& else&&&&&&&&&&& {&&&&&&&&&&&&&&& // Not all data received. Get more.&&&&&&&&&&&&&&& handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);&&&&&&&&&&& }&&&&&&& }&&& }
&&& private static void Send(Socket handler, String data)&&& {&&&&&&& // Convert the string data to byte data using ASCII encoding.&&&&&&& byte[] byteData = Encoding.ASCII.GetBytes(data);
&&&&&&& // Begin sending the data to the remote device.&&&&&&& handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);&&& }
&&& private static void SendCallback(IAsyncResult ar)&&& {&&&&&&& try&&&&&&& {&&&&&&&&&&& // Retrieve the socket from the state object.&&&&&&&&&&& Socket handler = (Socket)ar.AsyncS
&&&&&&&&&&& // Complete sending the data to the remote device.&&&&&&&&&&& int bytesSent = handler.EndSend(ar);&&&&&&&&&&& Console.WriteLine("Sent {0} bytes to client.", bytesSent);
&&&&&&&&&&& handler.Shutdown(SocketShutdown.Both);&&&&&&&&&&& handler.Close();
&&&&&&& }&&&&&&& catch (Exception e)&&&&&&& {&&&&&&&&&&& Console.WriteLine(e.ToString());&&&&&&& }&&& }
阅读(...) 评论()能否在多个连接上同时操作同一张数据表我遇到这样一个问题:在数据库上建立多个连接,所有连接都更新同一张数据库表。其中,不同的连接是在不同的进程或线程中完成的,执行的操作是 INSERT。这样的操作是否行得通?
可以执行,MYSQL会自动加锁控制。
虽然多连接并发insert性能未必高,但确实是可行的。b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库怎么处理?
20longstarry]
b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库怎么处理?
20longstarry]
发布时间: 3:53:08
编辑:www.fx114.net
本篇文章主要介绍了"b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库怎么处理?
20longstarry]",主要涉及到b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库怎么处理?
20longstarry]方面的内容,对于b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库怎么处理?
20longstarry]感兴趣的同学可以参考一下。
b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库内部怎么处理?会不会发生冲突?如果会,在开发中如何避免呢?使用事务控制的,sqlcommand可以有事务,存储过程也可以有事务,都行事务可以吗?
更新是由多个用户执行的。比如,有10个(不一定是10个)不同的用户在不同的客户端可能(仅仅是可能)会同时更新同一记录。
我想这种情况在b/s结构中是非常常见的吧。比如一个网站,访问量非常大,非常有可能在同一时间,很多用户同时更新同一记录。这时候怎么办?
我感觉事务好像很难处理啊?每个请求在服务器而言,应该都是一个独立的小进程啊。看一下关于锁吧。。事务控制,加锁数据库锁定改前&锁定&&改后&解所關注!你要程序控制的话,用timestamp列做一个中间层(数据库连接池),专门用于处理数据库的请求,这会解决很多问题,如数据库的并发访问问题,据说sqlserver并发25个用户以上时就当机了。
这个中间层也负责保证数据库操作的冲突检测,事务机制等等
以上言论纯属个人意愿,仅供参考,发言人不对此言论导至的任何结果负责。楼上兄台,sqlserver啥时候脆弱到这种程度了?呵..
楼主用锁定和事务吧,最好就是写个处理层了。关注中一般使用事务处理
不过并发update的话一般数据库有内部机制来进行操作排队的更新都是瞬间进行的,还能更新多长时间,加上事务就可以了。考试系统??一般事务应该可以处理好了access怎么处理呢?学习最好能给个示例代码。
我想楼主的意思应该是这样的:
有多个人分别打开了同一条记录的修改界面,有的人修改好了提交也成功了,另外一些人还在修改着,等再有人修改好提交时就会把上一个人的数据冲掉,怎么防止后面的人提交?
我想应该有一个原始数据状态,在update的where子句里加上条件判断,如果发现现在数据库中的数据和字段的原始数据不符,则不予提交。
不知有没有实例代码?用事务就行,更新操作时,如果不成功,会回滚的如果两个人同时再操作会发生冲突的
还是先锁再操作
对于事务是保证出错的情况下回滚(对于回滚,我试过,但是事实上,还是执行了错误的操作),并不是锁住它yong&jia&suo&he&shi&wu&chu&li&
zhe&yang&ke&yi&jie&jue只能锁表咯...多个用户在不同的客户端同时更新同一记录时,数据库内部会自动用锁机制使用户不能同时更改相同数据。
事务:将多个数据修改语句组成一个单元,要么都成功,要么都失败。
-------------SQL&Server联机帮助-----------------------------------------------------------
Microsoft&&SQL&Server&#&使用锁定确保事务完整性和数据库一致性。锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据。如果不使用锁定,则数据库中的数据可能在逻辑上不正确,并且对数据的查询可能会产生意想不到的结果。
虽然&SQL&Server&自动强制锁定,但可以通过了解锁定并在应用程序中自定义锁定来设计更有效的应用程序。
&&Microsoft&Corporation。保留所有权利。
------------------------------------------------------------------------------------------
对于&wang_solaris(魔镜)&的说法:
我想楼主的意思应该是这样的:
有多个人分别打开了同一条记录的修改界面,有的人修改好了提交也成功了,另外一些人还在修改着,等再有人修改好提交时就会把上一个人的数据冲掉,怎么防止后面的人提交?
我想应该有一个原始数据状态,在update的where子句里加上条件判断,如果发现现在数据库中的数据和字段的原始数据不符,则不予提交。
---------其实就是脏数据的概念。可以通过设置时间戳列解决。读入数据时,同时读时间戳值,写回时验证时间戳,如果时间戳值改变则更新失败,否则同时更新数据与时间戳值。
&并发处理??
我认为应该用.lock&&&.UnLock
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:

我要回帖

更多关于 lol新版客户端更新 的文章

 

随机推荐