Questions tagged «transaction»

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

5
数据库事务和锁定之间的确切关系是什么?
本着提高我的知识水平提出的一个谦虚的问题。请您反应温和。 作为长期的应用程序开发人员,我在某种程度上知道事务是什么(我一直都在使用它们)。暂时不考虑事务隔离级别,在较高的级别上,事务允许一个工作块完全或根本不完成,并允许与其他数据库修改活动进行一定程度的隔离。 我还知道什么是锁(在各种数据库中),或者至少是一种行为(如果我以某种方式明确地锁定了一个表,那么任何其他进程或线程都无法更新该表的任何内容)。 我现在最明显的不明确的是:在各种数据库中,当我明确地锁定一行或一台,我在用人所使用的数据库的交易设施在幕后进行交易正常工作完全一样的结构? 也就是说,对我来说,为了使事务是原子的和隔离的,它必须进行一些锁定。这种由事务启动,隐藏迁移的锁定是否与各种数据库允许我通过诸如SELECT FOR UPDATE或显式LOCK命令之类的构造访问的锁定相同?还是这两个概念完全不同? 再次,我为这个问题的天真道歉。我很高兴被告知更多的基础资料。

1
OLAP和OLTP中的“在线”到底是什么?
我有点困惑,因为我质疑OLTP和OLAP中“在线”的定义。我以前认为这里的“在线”是指我们希望在有限的时间内并根据某个实例在时间上可用的数据来回答问题。 但是OLAP查询可能要花几个小时才能计算出来-这不是离线吗? 快速搜索表明离线OLAP听起来很混乱(离线在线分析处理)...? 什么是“在线”?

2
避免原子事务中的唯一违规
可以在PostgreSQL中创建原子事务吗? 考虑我有这些行的表类别: id|name --|--------- 1 |'tablets' 2 |'phones' 并且列名具有唯一的约束。 如果我尝试: BEGIN; update "category" set name = 'phones' where id = 1; update "category" set name = 'tablets' where id = 2; COMMIT; 我越来越: ERROR: duplicate key value violates unique constraint "category_name_key" DETAIL: Key (name)=(tablets) already exists.


2
Postgres中的可延迟唯一索引
查看关于alter table的postgres文档,似乎可以将常规约束标记为DEFERRABLE(更具体地讲INITIALLY DEFERRED,这是我感兴趣的)。 索引也可以与约束关联,只要: 索引不能有表达式列,也不能是部分索引 这使我相信,目前尚无办法根据条件创建唯一索引,例如: CREATE UNIQUE INDEX unique_booking ON public.booking USING btree (check_in, check_out) WHERE booking_status = 1; 是INITIALLY DEFERRED,这意味着,该独特性“约束”将只在事务结束进行验证(如果SET CONSTRAINTS ALL DEFERRED;使用)。 我的假设是否正确?如果正确,是否有任何方法可以实现预期的行为? 谢谢


1
无法看到MySQL提交的数据来选择查询
上下文:使用的框架是Spring,所有查询都使用JdbcTemplate运行。Mysql Server版本是5.6.19。和table是InnoDB table,默认设置为,并且设置了auto commit隔离级别可重复读取。 问题:Insert在事务内部发生的事情和select读取相同插入数据的事务看不到该数据。在select运行后,在insert之后的insert交易都有commited。 我已经启用bin日志以及mysql中的常规日志。以下相关日志 二进制日志: SET TIMESTAMP=1438265764/*!*/; BEGIN /*!*/; # at 249935389 #150730 14:16:04 server id 1 end_log_pos 249935606 CRC32 0xa6aca292 Query thread_id=40 exec_time=0 error_code=0 SET TIMESTAMP=1438265764/*!*/; insert into user_geo_loc_latest(user_id, lat, lng) values(x,y,z) on duplicate key update lat=y, lng=z /*!*/; # at 249935606 #150730 14:16:06 server id 1 …


1
MySQL:事务会锁定行吗?
我以前没有尝试过使用MySQL事务,我只是想澄清一下。 如果两个用户在非常精确的时间执行查询,MySQL将如何处理呢?例如,用户正在尝试更新记录。 user1:更新表集column = column-4,其中column_id = 1; user2:更新表集column = column-7,其中column_id = 1; 现在,如果我使用事务,MySQL是否会选择首先执行哪个查询并锁定第二个用户,直到提交第一个查询?是表锁还是行锁? 如果第三位用户发出选择声明怎么办?MySQL将返回什么值? PS这将在Innodb上。

1
事务ID换行后,如何比较xmin和txid_current()?
除其常规列外,Postgres表还具有各种可用的系统列。其中一个xmin存储用于创建行的事务ID。它的数据类型是xid,一个四字节整数,在某个点回绕(即不一定唯一)。该函数txid_current()依次返回当前事务ID,但返回as bigint,因为它“用“ epoch”计数器扩展,因此在安装期间不会回绕”(引用手册)。 如果尚未发生事务折回,则两个值似乎匹配: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) 但是我想知道:这两个值是否总是可比的?据我了解,txid_current()在交易ID换行后(最多2 ^ 32个交易),将继续提供唯一的值,并且xmin将从零开始。这意味着两者都开始在那个时候返回不同的值? 如果是这样,是否有一种方法可以提取结果的常规xid值txid_current(),使其与xmin表中的条目匹配(例如,转换txid_current()为整数)? 编辑:更加清楚地表明,我关心在事务ID换行之后会发生什么,这很可能在2 ^ 32个事务之前发生。感谢DanielVérité在评论中指出这一点。

1
在JDBC中禁用显式提交,在SQL中检测它们,或将数据库置于只读状态
背景:我正在http://sqlfiddle.com(我的网站)上工作,并试图防止可能的一种滥用途径。我希望通过询问我当前要解决的问题,我不会无意间使潜在的虐待更为严重,但是您能做什么?我相信你们。 我想防止任何用户在给定的交易块内发出明确的“提交”调用。从SQL Fiddle的上下文来看,事务块是在右侧面板上执行的代码。基本上,我遍历并执行一系列明文SQL命令,并且我想确保它们所做的所有更改都将在批处理结束时回滚。通常,它们的更改会回滚,但是有时文本中会包含明确的“ commit”语句,因此我的回滚当然是行不通的。用户试图破坏SQL Fiddle上的架构时,很可能发生这种显式提交,因此其他从事此操作的人将看到错误。 主要期望结果:如果可能,我想在JDBC级别禁用显式提交。这是因为我必须支持多个数据库后端供应商,并且当然每个供应商都有其低级的怪癖。 Fallback选项:如果无法将JDBC配置为禁用显式提交,那么我将接受在处理以下每个后端批处理时检测显式提交的解决方案:SQL Server,Oracle,MySQL和PostgreSQL。 对于SQL Server,我想到了这种解决方案:在执行该语句之前,先解析XML查询计划中的语句,然后检查是否存在与该XPath相匹配的条目: //*[@StatementType="COMMIT TRANSACTION"] 我认为这对于SQL Server来说会很好。但是,这种方法不适用于其他数据库类型。Oracle针对显式提交的XML执行计划输出未引用您正在运行commit语句的事实(而只是重复从其提交的查询中重复执行计划输出)。PostgreSQL和MySQL根本不为显式提交提供任何执行计划输出(XML或其他方式)。 剩下的工作就是检查“ commit”一词的实际陈述。这将起作用,除非可能存在各种变化: declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上面是SQL Server的示例(我可以解决),但是我想Oracle,MySQL和PostgreSQL可能会发生类似的事情。我在这个假设上错了吗?也许他们不允许“动态”提交语句?随意使用SQL Fiddle(最好不要使用示例架构或可能正在使用的其他示例)来查看是否可以在Oracle,MySQL和PostgreSQL中进行类似的操作。如果没有,也许简单的字符串检测可能适用于那些。 还有另一种可能性 我想到了另一个选择-如果您知道一种将这些数据库中的任何一个设置为只读模式的方法,例如在该模式下,什么也不能提交,那也可以工作。只要在该模式下什么也不能提交,我就仍然需要允许启动事务并在其中运行代码。那可能吗? 更新资料 我最近学到的-PostgreSQL实际上不是问题。显然,如果同一交易块最终被回滚(在Postgres中),则该交易块中发出的提交将不适用。所以为Postgres致敬! 多亏了Phil在SO帖子上的链接,我想我可以使用DEFERRABLE INITIALIALLY DEFERRED hack for Oracle来完成我要执行的操作(如果发出了提交,将会引发错误,但是我可以解决这个问题)。这应该针对Oracle。(我想了一会儿嵌套事务可能在这里工作,但是Oracle似乎不支持嵌套事务?无论如何,我找不到以这种方式工作的任何东西)。 真的还没有针对MySQL的解决方案。使用嵌套事务进行了尝试,但这似乎不起作用。我正在认真考虑MySQL的更严格的方法,例如不允许在右侧使用SELECT或在每次查询后删除/重新创建数据库。听起来都不好。 解析度 因此,我现在已经为SQL Server和Oracle实现了所描述的解决方案,并且正如我提到的那样,对于PostgreSQL来说这实际上不是问题。对于MySQL,我采取了一些不幸的步骤,将查询面板限制为仅选择语句。仅需在架构面板(左侧)上输入用于MySQL的DDL和DML。我希望这不会破坏太多的旧提琴,但是我认为这只是确保数据一致性所要做的。谢谢!

2
存储过程中的事务
我需要在单个事务中执行UPDATE和INSERT。该代码本身可以正常工作,但是我希望能够轻松地调用它并传递所需的参数。当我尝试将此事务嵌套在存储过程中时,我遇到许多语法错误。 如何封装以下代码,以便可以轻松调用它? BEGIN TRANSACTION AssignUserToTicket GO DECLARE @updateAuthor varchar(100) DECLARE @assignedUser varchar(100) DECLARE @ticketID bigint SET @updateAuthor = 'user1' SET @assignedUser = 'user2' SET @ticketID = 123456 UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID); INSERT INTO [dbo].[tblTicketUpdate] ([ticketID] ,[updateDetail] ,[updateDateTime] ,[userSamAccountName] ,[activity]) VALUES (@ticketID, 'Assigned ticket to …

2
在提交之前,InnoDB在哪里存储交易数据?
我做了使用一些测试READ_COMMITTED,并READ_UNCOMMITTED在家里,使用JDBC技术。 我看到它READ_UNCOMMITTED实际上可以读取未提交的数据,例如,来自尚未提交的某些事务的数据(可以执行UPDATE查询)。 问题 未提交的数据存储在哪里,以便一个READ_UNCOMMITTED事务可以从另一个事务中读取未提交的数据? 为什么READ_COMMITTED事务不可能读取未提交的数据,即执行“脏读”?哪种机制强制执行此限制?

3
长时间在MSSQL中打开事务会产生什么影响?
我只是想知道如果您在数据库中开始事务并忘记提交或回滚该怎么办。服务器会停机吗?可以说您离开了3天。 还有一些正在使用它的用户,假设其他用户不知道有未完成的事务(假设用户只是在数据库中插入数据)。此操作的后果是什么?

1
SQL Server中的“在检查点上截断日志”选项
长话短说,但我们的长期顾问(前雇员)早在2006年左右就编写了一个自定义脚本来与Tivoli Storage Manager交互,并且似乎正在检查名为的SQL Server DB选项truncate log on checkpoint。他们的说法是,它阻止脚本在SQL 2012实例上运行和执行备份。 我觉得这是完整的BS,因为我找不到任何这样的选项,sp_configure并且备份在一个实例之外的任何地方都可以工作。但是,我想删除一个地雷(如果确实如此),并删除其他过时的元素。我确实让他们与供应商核实,但我对他们所说的话没有高度的信心。 我所做的研究只返回了SQL 2000或Sybase选项。另一个说法是,当恢复模型使用SIMPLE并且没有明确的选项打开或关闭它时,它在更高版本(2008及更高版本)中被隐式调用/使用。 由于该TRUNCATE LOG命令由于这些天的事务日志的工作方式已过时,因此我认为这不是一个可以查询的选项。 由于我没有任何SQL Server 2000实例,因此我希望有人可以回忆起此事,或者可以检查周围放置的实例。我告诉他们,我没有什么可以推荐的。我也希望有人可以确认这已经过时了。

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.