标签: transactions

NoSQL中的交易?

我正在研究NoSQL以扩展数据库的替代方案.如果我想要对这些事情敏感的基于事务的事情,我该怎么办?

transactions nosql

71
推荐指数
5
解决办法
5万
查看次数

如果REST上的事务无法实现,REST如何才能真正有用?

在查看REST时,可能任何人都会注意到的第一件事是没有定义任何事务语义,有人说这是隐含的反对什么是REST,而其他人说任何这样做的尝试都会导致"污染"REST系统.

但是,为了论证,REST确实成为了一种流行的"api"选择,并且宇宙中的每个站点都开始暴露出宁静的切入点.

如果没有交易行为,我们究竟如何可以使用(我说的是非补偿)?因为在我看来,REST的一个好处就是它打破了数据的组成部分,你会认为这会让智能客户端从多个服务组成数据(并添加和调整这些组合数据).但是,如果我无法原子地和孤立地对这种数据组合进行更改,那么使用REST就变得毫无用处.

随着时间的推移和对严肃数据展示的需求的到来,我们将需要的东西是:简单(REST在那里获胜),并支持事务行为,因此我们可以可靠地操作这些数据.

现在,我已经在我的研究中多次阅读了一个特定的论点,它与我们应该如何考虑REST中的事务有关,给出的例子是购物车,你隐含地因为购物车而被隔离是你的.

但是我不同意这个论点,首先,购物车的隔离只是方便,这不是交易隔离......如果我同时对我的购物车进行操作,而我的应用程序的某些部分正在读取数据,会发生什么从中?我不希望我的应用程序的阅读部分看到"仍在交易中"的数据.

更不用说并非所有数据更改都具有隐式事务模型,因此多个服务上的事务肯定不会.

在我看来,事务需要发生,并且需要以一种方式发生,使得实际的REST调用不知道事实(增加其余的有效负载是一个很大的不,但添加标题是正常的).

我已经阅读了一些关于如何通过REST创建事务模型的建议,并且编写的一些规范似乎是最新的.

有没有真正的想法?不应该存在比REST更多的东西,以便REST可以利用REST的简单性来处理固态数据操作('酸'事务).

如果不是,我们期望真正提高赌注,并告诉服务开发人员,如果他们想要在纯粹的数据世界中进行交互,他们需要支持像肥皂那样单一的东西吗?或者更糟糕的是尝试将自己的自定义事务支持构建到REST之类的东西中,使每个服务都不标准并打破REST的全部功能?

提前感谢任何想法.


编辑,添加简短场景:

想象一下处理专辑创建的客户表单,为了方便该专辑,而不是要求用户给艺术家资源uri,他们可以从艺术家列表中选择(最有可能从艺术家目录中获取) .

为了便于使用,客户可以手动编写艺术家姓名,以便他们可以在发布方案中创建艺术家'内联'..客户端代码理解这一点,在发送创建相册的请求之前,它首先尝试确定如果艺术家已经存在,如果是的话,获得该艺术家的uri,否则创造艺术家并获得艺术家uri.

客户端代码然后继续创建专辑,这是比通常的客户端更聪明,它不是坐​​在REST和"哑巴"发布之上,而是有一些处理更纯粹的REST逻辑的交互.

然而,在这种情况下,如果首先创建艺术家,除非专辑是,否则保证不创建艺术家将是很好的.

这不像交易所暗示的那样"关键",但是它定义了一组客户端代码更愿意作为一个操作发生的工作(毕竟,它使这看起来像是对用户的单个操作).

我在这种情况下看到的唯一指导是让客户端在专辑创建失败的情况下进行补偿操作,特别是要求删除艺术家.但这似乎有问题,因为客户假设艺术家是孤立的,尽管可能不太可能,如果另一个客户已经'看到'那位艺术家并分配给它,会发生什么?

这些是我关于进行数据更改的问题,虽然肯定存在其他差距(谁说艺术家不能在以后删除),但这些操作并不透明(即,操作不是通过客户端,但用户特别要求的东西).

我希望这有助于阐明一些话题.

rest standards web-services transactions

70
推荐指数
4
解决办法
3万
查看次数

Spring事务中requires_new和嵌套传播之间的差异

我无法理解的行为差异PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED传播策略.在我看来,在这两种情况下,当前进程都是回滚的,但不是整个事务.任何线索?

java spring transactions propagation

69
推荐指数
2
解决办法
4万
查看次数

如何创建LINQ to SQL事务?

我有一段代码涉及多个插入但需要在我完成插入其他表之前执行submitchanges方法,以便我可以获取一个Id.我一直在搜索互联网,无法找到如何在linq to sql中创建一个事务.我已在我想要进行交易的代码中添加注释.

    var created = false;
    try
    {
        var newCharacter = new Character();
        newCharacter.characterName = chracterName;
        newCharacter.characterLevel = 1;
        newCharacter.characterExperience = 0;
        newCharacter.userUsername = userUsername;
        newCharacter.characterClassID = ccslst[0].characterClassID;
        //Open transaction


            ydc.Characters.InsertOnSubmit(newCharacter);
            ydc.SubmitChanges();

            foreach (var ccs in ccslst)
            {
                var cs = new CharacterStat();
                cs.statId = ccs.statID;                        
                cs.statValue = ccs.statValue;
                cs.characterID = newCharacter.characterID;
                ydc.CharacterStats.InsertOnSubmit(cs);
            }                    


            var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
            foreach (var ccb in ccblst)
            {
                var charBody = new CharacterBody();
                charBody.bodyId = ccb.bodyId;
                charBody.bodyPartId = ccb.bodyPartId; …
Run Code Online (Sandbox Code Playgroud)

.net transactions linq-to-sql

67
推荐指数
2
解决办法
7万
查看次数

围绕单个陈述的交易是做什么的?

我理解一个事务如何对协调一对更新有用.我不明白的是在交易中包装单个陈述,这是我所见过的90%.实际上,在我的经验中,在我的经验中更常见的是找到一系列逻辑相关的事务,每个事务都包含在它们自己的事务中,但整个事务并没有包含在事务中.

在MS-SQL中,在事务中包装单个选择,单个更新,单个插入还是单个删除有什么好处吗?

我怀疑这是迷信编程.

sql sql-server transactions

67
推荐指数
3
解决办法
2万
查看次数

SET autocommit = 1和mysql中的START TRANSACTION之间的区别(我错过了什么?)

我正在阅读MySQL中的交易,我不确定我是否正确掌握了一些特定的东西,我想确定我理解正确,所以这里就是这样.我知道一个事务应该做什么,我只是不确定我是否理解语句语义.

所以,我的问题是,有什么不对,(并且,如果是这种情况,有什么问题),以下内容:

默认情况下,MySQL中启用自动提交模式.

现在,SET autocommit=0;将开始一个事务,SET autocommit=1;将隐式提交.这是可能的COMMIT;,以及ROLLBACK;,在这两者的情况下,自动提交仍设置为0之后(和一个新的隐式启动事务).

START TRANSACTION;将基本上SET autocommit=0;直到COMMIT;ROLLBACK;发生.

换句话说,START TRANSACTION;并且SET autocommit=0;是等价的,除了START TRANSACTION;相当于隐含地添加一个SET autocommit=0;after COMMIT;或者ROLLBACK;

如果是这种情况,我不明白http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html#isolevel_serializable-看到有一个隔离级别意味着有一个事务,这意味着自动提交应该是关闭的?

如果在开始交易和设置自动提交之间存在另一个差异(除了上述的差异之外),它是什么?

mysql sql transactions

67
推荐指数
2
解决办法
9万
查看次数

PostgreSQL函数是事务性的吗?

PostgreSQL函数如下面的自动事务是什么?

CREATE OR REPLACE FUNCTION refresh_materialized_view(name)
  RETURNS integer AS
$BODY$
 DECLARE
     _table_name ALIAS FOR $1;
     _entry materialized_views%ROWTYPE;
     _result INT;
 BEGIN          

     EXECUTE 'TRUNCATE TABLE ' || _table_name;

     UPDATE materialized_views
     SET    last_refresh = CURRENT_TIMESTAMP
     WHERE  table_name = _table_name;

     RETURN 1;
END
$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)


换句话说,如果在执行函数期间发生错误,是否会回滚任何更改?如果这不是默认行为,我该如何使该函数成为事务性的

postgresql transactions

66
推荐指数
5
解决办法
4万
查看次数

将列添加到表,然后在事务内更新它

我正在创建一个将在MS SQL服务器中运行的脚本.此脚本将运行多个语句,并且需要是事务性的,如果其中一个语句失败,则停止整体执行并回滚任何更改.

在发出ALTER TABLE语句以向表中添加列然后更新新添加的列时,我在创建此事务模型时遇到问题.为了立即访问新添加的列,我使用GO命令执行ALTER TABLE语句,然后调用我的UPDATE语句.我面临的问题是我无法在IF语句中发出GO命令.IF语句在我的事务模型中很重要.这是我尝试运行的脚本的示例代码.另请注意,发出GO命令会丢弃@errorCode变量,并且需要在使用之前在代码中声明(这不在下面的代码中).

BEGIN TRANSACTION

DECLARE @errorCode INT
SET @errorCode = @@ERROR

-- **********************************
-- * Settings
-- **********************************
IF @errorCode = 0
BEGIN
 BEGIN TRY
  ALTER TABLE Color ADD [CodeID] [uniqueidentifier] NOT NULL DEFAULT ('{00000000-0000-0000-0000-000000000000}')
  GO
 END TRY
 BEGIN CATCH
  SET @errorCode = @@ERROR
 END CATCH
END

IF @errorCode = 0
BEGIN
 BEGIN TRY
  UPDATE Color
  SET CodeID= 'B6D266DC-B305-4153-A7AB-9109962255FC'
  WHERE [Name] = 'Red'
 END TRY
 BEGIN CATCH
  SET @errorCode = @@ERROR
 END CATCH
END

-- **********************************
-- …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server transactions alter-table

65
推荐指数
3
解决办法
6万
查看次数

MySQL AUTO_INCREMENT没有ROLLBACK

我正在使用MySQL的AUTO_INCREMENT字段和InnoDB来支持事务.我注意到当我回滚事务时,AUTO_INCREMENT字段没有回滚?我发现它是按照这种方式设计的,但有没有解决方法呢?

mysql innodb transactions auto-increment

64
推荐指数
6
解决办法
3万
查看次数

MySQL:存储过程中的事务

我的存储过程的基本结构是,

BEGIN

    .. Declare statements ..

    START TRANSACTION;

        .. Query 1 ..
        .. Query 2 ..
        .. Query 3 ..

    COMMIT;

END
Run Code Online (Sandbox Code Playgroud)

MySQL版本: 5.1.61-0ubuntu0.11.10.1-log

目前,如果'query 2'失败,则提交'query 1'的结果.

  • 如果任何查询失败,我该如何回滚事务?

mysql sql stored-procedures transactions

64
推荐指数
4
解决办法
8万
查看次数