博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
For Update
阅读量:7039 次
发布时间:2019-06-28

本文共 2257 字,大约阅读时间需要 7 分钟。

hot3.png

心得:

    项目中使用 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]

 

转载于:https://my.oschina.net/heweipo/blog/701515

你可能感兴趣的文章
Linux安装应用程序之rpm和编译安装
查看>>
mysql启动故障
查看>>
我的友情链接
查看>>
mysql服务性能优化—my.cnf配置说明详解(16G内存)
查看>>
用WijmoJS玩转您的Web应用 —— Angular6
查看>>
Mysql、MariaDB 传统主从集群配置
查看>>
Nginx_lua的应用及性能对比
查看>>
容易被忽视的Linux磁盘配额设置
查看>>
nginx后端的服务很多TIME-WAIT
查看>>
SQL Server 日期的加减函数: DATEDIFF DATEADD
查看>>
EtherChannel
查看>>
linux 磁盘分区及常用linux命令
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
dovecot不能够收邮件
查看>>
jQuery最佳实践
查看>>
hadoop shell命令字典详解
查看>>
vim学习
查看>>
Linux_haproxy_acl访问控制(4)v1.0
查看>>
我的26岁
查看>>