问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

简述脏数据的产生原因及解决办法

发布网友 发布时间:2022-05-01 06:13

我来回答

3个回答

懂视网 时间:2022-05-01 10:34

/** 2 * 根据表名生成该表的序列 3 * @param tableName 4 * @return 返回生成的序列 5 */ 6 //全局方法 -加锁 7 //public static synchronized int generate(String tableName) { 8 //局部成员方法-加锁 9 //public synchronized int generate(String tableName) { 10 //synchronized(this) { 11 public static int generate(String tableName) { 12 //使用数据库的悲观锁for update 13 String sql = "select value from t_table_id where table_name=? for update"; 14 Connection conn = null; 15 PreparedStatement pstmt = null; 16 ResultSet rs = null; 17 int value = 0; 18 try { 19 conn = DbUtil.getConnection(); 20 //开始事务 21 DbUtil.beginTransaction(conn); 22 pstmt = conn.prepareStatement(sql); 23 pstmt.setString(1, tableName); 24 rs = pstmt.executeQuery(); 25 if (!rs.next()) { 26 throw new RuntimeException(); 27 } 28 value = rs.getInt("value"); 29 value++; //自加 30 modifyValueField(conn, tableName, value); 31 //提交事务 32 DbUtil.commitTransaction(conn); 33 }catch(Exception e) { 34 e.printStackTrace(); 35 //回滚事务 36 DbUtil.rollbackTransaction(conn); 37 throw new RuntimeException(); 38 }finally { 39 DbUtil.close(rs); 40 DbUtil.close(pstmt); 41 DbUtil.resetConnection(conn); //重置Connection的状态 42 DbUtil.close(conn); 43 } 44 return value; 45 }

 

总结:不断提高自己编程效率!

【DRP】【SQL】-悲观锁-防止多用户同时操作时出现脏数据

标签:

热心网友 时间:2022-05-01 07:42

数据库锁的产生原因及解决办法
数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。
死锁的第一种情况
一个用户A 访问表A(锁住了表A),然后又访问表B;另一个用户B 访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B才能继续,同样用户B要等用户A释放表A才能继续,这就死锁就产生了。
解决方法:
这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。仔细分析程序的逻辑,对于数据库的多表操作时,尽量按照相同的顺序进 行处理,尽量避免同时锁定两个资源,如操作A和B两张表时,总是按先A后B的顺序处理, 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。
死锁的第二种情况
用户A查询一条纪录,然后修改该条纪录;这时用户B修改该条纪录,这时用户A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A 有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。这种死锁比较隐蔽,但在稍大点的项 目中经常发生。如在某项目中,页面上的按钮点击后,没有使按钮立刻失效,使得用户会多次快速点击同一按钮,这样同一段代码对数据库同一条记录进行多次操 作,很容易就出现这种死锁的情况。
解决方法:
1、对于按钮等控件,点击后使其立刻失效,不让用户重复点击,避免对同时对同一条记录操作。
2、使用乐观锁进行控制。乐观锁大多是基于数据版本(Version)记录机制实现。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是 通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数 据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。乐观锁机制避免了长事务中的数据 库加锁开销(用户A和用户B操作过程中,都没有对数据库数据加锁),大大提升了大并发量下的系统整体性能表现。Hibernate 在其数据访问引擎中内置了乐观锁实现。需要注意的是,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户更新操作不受我们系统的控制,因此可能会造 成脏数据被更新到数据库中。
3、使用悲观锁进行控制。悲观锁大多数情况下依靠数据库的锁机制实现,如Oracle的Select … for update语句,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。如一个金融系统, 当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户账户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读 出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对成百上千个并发,这 样的情况将导致灾难性的后果。所以,采用悲观锁进行控制时一定要考虑清楚。
死锁的第三种情况
如果在事务中执行了一条不满足条件的update语句,则执行全表扫描,把行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。类似的情 况还有当表中的数据量非常庞大而索引建的过少或不合适的时候,使得经常发生全表扫描,最终应用系统会越来越慢,最终发生阻塞或死锁。
解决方法:
SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。
5.小结
总体上来说,产生内存溢出与锁表都是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。有的人认为先把功能实现,有BUG时再在测试阶段进 行修正,这种想法是错误的。正如一件产品的质量是在生产制造的过程中决定的,而不是质量检测时决定的,软件的质量在设计与编码阶段就已经决定了,测试只是 对软件质量的一个验证,因为测试不可能找出软件中所有的BUG。

热心网友 时间:2022-05-01 09:00

脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
月经不尽褐色的是怎么回事 月经前后有褐色分泌物是什么原因 二十四节气的重要意义24节气在生活中的作用 你来我往,猜一个数字? 姓谭女孩起什么名字最优雅 男孩姓谭的好名字 黄家驹在beyond的地位 黄家驹是Beyond的主唱吗? 老板对员工的新年微信 每次感冒和一些小毛病,我都是选择运动出身汗,让它自然好,请问这种方 ... 为什么你的孩子总是说话不算数 孩子说话不算数,看电视,玩手机,就是不学习怎么办 孩子说话不算数怎么教育? 孩子上幼儿园中班,老是说话不算数,该怎么办? 抓住哪几点可以解决孩子说话不算数的问题? 孩子说话不算数,知难而退 怎么办 如何应对孩子说话不算数? 儿子今年7岁了,说话不算数,怎么办 说话不算数的孩子,怎么应对? 对于小孩说话不算数,该怎么办 昆仑银行存大额安全吗 有些孩子经常说话不算数,有人认为孩子年纪小不懂事长大了自然就懂了你同意这样的观点吗请阐明你的观点 怎么注销昆仑银行系统里报名的档案的信息? 说话不算数的原因是什么? 我儿子经常说话不算数怎么调教好? 孩子总是说话不算数,面对这种问题,家长该怎么做呢? 昆仑银行卡有管理费吗 我都没有昆仑银行卡,为什么还总有微信提醒进账 没在昆仑银行借过网贷为什么发短信叫我还款? 昆仑银行卡刚刚支出钱为什么没有短信提示了? 墙布橘子皮问题什么原因 怎么解决? 不同材质的墙纸铺贴有哪些问题需要注意 常见墙纸维修问题有哪些 镜子用泡沫胶粘在瓷砖上怎么摘,想挂低点的,可是粘得太牢固了,怎么摘下来!!! 泡沫胶和玻璃胶粘的大镜子怎么拆? 木门上的镜子怎么拆下来。 我有瓶茅台没开,可以盒子里有酒味是跑酒了吗? 茅台酒瓶口有酒味正常吗 茅台瓶口有酒味是漏酒吗? 茅台没开瓶有酒味 我在茅台商城买的飞天茅台,打开盒子后有轻微的酒味,正常吗? 酒外面的包装还没打开,就能闻到酒香了,这个正常么? 从歌德盈香买了一瓶2000年的茅台老酒,瓶口处有酒味,正常吗? 15年茅台确定没拆开过但是打开盒子有酒味。感觉像是漏了。确定也是真酒。这到底怎么回事。? 为什么茅台不开瓶味特别大 瓶口闻到酒味的茅台还能买吗 从水里捞上来一瓶茅台 没有开就有酒香 非常香 半米外都可以闻到 是真的吗??? 茅台瓶盖处有酒味正常吗 没开包装的茅台酒有味 30年茅台跑度有点酒味