AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[transaction](dba)

Martin Hope
myro
Asked: 2022-10-12 03:08:03 +0800 CST

sql-server事务最多应该运行多长时间

  • 0

我们的 Teamcenter(西门子的软件)经常运行数小时甚至数天的交易。就好像他们被遗忘了一样。甚至有 20 多个交易运行时间超过一个小时,甚至 20 小时。它们极大地填充了临时数据库,并且通常不会自行终止(必须被杀死)。我们的 Teamcenter 集成商说没关系,因为有些“翻译”过程需要很长时间。但是让事务运行这么长时间是否正确?

谢谢

sql-server transaction
  • 2 个回答
  • 42 Views
Martin Hope
Leon
Asked: 2022-10-11 03:41:10 +0800 CST

使用 Postgresql 的 psql 的“-c”选项在 CLI 中同时运行“DROP DATABASE”和“CREAT DATABASE”

  • 0

在调试程序时,我需要经常删除一个Postgresql的数据库,然后重新创建它。

为方便起见,我想在单个命令行中执行此操作,如下所示:

psql -c "DROP DATABASE my_db; CREATE DATABASE my_db;"

但我得到一个错误:

错误:DROP DATABASE 不能在事务块内运行

有什么办法可以做到吗?谢谢!

postgresql transaction
  • 1 个回答
  • 26 Views
Martin Hope
s.k
Asked: 2022-09-29 11:53:15 +0800 CST

使用 --single-transaction 时出现 pg_restore 错误:选项 c/--clean 和 -a/--data-only 不能一起使用(即使没有使用 -a 标志)

  • 0

今天尝试恢复自定义转储文件时,我在 Windows server 2019 机器上遇到了一个奇怪的 PostgreSQL ( v.13.8 )。

以下命令有效:

pg_restore -d postgres://postgres@localhost:5432/postgres --no-owner --no-privileges --create --clean --role=<myuser> --if-exists inputfile.backup 2> inputfile.log

但只需将--single-transaction选项添加到命令行,就会引发错误:

pg_restore -d postgres://postgres@localhost:5432/postgres --no-owner --no-privileges --single-transaction --create --clean --role=<myuser> --if-exists inputfile.backup 2> inputfile.log

但我可以在日志文件中阅读:

pg_restore: error : options « -c/--clean » and « -a/--data-only » cannot be used together.

我什至没有使用-a旗帜……这很奇怪,不是吗?
我已经阅读了pg_restore doc,尤其是关于--single-transaction选项的段落,但它并没有说太多,(例如关于潜在的隐式-a标志):

--单笔交易

将还原作为单个事务执行(即将发出的命令包装在 BEGIN/COMMIT 中)。这可确保所有命令都成功完成,或者不应用任何更改。此选项意味着 --exit-on-error。

任何人都可以告诉我使用此选项时到底发生了什么?

postgresql transaction
  • 1 个回答
  • 51 Views
Martin Hope
dotancohen
Asked: 2022-09-15 04:26:13 +0800 CST

调试执行事务的应用程序

  • 0

我有一个要调试的应用程序,它对 MySQL 数据库执行几十个操作。这些操作在单个事务中执行。在特定断点进行调试时,我需要知道数据库的状态。

mysql我可以使用常用的CLI 工具登录 MySQL 服务。我看到正在进行的交易:

mysql> SELECT * FROM information_schema.innodb_trx\G
*************************** 1. row ***************************
                    trx_id: 325090
                 trx_state: RUNNING
               trx_started: 2022-09-14 12:10:32
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 30
       trx_mysql_thread_id: 26
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 10
          trx_lock_structs: 26
     trx_lock_memory_bytes: 1128
           trx_rows_locked: 43
         trx_rows_modified: 4
   trx_concurrency_tickets: 0
       trx_isolation_level: REPEATABLE READ
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
       trx_schedule_weight: NULL
1 row in set (0.01 sec)

现在,如何加入该事务以在事务期间查询数据库的状态?

作为一种解决方法,我可以向应用程序代码添加查询。但是,这需要我在运行应用程序之前知道要运行哪个查询,然后为要运行的每个查询重新编译应用程序。有一个开放的 CLI 来调试会非常有帮助。

该数据库是在 Debian 上运行的 MySQL 8.0。

mysql transaction
  • 1 个回答
  • 25 Views
Martin Hope
GenGG
Asked: 2022-08-11 18:10:54 +0800 CST

Hash之间的并发控制B-Tree

  • 1

我是交易新手。当我阅读“事务信息系统”一书时,提到 B-tree 使用键范围锁定来保证可串行化。这是真的所有对关系的访问都必须通过相同的 B-tree 进行以保证可序列化吗?

如果我理解正确,如果访问是通过不同的索引,则无法保证可序列化。请参阅以下示例。

假设同一个关系上有两个索引,分别是B树和哈希索引,并且有两个事务。

首先,一个事务使用散列索引读取关系,例如,fetchkey(16)使用键获取(当前不存在的)记录16并且找不到匹配项。由于散列没有键范围锁定,它不能锁定下一个键。然后,另一个事务通过 B-tree 插入一条键为 '16' 的记录。插入将成功,导致幻像。

transaction concurrency
  • 2 个回答
  • 28 Views
Martin Hope
Lance
Asked: 2022-08-06 20:23:16 +0800 CST

使用 READ COMMITTED 对并发写入安全的查询,对 SERIALIZABLE 隔离级别也安全?

  • 1

我用一个非常有用的答案问了这个问题:
如何对跨多个表的结构进行唯一性约束?

Erwin Brandstetter 的回答表明了这一点:

WITH ins_string_properties AS (
  INSERT INTO string_properties (source_id, name, value)
  VALUES (gen_random_uuid(), 'slug', 'hello-world')
  ON CONFLICT DO NOTHING  -- to silence unique violation errors
  RETURNING source_id
  )
, ins_objects AS (
  INSERT INTO objects (id, type)
  SELECT o.id, o.type
  FROM   ins_string_properties isp  -- always 0 or 1 rows
  CROSS  JOIN LATERAL (
      VALUES 
        (isp.source_id    , 'baz')
      , (gen_random_uuid(), 'foo')
      , (gen_random_uuid(), 'bar')
      ) o(id, type)
  RETURNING id, type
  )
INSERT INTO object_properties (source_id, name, value_id)
SELECT io1.id, io2.type, io2.id
FROM   ins_objects io1
JOIN   ins_objects io2 ON io1.type = 'foo' AND io2.type = 'bar'
                       OR io1.type = 'bar' AND io2.type = 'baz'
;

我只是在学习 CTE,但答案是:

READ COMMITTED在具有默认事务隔离的并发写入负载下也是安全的。

我将在 CockroachDB 中使用它,他们似乎建议避免READ COMMITTED使用它SERIALIZABLE。

我可以将此查询与. 一起使用吗SERIALIZABLE,或者如果不可以,为什么不 / 必须修改什么以使其与SERIALIZABLE. 这些事务级别对我来说是新的,过去我主要使用 PostgreSQL 和 Ruby on Rails ORM,所以没有深入研究 SQL。只是尝试使用SERIALIZABLECockroachDB 推荐的默认事务隔离级别,并且不确定我是否/何时可以/不能使用它,并且不确定这种情况。

这就是我对READ COMMITTEDvs.的了解SERIALIZABLE。

postgresql transaction
  • 1 个回答
  • 41 Views
Martin Hope
Lance
Asked: 2022-08-02 21:56:29 +0800 CST

如何对跨多个表的结构进行唯一性约束?

  • 1

假设我有一个类似这样的模式系统:

create table objects {
  uuid id;
  string type;
}

create table object_properties {
  uuid id;
  uuid source_id; // the object which has this property
  string name; // the property name
  uuid value_id; // the property value object
}

// ...and tables for each primitive data type
create table string_properties {
  uuid id;
  uuid source_id; // the object which has this property
  string name; // the property name
  string value; // the property value string
}

然后我想创建这个对象:

{
  type: 'foo',
  bar: {
    type: 'bar',
    baz: {
      type: 'baz',
      slug: 'hello-world'
    }
  }
}

那是:

// objects
id  | type
123 | foo
234 | bar
345 | baz

// object_properties
source_id   | name  | value_id
123         | bar   | 234
234         | baz   | 345

// string_properties
source_id   | name  | value
345         | slug  | hello-world

slug: hello-world如果以结尾的树不存在,我只想创建这个“对象树” 。我怎样才能做到最好?我可以很容易地做到这一点,首先进行查询,检查对象是否存在,如果不存在则创建它。但这是一个查询,然后是一个插入。有可能两个进程同时进入,都进行查询,都成功,然后都进行插入。我怎样才能防止这种情况?请注意,我目前在事务中都发生了每个独立的查询+插入,因此每个事务都有查询后跟插入。

或者update第一笔交易的内部是否可以从第二笔交易的“外部”读取?我正在使用 PostgreSQL / CockroachDB,这是一种“未提交读取”的设置吗?

postgresql transaction
  • 1 个回答
  • 97 Views
Martin Hope
Lance
Asked: 2022-06-29 10:29:16 +0800 CST

以事务方式创建/编辑许多相互关联的记录时要采取的方法?

  • 1

所以我认为我有一个相当复杂的系统,它正在开始出现。写出所有表格太复杂了,但这里是一个简短的描述。

基本上我正在为帖子创建一个像 StackOverflow 这样的徽章系统。你有这些类型的表:

  • 用户
  • 帖子
  • 事件(保存到数据库,以便您知道每个重要事件何时发生)
  • user_statistics(徽章计数汇总等)
  • post_statistics(帖子上的操作计数汇总,“已编辑 20 次”)
  • user_badges(授予用户徽章)
  • 徽章类型

然后假设您“更新帖子”。这是发生的事情:

  • 帖子记录已更新
  • 接下来会创建事件记录,上面写着“更新操作”,只有在它不存在时才会创建,否则它会重用相同的更新事件(以免防止向系统发送垃圾邮件)。它与帖子 ID 和用户 ID 相关联。
  • 更新用户统计信息以计算新事件(如果已创建)。可能有多个统计信息需要更新,因为这些统计信息可能仅限于某些类别(例如特定语言的所有帖子)
  • 如果统计数据达到阈值,则检查我们是否需要创建一个徽章或潜在的多个徽章,然后创建徽章。
  • 可能会创建通知记录。
  • 可能还有其他一些事情,例如提升站点上的权限,因为他们有更多的声誉,等等。
  • 所有这一切都需要成功,所以没有什么可以做的(所有计数都是正确的,并且徽章被正确授予)。

您如何在 PostgreSQL 中适当地完成此任务?在我的具体情况下,似乎有大约 10 个表被查询,至少 5 个表被修改(创建或更新记录)。所有这些在理论上应该是原子的,在一个事务中,但是打包到一个事务中似乎很多,特别是如果你有这些“事件”在一秒钟内多次出现。

我能想到的唯一可能解决这个问题的初始方法是 使用队列和后台作业。上述每个步骤都将在事务之外按顺序完成,步骤之间可能存在时间间隔。所以会有一个中间状态,事情是不一致的。但最终(理论上似乎),队列将运行并重试直到成功,并进入正确的状态。这应该怎么做?

如果不是,是否可以在每个事件上进行单一交易的复杂性?我不知道,我不认为实施徽章和这些计数器的解决方案会变得如此复杂,但每个事件都有很多需要考虑和做的事情。基于您构建可扩展数据库系统的专业知识,我正在寻找任何指向正确方向的指针。

假设这个系统一定是这么复杂,因为我在理论上真的是在问如何处理复杂的事务需求。也就是说,如果您知道一种对徽章系统进行建模的理想方法,那会很高兴知道,但不会真正解决问题的主要部分。感谢您的帮助!

目前,就我的目的而言,一切都可以被认为适合单台机器,而不是分布在多个数据库中。

postgresql transaction
  • 1 个回答
  • 25 Views
Martin Hope
Amirhossein
Asked: 2022-06-11 08:03:30 +0800 CST

使用单线程/多线程回滚事务

  • 0

是否可以使用单个线程回滚事务?

我试图找到这个问题的答案,但我找不到提供参考的答案。我读到了回滚机制。见下文:

SQL-Server 中事务回滚的机制是什么?

如果您回滚事务,引擎将开始向后扫描日志以查找您的事务完成的工作记录并撤消工作:当它找到从 A 到 B 的更新记录时,会将值更改回 A。插入将通过删除插入的行来撤消。通过插入该行将撤消删除。这在事务日志逻辑架构和预写事务日志中进行了描述。

这是高级解释,确切的内部细节是如何发生的,外行没有记录,也不受您的检查或更改。

回滚事务比执行它需要更长的时间。有几个原因。

现在的问题是,如何在各种场景中测试这些操作消耗了多少资源(单/多线程)?

据我所知,声称有一个线程。但是,我找不到任何证据来支持这种说法。

如果执行单线程操作,是否可以将行为更改为多线程?相反的呢?

sql-server transaction
  • 3 个回答
  • 99 Views
Martin Hope
Mads
Asked: 2022-05-28 00:29:42 +0800 CST

从事务中创建的表中读取

  • 2

我想查看正在进行事务的表中的数据。我将以这个超级简单的临时表为例:

SELECT 5 AS NUMBER INTO ##temptable

我将创建一个事务来插入一个编号为 10 的新行:

BEGIN TRAN;
    INSERT INTO ##temptable 
    SELECT 10 AS Number
    WAITFOR DELAY '00:00:20';
COMMIT TRAN;

现在,如果我打开一个新查询并执行常规选择语句,我将不会得到任何结果,轮子将一直旋转,直到事务提交。我可以改为将隔离级别设置为已提交读:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

我希望这会返回承诺的数字 5,而不是未承诺的数字 10,但我再次得到一个纺车。我想这不是它的工作原理。

如果我将隔离级别设置为未提交:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

这成功地从表中返回两个数字。

我仍然有一个问题,因为我想像这样在事务内部创建表:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN;
    SELECT 5 AS NUMBER INTO ##temptable

    INSERT INTO ##temptable 
    SELECT 10 AS Number
    WAITFOR DELAY '00:00:20';
COMMIT TRAN;

在这种情况下,如果我尝试从表中读取,即使隔离级别设置为未提交,我也会再次得到一个旋转的轮子。

有没有办法从正在进行的事务中创建的表中读取?

sql-server transaction
  • 1 个回答
  • 212 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve