暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JunkFood读者说你文章不对,作者被鞭策后,DBA 开始研究JAVA程序锁

AustinDatabases 2024-05-06
199

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2270人左右 1 + 2 + 3 + 4 +5 + 6) 新人奖直接分配到5群,开始建6群。

之前的一篇文章中,关于RC 和 RR 隔离级别的问题,在文章尾部建议在大部分场景下,为了高并发和性能的需求,我们都建议使用RC的数据库隔离级别。这里被读者指出,这样的建议是有问题的,基于这个事情,读者也给我一些建议。这里我也进行了一些研究。

这里首先感谢这位读者,同时在翻看了读者的给出的文章链接后,我也想更加深入,之前的确在不少金融机构工作过,也真的未见这些机构的数据库的隔离级别被强制为RR,同时ORACLE的隔离级别也只能使用RC,所以在这样的情况下,到底金融程序中是如何在使用RC数据库隔离级别的时候,还能避免幻读的。

在程序设计中,程序员口中经常会提到,乐观锁和悲观锁的概念,而程序员和DBA 之间,或者说DBA是否能理解程序设计中带有的乐观锁和悲观锁的概念。

在程序中的悲观锁被使用时,他会认为自己在使用数据的时候会有其他的线程来去使用它的数据或修改数据,所以在他使用数据的时候,会对数据进行加锁的工作,也就是他要修改什么什么程序会对这些数据进行加锁的处理,在JAVA程序中的synchronized 的关键字和 Lock的实现都是悲观锁的形式。

与其对应的是程序中的乐观锁,乐观锁认为自己在使用数据的时候,不会有别的线程来修改数据,对于自己线程使用的数据是不会程序进行加锁的处理,只是在更新数据的时候会去判断之前有没有线程更新数据,如果这个数据没有被更新则当前自己的线程修改数据是成功的,如果不是那么就会报重试或异常。

经过上面的信息的描述,程序本身针对自己的要使用的数据是有相关的数据锁的,

比如程序中的乐观锁实现的方式有如下的方式:

版本号控制
CAS 算法
————————
1 版本号控制:版本号控制是程序中控制要修改数据的一种方式,他会在数据表中加入一列,来存储版本号,来表达数据版本。他会在对数据行操作的时候,读取这个值,当在数据提交时会再次读取这个值,如果这个值和事务开启时的值相同,那么就证明这个数据没有被别的事务修改过,则可以进行提交,否则不能提交,根据业务逻辑是事务失败,或者事务重新初始化,进行再次的工作。

2  CAS 算法 compare and swap (比较与交换),CAS 是一种无锁的方案来实现同样的多线程下安全更新数据,这个方案也叫 Non-blocking Synchronization. 

这个方案主要是在JDK1.5中添加的 JAVA.util.concurrent(J.U.C), 他在实现的原理上是通过对于要改变的数据线读入到内存中,然后将要修改的值再次读入,如果这两个值一致,说明可以进行更新,则直接将值更新为要更新的值,否则失败。这样的方式相对于 JAVA中的 synchronized 的阻塞方式,有了性能的提升和改进。
具体需要参见 CAS原理。

除了上面说的乐观锁,还有刚才提到的synchronized ,这就属于悲观锁的范畴了悲观锁在实现的机制上有ReentrantLock,这是一种重入锁

public class Widget {
    public synchronized void doSomething() {
        System.out.println("方法1执行...");
        doOthers();
    }

    public synchronized void doOthers() {
        System.out.println("方法2执行...");
    }
}



复制

上面的案例中,使用的就是synchronized ,上面有 doSomething 和 doother 两个调用的方法,doSomething方法在调用数据的时候是独占的,如果使用doother()的方式来调用的话,是必须将被doSomething占中资源被是否才可以被重新调用。所以当数据被doSometing方法调用的时候,此时数据是不能被其他的方法锁调用,除非资源被释放。

说到这里,作者已经明晰了两点
1  数据操作中,程序会对数据的安全性进行兜底,通过乐观锁或悲观锁在JAVA 程序中进行实现。
2  乐观锁和悲观锁,也有倾向性,在高并发的环境中,如果乐观锁被大量使用,则会产生一些热点数据更新失败的场景,但如果使用了悲观锁,则在数据操作中,对于数据使用的效率进行了挑战,或者说数据的更新效率低。

以上为DBA 对于数据更新安全,在程序中或者说JAVA 程序中进行兜底或配合 RC数据隔离级别后如何安全更新数据的知识的一个补充学习。

感谢这位读者的反馈,这里读者已经同意公布他的名字, JunkFood

置顶
临时工访谈:无名氏意外到访-- 也祝你好运(管理者PUA DBA现场直播)

往期热门文章:
临时工说:搞数据库 光凭的是技术,那DBA的死多少次?
PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理
MySQL 八怪(高老师)现场解决问题实录
临时工说:经济规律解读ORACLE 工资低   --读 Roger 数据库专栏
PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
临时工访谈:恶意裁员后,一个国产数据库企业程序员的心声
临时工访谈:国产数据库裁员失业中,但我仍然积极乐观的DBA
临时工访谈:45岁IT女领导 失业 后的人生下半部
临时工访谈:TM 这些年 我都培训了什么
临时工说:上云后给 我一个 不裁 DBA的理由
临时工说:腾讯云,阿里云故障  “核爆炸”  后持续的影响
临时工说:三次封禁后的文章--技术文章怎么写,我有罪
PolarDB for PostgreSQL  有意思吗?有意思呀
PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了
临时工说:裁员裁到 DBA 咋办  临时工教你 套路1 2 3
PolarDB  搞那么多复杂磁盘计费的东西,抽筋了吗?
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
MONGODB  ---- Austindatabases  历年文章合集
MYSQL  --Austindatabases 历年文章合集
POSTGRESQL --Austindatabaes 历年文章整理
POLARDB  -- Ausitndatabases 历年的文章集合
PostgreSQL  查询语句开发写不好是必然,不是PG的锅
SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗
MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB  双机热备那篇文章是  “毒”
MongoDB   会丢数据吗?在次补刀MongoDB  双机热备
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB  到底打倒了谁  PPT 分享 (文字版)
PostgreSQL  字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL  Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlSERVER,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。
截止今天发布文章 11301

文章转载自AustinDatabases,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论