文档章节

For Update

learn_more
 learn_more
发布于 2016/06/27 17:51
字数 323
阅读 56
收藏 1

心得:

    项目中使用 for update 来控制业务逻辑,实际上 for update 是不推荐开发中使用的一种锁,原因是非常容易产生死锁。

    还要注意的是锁的级别,因为InnoDB 的锁是建立在索引上,如果你没有使用索引查询数据,那么锁的级别就是表,否则就是索引数据也就是行级锁

    个人觉得,尽量使用数据校验+数据回滚的方式来避免业务上的控制,比如库存数量,我们可以通过最后库存数的大小判断是否需要回滚。

 

日志:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_65]

    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_65]

    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_65]

    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[?:1.8.0_65]

    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.Util.getInstance(Util.java:387) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2090) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1964) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3306) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:463) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3040) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2288) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2681) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) ~[mysql-connector-java-5.1.38.jar:5.1.38]

    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1192) ~[mysql-connector-java-5.1.38.jar:5.1.38]

 

© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 92
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
Pentest Box v2.2更新说明

如果要对Pentest Box更新,你可以使用update命令,以下是update的更新脚本源代码所在位置。 update的更新脚本:https://github.com/pentestbox/scripts/blob/master/update.py 但在更新过程中...

林鸿风采
2016/12/06
0
0
OpenELEC 6.0 Beta 3 发布,嵌入式操作系统

OpenELEC 6.0 Beta 3 发布,主要更新内容如下: update to dvb-firmware-0.0.48 update to kodi-15.0-rc2-0aa930b update to bcm2835-bootloader-47d51d6 update to bcm2835-driver-47d51d6 ......

oschina
2015/07/17
1K
0
OpenELEC 5.0.1 发布,嵌入式操作系统

OpenELEC 5.0.1 发布,此版本现已提供下载。此版本值得关注的特性是从 XBMC 13 (Gotham) 切换到 Kodi 14 (Helix),更多内容请看 OpenELEC 5.0 发行说明。 此版本最主要是平台支持方面的改进:...

oschina
2015/02/03
1K
2
nginx mac 10.10 编译报错

/os/unix -I ../pcre-8.36 -I objs -o objs/src/core/ngx_crypt.o src/core/ngx_crypt.c src/core/ngxcrypt.c:82:5: error: 'MD5Init' is deprecated: first deprecated in OS X 10.7 [-Werr......

guhongzi
2014/10/22
0
0
PB开发境界 多个DW进行update

多个DW进行update //菜鸟代码 dw1.Update() dw2.Update() 初级代码 IF dw1.Update() = 1 And dw2.Update() = 1 THEN COMMIT; ELSE ROLLBACK; END IF 中级代码 IF dw1.Update() = 1 THEN IF ......

CYQ0520
2017/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊我怎么系统学习Linux技能并快速提高的

聊聊我怎么系统学习Linux技能并快速提高的 随着电子信息科技时代的发展,学会使用计算机在我们的生活中成为了必不可少的一项技能。而作为计算机中的三大操作系统之一的Linux更是饱受计算机爱...

linuxCool
32分钟前
2
0
Android/Java 获取一个byte[]的真实编码,用于解决乱码问题

来源地址:https://blog.csdn.net/qq_31384551/article/details/81627840 一个byte数组,byte[] buf,是由一个字符串转换来的,如何判断字符串使用的是什么编码? Mozilla的一个组件提供了相应...

她叫我小渝
41分钟前
6
0
使用spring-retry实现重试机制

我们经常会遇到一些场景,需要重试当前的操作,比如:文件上传失败,重新上传;微信accesstoken获取失败,重新获取等等的场景问题。那么今天就说一种可以实现此种机制的工具包:spring-retr...

哥本哈根的小哥
44分钟前
0
0
kubernetes notes

Error from server (ServerTimeout): error when creating "mysql.yaml": No API token found for service account "default", retry after the token is automatically created and added t......

kut
今天
2
0
代理模式---静态代理

package com.atguigu.java; //接口的应用:代理模式---静态代理。 public class ProxyTest { public static void main(String[] args) { NetWork work = new RealServer(); ProxyServer pro......

architect刘源源
今天
2
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部