多线程并发同一个表问题(li)
现有数据库开发过程中对事务的控制、事务锁、行锁、表锁的发现缺乏必要的方法和手段,通过以下手段可以丰富我们处理开发过程中处理锁问题的方法。For Update和For Update of使用户能够锁定指定表或表的数据行这个功能在实际应用中具有很重要的意义,特别对于多用户多线程处理中如要先获取数据通过判断在去更新数据(这中间不允许数据发生变化)的时候这个SQL功能是唯一最佳的选择。
此外,为了解决因为For Update而引起的死锁问题,Oracle提供了select...[for update [of tab.col]] [nowait]功能,这个功能使得在执行select...for update前先检查所申请的行、表资源是否可用,如果可用则加写锁,否则直接返回Ora-54错误。这个功能也用很好的应用价值,在多线程中判断资源的可用性方面将发挥作用。
| Table | For Update | For Update of A.Id |
| A | 1.有where条件时,锁定条件中指定的数据行(行级封锁); 2.无where条件是,锁定表A(表级封锁)。 |
1.有where条件时,锁定条件中指定的数据行(行级封锁); 2.无where条件是,锁定表A(表级封锁)。 |
| A,B | 直接封锁A,B表(表级封锁) | 1.有where条件时,封锁where条件中满足条件的A表的数据行(行级封锁),B表不锁定; 2.无where条件是,锁定A表(表级锁),B表不锁定。 |
通过对比发现,发现对于单表来说For Update和For Update of效果一样,只有在多表查询时产生差异,这个差异在于For Update of使用户能够锁定多表中的指定表或表的数据行。
以代码为例:背景:有4台线上任务服务器,处理同一个表中的数据,为了避免引起数据读写混乱,采用了for update的方式来加锁。
@SuppressWarnings("unchecked")
public List<BizExpressDailyDO> fetchSomeBizExpressDaily(final String serverIp, final int some)
throws DataAccessException {
return (List<BizExpressDailyDO>) new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
@SuppressWarnings("rawtypes")
public Object doInTransaction(TransactionStatus status) {
// 取得锁的钥匙
getSqlMapClientTemplate().queryForObject("MS-SELECT-ACTION-LOCK-BY-LOCK-NAME-FOR-UPDATE", "bizexpress");
List<BizExpressDailyDO> bizexpresses = getSqlMapClientTemplate().queryForList(
"MS-FIND-SOME-BIZ-EXPRESS",
Integer.valueOf(some));
Map param = new HashMap();
param.put("serverIp", serverIp);
param.put("some", Integer.valueOf(some));
getSqlMapClientTemplate().update("MS-UPDATE-SOME-BIZ-EXPRESS", param);
return bizexpresses;
}
});
}
上面中的MS-SELECT-ACTION-LOCK-BY-LOCK-NAME-FOR-UPDATE,
<!-- 锁定某个ACTION的纪录 -->
<select id="MS-SELECT-ACTION-LOCK-BY-LOCK-NAME-FOR-UPDATE" parameterClass="java.lang.String">
<![CDATA[
SELECT * FROM ACTION_LOCK WHERE LOCK_NAME = #value# FOR UPDATE
]]>
</select>
通这这段代码对表加锁,这样其它线程当执行到此处时会处于等待状态,直到表锁释放,这样可以限制其它线程访问biz_express_daily表执行下面sql语句。
<!-- 挑选出一些纪录等待更新 -->
<select id="MS-FIND-SOME-BIZ-EXPRESS" resultMap="RM-BIZ-EXPRESS-DAILY">
<![CDATA[
SELECT * FROM BIZ_EXPRESS_DAILY WHERE SERVER_IP = '0.0.0.0' AND ROWNUM < #some#
]]>
</select>
<!-- 更新一些纪录的server_ip -->
<update id="MS-UPDATE-SOME-BIZ-EXPRESS">
<![CDATA[
UPDATE BIZ_EXPRESS_DAILY SET SERVER_IP = #serverIp#, GMT_MODIFIED = SYSDATE WHERE SERVER_IP = '0.0.0.0' AND ROWNUM < #some#
]]>
</update>
从而有效的解决了多线程并发数据库表的问题。
多线程并发同一个表问题(li)的更多相关文章
- 编写Java程序,实现多线程操作同一个实例变量的操作会引发多线程并发的安全问题。
查看本章节 查看作业目录 需求说明: 多线程操作同一个实例变量的操作会引发多线程并发的安全问题.现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操 ...
- Java面试题整理一(侧重多线程并发)
1..是否可以在static环境中访问非static变量? 答:static变量在Java中是属于类的,它在所有的实例中的值是一样的.当类被Java虚拟机载入的时候,会对static变量进行初始化.如 ...
- HashMap多线程并发问题分析
转载: HashMap多线程并发问题分析 并发问题的症状 多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题. ...
- HashMap多线程并发问题分析-正常和异常的rehash1(阿里)
多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多线程的,于是,变 ...
- Java并发编程(03):多线程并发访问,同步控制
本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理 ...
- Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- Java 多线程 | 并发知识问答总结
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- Java多线程-并发容器
Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...
- 用读写锁三句代码解决多线程并发写入文件 z
C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...
随机推荐
- docker4dotnet #2 容器化主机
.NET 猿自从认识了小鲸鱼,感觉功力大增.上篇<docker4dotnet #1 前世今生&世界你好>中给大家介绍了如何在Windows上面配置Docker for Window ...
- HTML5游戏源码 飞翔的字母 可自定义内容
相信大家都玩过飞翔的小鸟吧,当然,可能已经有很多人因为这个游戏砸了不少手机.吼吼. 废话不多说,回到主题,源码如下. 博客园上传空间大小有限制,没法上传了,需要打包源码的朋友们请留言邮箱地址.当然还有 ...
- Linux基础介绍【第五篇】
linux权限位 Linux文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件属主权限.属组权限.其他用户权限. r:read可读权限,对应数字4: w:write可写权限,对应数字 ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
- PHP5.4~7.1新特性总结
http://note.youdao.com/noteshare?id=7273b858fc12873ad092979e4ba173a7&sub=WEB334fdcf50b507ad93549 ...
- C#(或者说.NET/Mono)能做的那些事
不做语言之争,只陈述事实: 1.桌面软件与服务 不仅是在Windows上,有了开源的Mono,在Apple Mac和Linux(如:Ubuntu)上也有C#的施展天地.并且还可以通过mkbundle工 ...
- [译]DbContext API中使用SqlQuery和ExecuteSqlCommand获取存储过程的输入输出参数
水平有限,欢迎指正.原文:http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlqu ...
- 基于Adobe Flash平台的3D页游技术剖析
写在前面 从黑暗之光,佛本是道,大战神的有插件3D页游.再到如今的魔龙之戒. 足以证明,3D无插件正在引领页游技术的潮流. 目前,要做到3D引擎,有以下几个选择. 说到这里,我们发现.这些都不重要. ...
- 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘
本挖掘典型地运用了机器学习技术,例如聚类,分类,关联规则,和预测建模.这些技术揭示潜在内容中的意义和关系.文本发掘应用于诸如竞争情报,生命科学,客户呼声,媒体和出版,法律和税收,法律实施,情感分析和趋 ...
- ABP源码分析三十九:ABP.Hangfire
ABP对HangFire的集成主要是通过实现IBackgroundJobManager接口的HangfireBackgroundJobManager类完成的. HangfireBackgroundJo ...