概述 核心概述 包类的自动扫描(AutoScan) 依赖注入(IoC) 方法拦截(AOP) 记录类属性状态 (PropertyState) 事件服务(Event) 模块(Module) 国际化(I18N) Lang 配置体系概述 配置体系目录结构及配置 示例一:解析XML配置 示例二:解析Properties配置 配置体系模块更多操作 日志概述 日志模块配置 使用示例 JDBC持久化概述及模块配置 数据源(DataSource) 数据实体(Entity) 自动生成实体类(方式一) 自动生成实体类(方式二) 事务(Transaction) 会话(Session) 数据实体操作 结果集(ResultSet) 查询(Query) 存储器(Repository) 高级特性—多表查询及自定义结果集数据处理 高级特性—存储过程调用与结果集数据处理 高级特性—数据库锁操作 插件概述 插件工厂 自定义插件工厂 插件结构 插件的实现及使用 服务概述 服务端(Server)示例 客户端(Client)示例 客户端和服务端对象的使用 验证概述 默认验证器及参数说明 默认国际化资源文件内容 验证框架使用示例 自定义验证器 缓存概述 缓存模块配置 缓存模块使用示例 WebMVC概述 模块初始化及配置说明 控制器(Controller) 控制器参数(Parameter) 环境上下文对象(WebContext) 文件上传(Upload) 视图(View) 验证(Validation) 缓存(Cache) 拦截器(Intercept) Cookies操作 国际化(I18N) 约定模式(Convention Mode) 高级特性—控制器请求处理器 高级特性—异常错误处理器

概述

YMP在线手册

浏览13432
更新时间2022-04-11

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加以控制就可能会造成数据的错误读取和存储,破坏数据库的数据一致性,所以说,加锁是实现数据库并发控制的一个非常重要的技术;

数据库加锁的流程是:当事务在对某个数据对象进行操作前,先向系统发出请求对其加锁,加锁后的事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作;

因此,JDBC模块在数据库查询操作中集成了针对数据库记录锁的控制能力,称之为IDBLocker,以参数的方式使用起来同样的简单!

首先了解一下IDBLocker提供的锁的类型:

  • MySQL:

    IDBLocker.MYSQL:行级锁,只有符合条件的数据被加锁,其它进程等待资源解锁后再进行操作;

  • Oracle:

    IDBLocker.ORACLE:行级锁,只有符合条件的数据被加锁,其它进程等待资源解锁后再进行操作;

    IDBLocker.ORACLE_NOWAIT:行级锁,不进行资源等待,只要发现结果集中有些数据被加锁,立刻返回“ORA-00054错误”;

  • SQL Server:

    IDBLocker.SQLSERVER_NOLOCK:不加锁,在读取或修改数据时不加任何锁;

    IDBLocker.SQLSERVER_HOLDLOCK:保持锁,将此共享锁保持至整个事务结束,而不会在途中释放;

    IDBLocker.SQLSERVER_UPDLOCK:修改锁,能够保证多个进程能同时读取数据但只有该进程能修改数据;

    IDBLocker.SQLSERVER_TABLOCK:表锁,整个表设置共享锁直至该命令结束,保证其他进程只能读取而不能修改数据;

    IDBLocker.SQLSERVER_PAGLOCK:页锁;

    IDBLocker.SQLSERVER_TABLOCKX:排它表锁,将在整个表设置排它锁,能够防止其他进程读取或修改表中的数据;

  • 其它数据库:

    可以通过IDBLocker接口自行实现;

下面通过示例代码展示如何使用锁:

示例代码一:通过EntitySQL对象传递锁参数;

session.find(EntitySQL.create(User.class)
        .field(Fields.create(User.FIELDS.ID, User.FIELDS.USER_NAME).excluded(true))
        .forUpdate(IDBLocker.MYSQL));

示例代码二:通过Select查询对象传递锁参数;

Select _select = Select.create(User.class, "u")
        .field("u", "username").field("ue", "money")
        .where(Where.create(
                Cond.create().eq(User.FIELDS.ID).param("bc19f5645aa9438089c5e9954e5f1ac5")))
        .forUpdate(IDBLocker.MYSQL);

session.find(SQL.create(_select), IResultSetHandler.ARRAY);

示例代码三:基于数据实体对象传递锁参数

//
User _user = new User();
_user.setId("bc19f5645aa9438089c5e9954e5f1ac5");
//
_user.load(IDBLocker.MYSQL);

//
User _user = new User();
_user.setUsername("suninformation");
_user.setPwd(DigestUtils.md5Hex("123456"));
//
IResultSet<User> _users = _user.find(IDBLocker.MYSQL);

注意

请谨慎使用数据库锁机制,尽量避免产生锁表,以免发生死锁情况!

相关视频

更多

免费

php8,我来也
初级php8,我来也

33.5万次学习

收藏

免费

Thinkphp6.0正式版视频教程
中级Thinkphp6.0正式版视频教程

39.2万次学习

收藏

免费

细说PHP第一季
中级细说PHP第一季

30.3万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

64.4万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

40.9万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

63.7万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.1万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

35.8万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

131.8万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载