Questions tagged «transaction»

一种将一组一致的更改自动提交到数据库的机制。

1
在while循环中是否需要显式事务?
SQL Server 2014: 我们有一个非常大的表(一亿行),我们需要在表上更新几个字段。 对于日志传送等,显然,我们也希望将其保持在很小的规模上。 如果让下面的代码运行一段时间,然后取消/终止查询,那么到目前为止已完成的工作将全部提交吗,还是我们需要添加显式的BEGIN TRANSACTION / END TRANSACTION语句以便我们可以随时取消? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' …

2
INSERT INTO新创建的目标表后,ROLLBACK不起作用
我正在研究将CSV文件(customers.csv)导入MySQL表(customers)的PHP脚本。 在将CSV文件的内容插入mysql表之前,我首先备份原始customers表。 我将整个导入过程(包括备份)包装在mysql事务中(以解决CSV在中间某处损坏的情况,并确保导入是原子的)。 问题是,当我在INSERT INTO语句后立即调用它时,ROLLBACK似乎不起作用:通过phpMyAdmin检查数据库时,我可以看到新创建的表,并且roollback之后仍存在ROWS INSIDE IT。 这是操作日志: [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] [] [2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] [] [2015-01-19 14:08:50] DEBUG: "ROLLBACK" …

1
如果在一个事务中对同一记录进行多次更新,那么将存储多少个版本?
根据Kimberly L. Tripp的MSDN文章,Neal Graves的“ 基于SQL Server 2005行版本控制的事务隔离 “ ... 特定记录的所有早期版本都链接在一个链表中;对于基于行版本控制的长期交易,每次访问都必须遍历该链接,以达到交易的一致版本行” 这在“了解行版本控制”部分中是通用的,可同时遵循“使用行版本控制提交的读取中的行版本控制”和“快照隔离中的行版本控制”部分。 此外,在仅通过SNAPSHOT中的多个事务(T1,T2,T3)对同一记录进行多次更新的情况下,给出了由于修改导致的行版本控制的示例。 如果只有一个事务多次(通过多个语句)更新一条记录,是否将存储(链接)多个版本存储,还是仅在拍摄SNAPSHOT“图像”时进行一个版本存储? 好吧,这个问题的答案应该立即回答我其他未解决的相关问题: 为什么行版本隔离使用记录版本的链接列表? RCSI使用的空间是否少于SNAPSHOT?为什么?

1
生成发票和跟踪
系统每2周就会为公司生成发票。 公司将在每月的1号和16号收到发票。(它将每2周通过Cron Job运行一次。它会扫描订单表,然后将其添加到“发票”表中。是否有其他选择?) 表格中有客户订单的清单,orders还指出了它属于的公司(orders.company_id) 该invoice表从orders表中计算订单的总成本。 我试图弄清楚如何设计合理的发票跟踪。有时公司会向我发送费用,或者有时我会向他们发送费用(invoice.amount) 我需要使用以下方式跟踪发票: 公司给我汇款时 我什么时候汇款到公司的 从公司收到了多少钱 我寄给公司多少钱 我收到了全部款项吗(如果没有,我需要在Db上更新什么?) 发票状态(已发送,已取消,已收金额,已发送金额) 这是我想出的数据库设计: 公司表 mysql> select * from company; +----+-----------+ | id | name | +----+-----------+ | 1 | Company A | | 2 | Company B | +----+-----------+ 客户可以从我的网站选择一家公司。 订单表 mysql> select * from orders; +----+---------+------------+------------+---------------------+-----------+ | id …

2
数据库何时在事务中更新其索引?
我试图了解插入中同时涉及索引和事务的事件顺序。 例如,Oracle文档指出: 如果在加载数据之前创建[或具有]一个或多个索引,则数据库必须在插入每一行时更新每个索引。 但是,如果我创建一个事务,插入五行,然后提交,会发生什么?是否为每个插入或仅在提交点更新索引? 逻辑告诉我,它们只会在提交点进行更新,因为在提交那些记录之前,更新的索引可能无法使用。但这是真的吗? 如果是这样,当我要插入100万行时,为了获得最佳性能,我应该对所有行进行一次大型提交,而不是对10万条记录进行10次事务处理?当然,我意识到,如果第999,999行失败,则存在更大的回滚风险。 抱歉,如果我的术语有点用完。我不是行业DBA。尽管对Oracle和Postgres是我最常使用的数据库,但是我对特定数据库的兴趣不大,与一般数据库无关。我已经搜索了这个主题,但找不到真正的答案。

1
使用触发器进行同步
我的要求与之前的讨论类似: 编写一个简单的银行架构:如何使我的余额与他们的交易记录保持同步? 结合交易触发 我有两个表,[Account].[Balance]和[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); 当对该[Transaction]表进行插入,更新或删除时,[Account].[Balance]应基于进行更新[Amount]。 目前,我有一个触发器可以完成此任务: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR EXISTS (select 1 …

1
SQL Server何时获取锁?
此处找到的SQL Server隔离级别列表指出,在事务内获取的写锁将保留到事务结束。但是,它没有提及何时获得这些锁。 默认情况下是否在事务开始时或仅在需要时获取锁?如果后者为真,那么在大型事务中尽可能晚执行写操作以最小化持有X锁的时间量是否有利?

1
将Select语句放入事务中
这两个查询之间有什么区别: START TRANSACTION; SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; COMMIT; 而且没有交易: SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; 进行SELECT内部交易有什么影响? 如果在这两种情况DELETE FROM orders WHERE id=1之后都SELECT在另一个会话中被调用,它将在何时进行处理?


2
删除带有待处理事务的MySQL表
有没有办法删除MySQL中具有待处理事务的InnoDB表或数据库(最好在文件系统级别)? 发生了什么: 我使用MySQL 5.5.28并运行LOAD DATA INFILE…将一个巨大的数据集(300M行)导入InnoDB表。我以前没用过set autocommit = 0;。不幸的是,mysqld在导入过程中被阻止了。 当我重新启动时mysql,它将尝试回滚使用以下消息填充系统日志的事务: mysqld_safe [4433]:121212 16:58:52 InnoDB:等待1个活动事务完成 问题是回滚现在已经运行了25多个小时,在此期间 mysqld不接受任何套接字连接。 我不能只是删除/var/lib/mysql/*并从头开始,因为这台机器上还有其他一些InnoDB数据库/表。但是,有问题的表是单独数据库中的唯一表。删除整个表或整个数据库不是问题,因为之后我可以重新导入所有数据。



2
提交事务之前查询数据
我的理解是,在MS SQL Server Management Studio窗口中,执行“开始事务”然后进行一些更改(如将数据添加到表中)之后,您只能从同一窗口查询该表和那些更改,直到执行“提交交易”。 在执行“提交事务”之前,有什么方法可以从另一个来源进行查询吗? 具体到我当前的目标并添加一些上下文。我从Excel Power Query进行一些SQL查询。我真的很想能够在“提交事务”之前执行这些查询,以便我可以进行一些分析并弄清楚是否应该执行回滚而不是提交。

3
在提交之前,SQL Server是否允许事务中的DDL(使其可见)到事务中?
在PostgreSQL中,我可以创建一个包含一些测试数据的表,然后在事务中将其迁移到其他类型的新列,从而在上重写一个表COMMIT, CREATE TABLE foo ( a int ); INSERT INTO foo VALUES (1),(2),(3); 其次是, BEGIN; ALTER TABLE foo ADD COLUMN b varchar; UPDATE foo SET b = CAST(a AS varchar); ALTER TABLE foo DROP COLUMN a; COMMIT; 但是,Microsoft SQL Server中的同一件事似乎会产生错误。比较此工作的db fiddle,其中ADD(column)命令在事务之外, -- txn1 BEGIN TRANSACTION; ALTER TABLE foo ADD b …

4
我可以在SET TRANSACTION ISOLATION LEVEL SERIALIZABLE之后添加提交的读取吗?
在存储过程中,我具有以下内容:(sql server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH 由于这是基于事务的,因此我认为其余的数据库连接将不受SERIALIZABLE的影响。 我是否需要隐式设置隔离级别以在提交后读取提交?这会对我的应用程序服务器和数据库服务器之间的其他连接产生不利影响吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.