当我在 java 中使用 connection.setAutoCommit(false) 时,在 MySQL 上设置了啥样的锁?
Posted
技术标签:
【中文标题】当我在 java 中使用 connection.setAutoCommit(false) 时,在 MySQL 上设置了啥样的锁?【英文标题】:What kind of lock on MySQL is set when I use connection.setAutoCommit(false) in java?当我在 java 中使用 connection.setAutoCommit(false) 时,在 MySQL 上设置了什么样的锁? 【发布时间】:2013-12-27 12:47:32 【问题描述】:假设我有以下代码。
try
connection.setAutoCommit(false) ;
....
....
connection.commit();
catch (Exception e)
上述事务是否在try语句中的代码中引用的mysql表上获取锁?如果有,这些是什么锁?这些是读锁还是写锁? 另外,它是对表进行行级锁定还是完全锁定?
【问题讨论】:
***.com/questions/3160756/… 【参考方案1】:JDBC 中有两种可用的锁定。
-
乐观锁定
悲观锁定
悲观锁定在选择要更新的行后立即锁定记录。
乐观锁定仅在更新发生时锁定记录。
但connection.setAutoCommit(false);
表示您正在此连接上启动事务。您将在此连接中对数据库表所做的所有更改都将在提交时保存或在回滚时恢复(或断开连接而不提交)。这并不意味着您锁定了整个数据库。其他用户在尝试访问您的事务使用的表时是否会被锁定,这取决于您的事务正在执行的操作和事务隔离级别。
【讨论】:
假设我正在从该事务中的一个表中进行选择查询,并且其他一些用户尝试更新同一个表。它会阻止用户尝试更新表吗?以上是关于当我在 java 中使用 connection.setAutoCommit(false) 时,在 MySQL 上设置了啥样的锁?的主要内容,如果未能解决你的问题,请参考以下文章
当我在 Eclipse 中运行 hadoop 作业时出现异常
当我在 pyspark EMR 5.x 中运行用 Java 编写的 hive UDF 时出错
当我在数据库Java Derby中插入新数据时生成的ID错误
当我在 Hybris 中本地化枚举类型时,如何解决 java.lang.IllegalStateException?
在java中的synchronized方法或块中使用静态成员
当我在 NetBeans 中运行我的客户端项目时,访问被拒绝(“java.net.SocketPermission”错误发生