sql - 锁定数据库

标签 sql database performance relational-database

您好,我正在尝试查看是什么锁定了数据库,并发现了两种类型的锁定。乐观锁定和悲观锁定。我在 Wiki 上找到了一些文章,但我想了解更多!有人可以向我解释一下这些锁定吗?我们应该只在需要独占访问某些东西时才使用锁定吗?只有当我们使用事务时才会发生锁定? 提前致谢。

凯文

最佳答案

乐观锁定根本就不是锁定。

它的工作原理是在您开始进行更改之前记录系统所处的状态,然后继续进行这些更改,假设(乐观地)没有其他人愿意进行冲突的更新。正如您即将自动提交这些更改一样,您将检查其他人是否同时更新了相同的数据。在这种情况下,您的提交会失败。

Subversion 例如使用乐观锁定。当您尝试提交时,您必须处理任何冲突,但在此之前,您可以在工作副本上执行任何您想要的操作。

悲观锁与真实锁一起使用。假设会出现争用,您可以在接触之前锁定要更新的所有内容。其他人都必须等待您提交或回滚。

当使用支持事务的关系数据库时,数据库通常会在内部处理锁定(例如当您发出 UPDATE 语句时),因此对于正常的在线处理,您不需要自己处理这个问题。仅当您想要进行维护工作或大批量工作时,您有时才需要锁定表。

We should only use locking when we need exclusive access to something?

您需要它来防止其他 session 的操作冲突。一般来说,这意味着更新。读取数据通常可以并发进行。

Locking only happens when we use transaction?

是的。您将在进行交易时积累锁,并在交易结束时释放所有锁。请注意,自动提交模式下的单个 SQL 命令本身仍然是一个事务。

关于sql - 锁定数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5255159/

相关文章:

java - 调用 @PostPersist 时数据未保存在数据库中

mysql - 有没有办法将规范化数据选回一个结果集中

java - Java中方便快捷的3D vector 数学

php - SQL试图根据年龄列中的年龄组创建排名列

sql - 右外连接没有得到相同的结果不知道为什么 (=*)

mysql - 左连接不起作用

c# - 自动优化 Windows 窗体 InitializeComponent 的性能

mysql - 删除文件排序以改进mysql查询

java - Teradata JDBC 创建 volatile 表错误 3585

mysql - mysql 多表连接优化