最新看《innodb 引擎内幕》,作者有介绍丢失更新的问题,这里记录自己的想法和方案

-------------------------------------------------------------------

问题描述:

mysql 数据库丢失更新的定义:(其实在数据库角度都不会产生丢失更新的问题,问题的源头应用程序逻辑更新的问题)

1. 事务1 查询一行数据放在本地缓存,并且显示给用户user1        -->select balance from account where user= 'a' ;

2. 事务2 查询同样的一行数据放在本地缓存,并且显示给用户user2    -->select balance from account where user= 'a' ;

3. 用户user1修改这条数据,并且更新提交数据库     --> update account set balance = balance -100 where user= 'a' ;

4. 用户user2修改显示的数据,并且更新提交数据库  --> update account set balance = balance -800 where user= 'a' ;

显然上面user1 更新的数据丢失了,这也是更新覆盖,比如用户转账的操作。a 账户总共1000,事务1和事务2查询账户都是1000,然后事务1账户扣减100,提交。事务2扣减800提交。这时候账户余额为200,事务1扣减的100 会不翼而飞,这会导致严重的问题。

-------------------------------------------------------------------

暂时想到两种解决办法:

解决办法1:使用悲观锁

1)读取锁定 --> select balance from account where user= 'a'  for update

2)更新 --> update account set balance = balance -100 where user= 'a'

解决办法2: 使用乐观锁

1)表增加字段 jpa_version int 版本号  -->  select balance,version from account where user= 'a'

2)  使用版本号更新 --> update account set balance = balance -100 where user= 'a' and jpa_version = ${version}

总结:

对于账户交易建议直接使用悲观,数据库的性能很高,并发度不是很高的场景两者性能没有太大差别。如果是交易减库存的操作可以考虑乐观锁,保证并发度。

mysql解决丢失更新_mysql 数据丢失更新的解决方法相关推荐

  1. mysql锁表查询_Mysql upate 更新锁表还是锁行测试

    mysql 学习 主题: -- 查询是否自动提交事务select @@autocommit;--关闭自动提交事务set autocommit = 0;--开启--执行--结束 事务start tran ...

  2. mysql重启后自动关闭_mysql服务自动关闭的解决

    笔记本上设置成合上板子不休眠,于是干脆把笔记本放在书包里面,通过远程桌面连接笔记本电脑,经过了很长的时间,再去连接数据库,结果出现cann't connect 10061错误,发现原来是MySQL服务 ...

  3. mysql proxy性能差_mysql性能的检查和优化方法

    mysql在遇到严重性能问题时,一般都有这么几种可能: 1.索引没有建好; 2.sql写法过于复杂; 3.配置错误; 4.机器实在负荷不了; 1.索引没有建好 如果看到mysql消耗的cpu很大,可以 ...

  4. mysql binlog php处理_MySQL数据的binlog处理方法

    最近磁盘增长的非常快,发现binlog日志占用很大的磁盘资源.我们采用手动清理,后面设置一下自动清理. 最近磁盘增长的非常快,发现binlog日志占用很大的磁盘资源.我们采用手动清理,,后面设置一下自 ...

  5. mysql批量条件字段_mysql批量更新多条记录的同一个字段为不同值的方法

    首先mysql更新数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 也可以这 ...

  6. mysql 数据库 更新_mysql数据库更新

    在使用mysql数据库的时候,A方使用一个版本,B方在使用一个版本数据库进行开发使用,B方在开发的时候,有新的需求,需要添加表字段和所需要的表.但是A方已经在使用之前的版本数据库并且数据库里面有真实的 ...

  7. mysql丢失数据_MySQL数据丢失问题

    这两天遇到mysql宕机的问题,导致数据出现不一致的现象,结果发现有个特别重要的参数innodb_flush_log_at_trx_commit特别需要关注,默认情况下这个参数是1,即严格保证数据库的 ...

  8. mysql update 批量更新_mysql 批量更新的两种方法

    本文介绍两种批量更新数据方法 数据准备 create table account ( id int auto_increment primary key, balance int not null ) ...

  9. 连接mysql报2059错_MySQL连接2059错误解决方法

    开始学MySQL,结果安装完SQLyog后连接不了,总是弹出提示2059错误.在网上查找了一下才发现原因,MySQL8.0.11版本启用了新特性,用户登录加密规则改为了caching_sha2_pas ...

最新文章

  1. ❤️Spark的关键技术回顾,持续更新!【推荐收藏加关注】❤️
  2. 绿色信托任重道远 应建立补偿机制?
  3. 徐科:做IC不外乎PPA,但需要成百上千的专家合作 投入数千万
  4. InstallShield 购买价格、教程培训、销售服务——中国独家总代Xlsoft China
  5. Web框架——Flask系列之综合案例——图书管理系统(十)
  6. postek二次开发_20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK...
  7. OpenSSL:openssl-xxx.tar.gz
  8. 10分钟学会数据库压力测试
  9. 基于php mysql技术_基于PHP和MySQL技术的网络教学平台构建
  10. 北京2018网络赛 hihocoder#1828 : Saving Tang Monk II (BFS + DP +多开一维)
  11. TechNet Magazine/TechNet杂志
  12. Cartographer 安装 2021.10.27
  13. 杭州电子科技大学操作系统课程设计:简单文件系统的实现
  14. 祝贺MindV进入香港国际软件大奖赛100强
  15. 伺服驱动器cn1引脚定义_关于三菱驱动器CN1端口的接线-专业自动化论坛-中国工控网论坛...
  16. python定位地理位置_python 实现ip定位地址
  17. 怎么在线把QLV格式转成MP4
  18. UART write过程分析
  19. 高等教育学:教育目的与教育制度
  20. Xubuntu Linux发行版放弃即时消息软件Pidgin

热门文章

  1. 你需要了解的 C++ 17 Top 19 新特性(附精彩评论)
  2. 高并发的epoll+线程池,epoll在线程池内
  3. additive tree
  4. Mysql 的 聚簇索引和二级索引
  5. python基础教程【目录】
  6. Python字符串基础操作
  7. Html中的次方符号怎么写
  8. 《《python基础》》
  9. 微软Office Online服务安装部署及wopi代码实现--------Office Online服务器的安装
  10. 大环境下瑟瑟发抖辞职的第二天,拿了两个 offer