技术标签: informix delphi exception insert 服务器 数据库
在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突;
据说办法有二:1。打开同时锁定表的记录 2。浦获错误,撤消其中一个用户的修改,但是很少见到具体实现的代码;请大家告诉具体的代码怎么写:
1。打开时如何锁定一条记录?
2。如何扑获更新错误?在delphi中调试时会报“该记录读出后已经被再次修改”,而在运行时如何判定错误为更新冲突?因为更新时其他的错误如输入不合法等也可能报错,如何把更新冲突和其他的分开?
=====================================================================
http://hi.baidu.com/nboy/blog/item/8d61c93d8ab3dec19f3d6288.html
首先,这个问题只有在特殊情况下才算是问题,大多数情况下可以不作考虑。
然后,这是问题很难描述清楚,解决方案有多种,下面提供一种较方便易用的方式
场景(问题)描述如下:
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:2008-10-17 13:45:00
1,A 将姓名“张三”改为“张三1”,然后保存
重点在这里:更新数据时WHERE条件里多一条件:AND LAST_UPDATE = '2008-10-17 13:45:00'
更新成功,此时触发器会将当前时间“2008-10-17 13:46:00”赋值给LAST_UPDATE
2,B 将将年龄“25”改为“30”,然后保存
B更新数据时WHERE条件里也有这个条件:AND LAST_UPDATE = '2008-10-17 13:45:00',但此时LAST_UPDATE的值已经在A修改记录时变成2008-10-17 13:46:00
下面要做的就是给出提示了:喔哟,此信息在你发呆这段时间已被人改过啦,所以你需要返工。
触发器代码如下:
===================================================
CREATE OR REPLACE TRIGGER T_CUSTOMER
BEFORE UPDATE ON T_CUSTOMER
FOR EACH ROW
/*
记录最后修改时间
*/
BEGIN
:NEW.LAST_UPDATE := SYSDATE;
END;
===================================================
如果触发器不熟悉或者只是不喜欢用触发器,完全可以修改记录时同时给LAST_UPDATE字段赋值,以此替代触发器的作用。
----------------------------------------------------------------------------------------------------------------
http://blog.csdn.net/onemetre/archive/2010/11/06/5991658.aspx
【并发操作】多用户并发操作的解决方案
【问题】在以前的系统开发中,经常遇到一个同样问题,就是多个用户同时并发操作一条记录,这次在交易系统开发过程中,又出现了这样问题。比如交易商A提交单子,由审核人员B审核,此时A正在修改单位,B也正在查看这条记录,A先修改保存后B再审核保存,导致B审核通过的记录不是他所看到的。
【分析】仔细考虑问题,大概分析了三个方法, 并确定了一个可行的方案,可能还有不完善的地方,但解决现有问题还是绰绰有余的。
最先想的是在交易业务代码中用lock对修改方法加锁,运行时注入单例,并且对方法加同步锁,保证了业务数据的正确性, 但是效率低下,用户在使用中不方便,背离了系统可以并发操作的原则。
然后考虑使用悲观锁,这次运行时注入原型,并发操作效率提高, 但是,在同步处理数据库表时又造成锁表,这样并发效率依旧很低。
最后考虑乐观锁, 只是一种数据版本校验机制,它不做数据库层次上的锁定,需要在要并发操作的主表中加入一个"VERSION"字段或者“LASTUPDATETIME”,如果研究过oracle的SCN应该有异曲同工之妙,它的原理是这样:运行时注入原型,这时数据表并不锁住,只是每次update或insert时将VERSION更新, 当下次update,insert时,会校验VERSION,如果不一致,此时提示信息已经修改过了,并且在事务控制下rollback,这样,保证了数据的正确性,并且也不影响并发操作的效率。但是出现的问题是:如果A读了数据,未来及更新,B先更新了数据, 那么他将提交不上数据,因为VERSION已经失效,这样就造成了A重新读取数据,重新填写单据信息。 这也是乐观锁一个缺点,可以在更新前临时保存A填写的数据,再在跳转页中加载这些数据,保证了交易商不用麻烦再次输入这些数据,更新成功则清空这些临时数据
【结果】
乐观锁在并发操作问题上,保证了业务效率和数据的正确性,基本可以采用这种方案解决交易中并发问题。
●悲观锁:指在应用程序中显式地为数据资源加锁。悲观锁假定当前事务操
纵数据资源时,肯定还会有其他事务同时访问该数据资源,为了避免当前
事务的操作受到干扰,先锁定资源。尽管悲观锁能够防止丢失更新和不可
重复读这类并发问题,但是它会影响并发性能,因此应该很谨慎地使用悲
观锁。
●乐观锁:乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问
该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用
程序采用版本控制手段来避免可能出现的并发问题。
----------------------------------------------------------------------------
http://blog.163.com/lqc-rabbit/blog/static/7594799320081131113720281/
.Net中的事务处理(多用户同时操作一条信息时是用-并发) [Web Applicaion in C#]这个问题不是C#处理的,而是你调用的存储过程或批查询需要处理的,如果你用C#执行一系列的更新语句的话,你可以使用ADO .NET SqlClient的事务来控制并发时的数据完整性!
SqlConnection conn=new SqlConnection(connectionstr);
SqlTransaction mytran=conn.BeginTransaction();
SqlCommand cmd=new SqlCommand();
cmd.Connection=conn;
cmd.Transaction=mytran;
cmd.CommandText=.....;
int rc=cmd.ExecuteNoQuery();
mytran.Commit();
....
你可以通过错误处理机制来控制事务提交还是会滚...
-------------------------------------------------------------------------------------------- 我在程序中使用一种原始的方法处理需要锁定的内容。文章浏览阅读8.4k次。nacos:1.3.0seata:1.2.0坑:使用docker部署的nacos服务,在seata下载seata1.2.0的压缩包部署到服务器上,在部署seata_server时,使用nacos存seata_server的配置,上传seata的配置的到nacos中,上传步骤略,上传成功后可以在nacos中看到seata的配置:上传配置后,修改seata_server相关配置后,启动seata_server一直报错:the name of service provider for [._the name of service provider for [io.seata.core.store.db.datasourceprovider]
文章浏览阅读6.8k次,点赞3次,收藏55次。UML 对象图、时序图、活动图 、状态图、协作图 、包图、组件图及部署图目录对象图时序图活动图状态图协作图包图组件图部署图对象图对象图是类图的一个实例,用于显示系统执行时的一个可能的快照,即在某一个时间上系统可能出现的样子,对象图用带下划线的对象名称来表示对象.表现对象的特征 对象图展现了多个对象的特征及对象之间的交互时序图对象:时序图中对象使用矩形表示,并且对象名称下有下划线 将对象置于时序图的顶部说明在交互开始时对象就已经存在了。 如_公司和部门的对象图
文章浏览阅读1.4w次,点赞23次,收藏26次。转载自:https://blog.csdn.net/LJFPHP/article/details/78670459一、开始找原因在浏览器输入:http://ip,正常的话,会有页面,welcome to nginx 我这里是浏览器访问失败, 查找原因:1、在服务器上访问Ip执行:curl http://ip 结果:超时,未连接成功查看nginxaccess.log日志,发现日志未滚动,代表本机访问..._ecs nginx 无法访问
文章浏览阅读1.5k次。《Reids 设计与实现》第十六章 集群(下)_为什么不直接向节点广播publish命令
文章浏览阅读1.2k次。Spring的复杂性不是来自于它处理的对象,而是来自于自身,不断演进发展的Spring会带来时间维度上复杂性,比如SpringMVC以前版本的。 @RequestMapping ,到了新版本被下面新注释替代,相当于增加的选项:@GetMappingGetMapping 注解已经默认封装了@RequestMapping(method = RequestMethod.GET)所以,比前文 使用 @RequestMapping(path = “/{city_id}/{user_id}”,method _getmapping 地址不使用requestmapping
文章浏览阅读1.9w次。通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解。如有错误的地方望指正。POP3POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算...
文章浏览阅读3.7k次。1、错误描述2015-09-20 22:30:25 [main] WARN org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attemptorg.springframew_could not resolve placeholder 'tenant.mapping' in value
文章浏览阅读295次。angular从0到1:环境安装及运行angular从0到1:angular结构目录详解_angular项目从零到一
文章浏览阅读3.5k次。一、问题描述 已知一个文本文件(data.txt),其中存有若干数据,存储数据均为整数(不同整数之间以换行符进行的分隔),现要求使用python读取原始数据文件(文件中每行存取一个整数),将其按照升序排序之后再写入文本文件data_asc.txt文件中进行保存并且进行存储。二、代码实现import numpy as np#导入功能模块包import pandas as pdwith open ("C:/Users/lenovo/Desktop/data.txt",'r')..._数据文件data.txt里存储了若干个整型数,完成如下任务 ①读取文件里的数值用数组存
文章浏览阅读7.2k次,点赞13次,收藏58次。一、安装vcpkg 进入安装地址(https://github.com/Microsoft/vcpkg)下载压缩包,如下图所示,然后解压到任意一个文件夹,我直接放入了D盘根目录(D:\vcpkg-master) 然后打开cmd,进入vcpkg 根目录中,我这里就是D:\vcpkg-master,运行 vcpkg 引导程序:bootstrap-vcpkg.bat 然后等待vcpkg安装完..._vs 配置vcpkg pcl
文章浏览阅读1.1k次。K-means(K-均值)由簇中样本的均值代表整个簇,而K-medoids(K-中心点)由处在簇中心区域的某个样本代表整个簇。K-means聚类:基本思想:初始随机给定k个簇中心,按着最近邻原则把待分类样本点分到各个簇中,单后按照平均法重新计算各个簇的质心,从而确定新的簇心,一直迭代,直到簇心的移动小于给定的值,或者达到最大迭代次数。优缺点:优点:1,可扩展性好,算法复杂..._kmeans和kmedoids的区别
文章浏览阅读82次。---恢复内容开始---题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962TruckingTime Limit: 20000/10000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11428Acc...