当前位置: 首页 > 面试题库 >

不用锁定表就可以改变表吗?

华善
2023-03-14
问题内容

当在MySQL中执行ALTER
TABLE语句时,整个表在语句期间被锁定(允许并发读取,但禁止并发写入)。如果它是一个大表,则可能会在很长一段时间内阻止INSERT或UPDATE语句。有没有一种方法可以进行“热更改”,例如以在整个过程中仍可更新表的方式添加列?

通常,我对MySQL解决方案感兴趣,但如果MySQL无法做到,我也会对其他RDBMS感兴趣。

要澄清的是,我的目的仅仅是避免在需要额外表列的新功能被投入生产时避免停机。任何数据架构 都会 随着时间
改变,这是事实。我不明白为什么我们应该接受这些变化不可避免地导致停机的原因。那太弱了。


问题答案:

唯一的另一种选择是手动执行许多RDBMS系统要做的…-
创建一个新表

然后,您可以一次复制一个块中的旧表的内容。尽管始终对源表上的任何INSERT / UPDATE /
DELETE都保持谨慎。(可以通过触发器进行管理。尽管这会导致速度变慢,但这不是锁…)

完成后,更改源表的名称,然后更改新表的名称。最好是在交易中。

完成后,重新编译使用该表的所有存储过程等。执行计划可能将不再有效。

编辑:

关于此限制有点差的一些评论。所以我想我应该对它放一个新的角度来说明为什么它是如此…

  • 添加新字段就像在每一行上更改一个字段一样。
  • 字段锁比行锁要难得多,不用管表锁。

  • 您实际上是在更改磁盘的物理结构,每条记录都会移动。

  • 这的确像是对整个表的更新,但影响更大……


 类似资料:
  • 问题内容: 我有一个客户端服务器应用程序,并且在我的服务器中,我正在使用hibernate模式进行数据库处理。现在,我的应用程序需要所有数据库表中的一个简单表,其中仅一个行包含一个字段(这是该行的键)。该表实际上仅包含一个全局编号(从1开始),我在用户每次执行某些操作时都会使用该编号,当他执行此操作时,我需要获取该值并在数据库中递增该值。(表应该只包含一行,并且始终只有一个值) 我正在使用以下代码

  • 我们有一个系统,我们偶尔会得到一个乐观的锁定异常。我们在代码中已经解决了这个问题,但现在我正在查看JPA 2,并看到它有一个用于处理这个问题的注释(@版本) 我们的问题是,一个表上有多个事务,如果表锁已满,则即使未对相同的记录进行更改,也会导致乐观锁定异常。 我们在JBoss 4.2服务器上使用hibernate,数据库可以是MySQL或SQL服务器。 如果改为使用@Version,这会在两个数据

  • 问题内容: 如果我有如下代码: 在开始和提交之间,正在读取的表是否被锁定,并且随后是否会在多用户环境中引起问题,在该环境中,当另一个用户调用上面的相同代码时会发生问题? 如果以上情况有问题,我们是否应始终尝试缩短交易时间?并为此提供便利,而不是在懒惰的关系上调用getter方法,这是否意味着最好使交易简短并为父母的子女手动查找? 问题答案: Hibernate不会做任何事情来显式锁定您从中读取的表

  • 我想使用而不使用。我们有一个与Spring现有的项目,但我有麻烦配置没有。 当我使用@EnableZuulProxy注释时,出现以下错误: 原因:org。springframework。豆。工厂UnsatifiedPendencyException:创建名为“org”的bean时出错。springframework。云netflix。祖尔。ZuulProxyConfiguration”:通过字段“

  • 问题内容: 有没有一种方法可以检测MySQL中的锁定表?我的意思是表被命令锁定。 (请注意,有兴趣检测使用来获取的 命名 锁的读者应改为从get_lock显示显示所有当前锁。) 问题答案: 显示每个表的状态及其锁定。 对于命名锁,请查看显示来自get_lock的所有当前锁