`
lchshu001
  • 浏览: 24571 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

通过数据库给文件加锁

阅读更多
前几天有个应用需要多台服务器同时读取网络上的文件,一个文件只能一台服务器可以读取,首先想到的是 NIO 的文件锁(FileLock),不知道对网络上的文件是否可以加锁,没有测试过。为了通用,想到了用数据锁某条记录的方式来实现。

通过数据库的同步事务(ISOLATION_SERIALIZABLE)来实现。

类似 spring 事务的处理方式,使用 AOP 实现。
实现原理,定义 Dblock注解,让后拦截添加注解的的方法。可以设置锁记录的 ID,或数据库中的查找的某一个字符串。

注解定义:
package cn.pc.ua.util.aop;

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface DbLock {
	public String value() default "";

	public int id() default Integer.MIN_VALUE;
}


拦截器定义
@Pointcut("@annotation(cn.pc.ua.util.aop.DbLock)")//切点
		private void pointCutMethod() {
		}

		@Around("pointCutMethod()")
		public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
			DefaultTransactionDefinition arg0 = new DefaultTransactionDefinition();
			arg0.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
			TransactionStatus ts = txManager.getTransaction(arg0);
			//.....
			Object object = pjp.proceed();
			log.debug("release db lock !");
			txManager.commit(ts);
			//.....
		}


具体代码见附件!
------------------------------

有个大的问题,出错时没有事务回滚。
附件 已经修复!!!
0
0
分享到:
评论

相关推荐

    基于全局目录的集中型数据库分布式加锁仿真.pdf

    根据提供的文件内容,以下是关于“基于全局目录的集中型数据库分布式加锁仿真”的详细知识点: 1. 分布式系统与集中型数据库: - 集中式数据库指的是计算机网络中多个逻辑上相互关联的数据库的集合。它通过中心化...

    多线程文件加锁自动定时查询mysql统计数据

    这个项目或任务的核心是利用多线程技术,通过文件加锁来确保数据一致性,并且定时从MySQL数据库中获取并处理统计数据。下面我们将详细探讨这些知识点。 1. **多线程**: 多线程是指在一个进程中同时执行多个独立的...

    自己制作的来电去电记录程序(数据库存储和密码加锁)

    如果这是一个可执行文件,那么用户可以通过运行这个文件来启动来电去电记录程序。如果它是一个日志文件,那么它可能包含了程序运行过程中的各种事件记录,如用户的操作、错误信息等,这对于开发者调试和优化程序非常...

    [原创]sql server存储过程解密工具

    用户通过运行这个程序来解密和查看存储过程的内容。 5. `1.sql`:可能是一个示例或测试的SQL脚本,用于演示如何使用这个解密工具,或者包含了需要解密的一个特定存储过程。 6. `使用说明.txt`:这个文件提供了工具...

    ORACLE 数据库入门视频

    用户通过会话执行SQL语句和其他数据库操作。 5. **事务(Transaction)** - 事务是一组数据库操作的逻辑单元,比如INSERT、UPDATE、DELETE以及DDL(如CREATE、ALTER、DROP)语句。每个事务必须以COMMIT或ROLLBACK...

    Sql-Server实用操作-数据库一致性检测工具(DBCC).pdf

    9. IndexDefrag:减少目录分裂,但不给文件加锁,以便用户能够继续应用数据库。 10. CheckCatalog:检测特定数据库表及表之间的一致性(后者意味着使用外键等)。 如何使用这些 DBCC 命令?首先,您需要建立一个...

    oracle 12c 数据库 教程

    数据的并发处理通过锁定机制实现,防止数据不一致,包括锁定队列、死锁处理和手动加锁。还原数据管理涵盖还原数据的概念、作用、工作原理和管理策略。数据库审计则包括多种审计类型,如强制审计、标准审计和细粒度...

    数据库2018_数据库复习知识点.docx

    封锁是通过加锁机制防止并发冲突;时间戳根据事务开始时间决定执行顺序;乐观控制法假设冲突少,仅在提交时检查冲突;多版本并发控制通过保存数据的不同版本来允许并发读写。 数据模型是数据库设计的基础,分为概念...

    MySQL数据库备份.doc

    文件备份是数据库可以由硬盘上的许多文件构成,如果这个数据库非常大,并且一个晚上也不能将它备份完,那么可以使用文件备份每晚备份数据库的一部分。 数据库备份可以按照数据库的状态可分为三种:冷备份、热备份和...

    Oracle数据库学习指南

    Oracle2: 1. 《Oracle8 优化技术》摘录 (第一章 安装) 2. 《Oracle8 优化技术》摘录 (第二章 内存-CPU) 3. 《Oracle8 优化技术》摘录 (第三章 输入-...51. 怎样在查询记录时给记录加锁 52. 自动备份Oracle数据库

    ORACLE+数据库入门

    首先,SQL语句被解析并放入共享池,接着数据从数据文件读入数据缓冲区,如果涉及修改,会先加锁,然后将更改记录到重做日志缓冲区,最后将结果返回给用户。 启动和关闭数据库通常通过SVRMGRL工具完成。启动数据库时...

    高级数据库系统习题答案.docx

    数据库系统阶段提供了最高的数据独立性和数据共享能力,通过客户/服务器结构或文件服务器结构实现数据的分布式访问。客户/服务器架构下,数据存储在服务器端,客户端只接收处理后的结果,而文件服务器结构则将数据...

    Oracle数据库入门

    - **启动**:通过`sqlplus / as sysdba`或`svrmgrl`命令行工具,以内部用户身份登录并执行`startup`命令启动实例,再用`ALTER DATABASE OPEN`打开数据库。 - **关闭**:旧版本Oracle使用`shutdown`命令,新版本...

    PHP对文件进行加锁、解锁实例

    - **数据一致性**:在更新数据库前,可以先对备份文件加锁,确保在备份过程中不会有新的数据写入。 - **资源限制**:文件锁还可以用于控制对有限资源的访问,例如限制同时运行的脚本数量。 ### 注意事项 - 文件锁...

    oracle数据库.ppt

    用户发出SQL请求后,Oracle会进行语法分析,将相关信息放入共享池,然后从数据文件中读取数据块到数据缓冲区,执行操作(如果涉及修改,会先加锁并记录到重做日志缓冲区),最后将结果返回给用户。 8. 启动与关闭...

    PHP实现对文件锁进行加锁、解锁操作的方法

    总而言之,PHP通过flock()提供了对文件加锁和解锁的机制,帮助开发者处理多进程环境下对文件的并发写入问题。需要注意的是,flock()实现的是建议性锁定,而非强制性锁定,因此在使用时应考虑各种可能影响数据一致性...

    QT中sqlite多线程操作4个注意问题

    通过独立加载数据库驱动、适当加锁、及时关闭数据库以及合理管理`QsqlQuery`变量的作用域等方式,可以显著提升程序的稳定性和性能。希望本文所述的内容能够帮助正在面临类似问题的开发者们找到合适的解决方案。

    .net数据库操作代码

    从给定的文件信息中,我们可以提取出一系列与.NET框架下的数据库操作相关的知识点,包括但不限于会话管理、URL参数接收、页面重定向、文件上传、数据验证以及数据库连接与操作等核心概念。以下是对这些知识点的详细...

Global site tag (gtag.js) - Google Analytics