标签: transactions

如何在 EJB 中提交事务?

我有以下场景,

public void someEjbMethod1()
{
    for (int i=0; i=10; i++)
    {
        em.merge(arr[i]);
        em.flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要分别合并 ( arr[i]) 的每个对象。因为上面的代码将arr[i]在函数末尾提交所有实例。

我正在考虑执行以下操作:

public void someEjbMethod1()
{
    for (int i=0; i=10; i++)
    {
        saveObj(arr[i]);
    }
}

// should I use a transaction attribute here??
public void saveObj(SomeObject obj)
{
    em.merge(arr[i]);
    em.flush();
}
Run Code Online (Sandbox Code Playgroud)

java ejb transactions

0
推荐指数
1
解决办法
1万
查看次数

使用SqlTransaction连接已关闭错误

我有一个带有数据的测试SQL Server表

  ItemId    Description ItemCost
    1           first item  100
    2           second item 200
    3           third item  300
Run Code Online (Sandbox Code Playgroud)

以及将项添加到Items表的存储过程

create proc spInsertItem
 @itemId int
,@itemDescription varchar(50)
,@itemCost decimal
as
begin
    if(@itemCost < 0)
        begin
            raiserror('cost cannot be less than 0',16,1)
        end
    else
        begin
            begin try
                begin tran
                    insert into Items(itemid, [description],itemCost)
                    values (@itemid, @itemdescription,@itemCost)
                commit tran
            end try
        begin catch
            rollback tran
                select   ERROR_LINE()as errorLine
                        ,ERROR_MESSAGE() as errorMessage
                        ,ERROR_STATE() as errorState
                        ,ERROR_PROCEDURE() as errorProcedure
                        ,ERROR_NUMBER() as errorNumber
        end catch …
Run Code Online (Sandbox Code Playgroud)

c# sql-server asp.net transactions

0
推荐指数
1
解决办法
1340
查看次数

在处理并发连接时从SQL Server生成一个序列号块?

我们有一个应用程序必须生成唯一的顺序序列号并将范围存储在数据库中.我们只需记录数字范围,我们将实际存储在其他地方

基本上,它是如何安装,现在是我们有三列一个简单的表SequenceStartNumber,SequenceEndNumberAllocatedFor.

例如,行可能如下所示:

SequenceStartNumber    SequenceEndNumber   AllocatedFor
1                      1000                CustomerXYZ
1001                   2000                CustomerZZY
Run Code Online (Sandbox Code Playgroud)

一段代码将执行查询

SELECT MAX(SequenceEndNumber) + 1 AS FirstNumber 
FROM SequenceNumberAllocation
Run Code Online (Sandbox Code Playgroud)

代码获取此查询的结果,添加它知道它需要的许多序列号,并执行插入

INSERT INTO SequenceNumberAllocation (SequenceStartNumber, SequenceEndNumber, AllocatedFor) 
VALUES (%d, %d, 'CustomerABC')
Run Code Online (Sandbox Code Playgroud)

这样我们就有了这些数字块的运行列表,以及谁在使用它们.

这样可以正常工作,除了很明显这个方法不能解释并发性.假设(它还没有发生)两个同时进程可以同时执行第一个查询并获取相同的起始编号.

在insert子句完成之前阻止表的最佳方法是什么?这个操作应该以某种方式形成存储过程吗?SQL不是我最强的诉讼,因此我不得不问其他人可能是什么基本问题.谢谢你的时间.

sql sql-server concurrency transactions

0
推荐指数
1
解决办法
438
查看次数

交错DDL和DML时是否需要COMMIT?

在Oracle中,我正在调用以下查询(而不是来自sqlplus)作为安装脚本的一部分:

ALTER TABLE MYTABLE DISABLE CONSTRAINT PFTATTRS_ATTR_FK;
INSERT INTO MYTABLE (PTF_ID, ATTR_ID) VALUES (1, 5);
ALTER TABLE MYTABLE ENABLE CONSTRAINT PFTATTRS_ATTR_FK;
Run Code Online (Sandbox Code Playgroud)

如您所见,我将DML(需要COMMIT)与DDL(自动提交)交错.我的疑问是:我是否需要在每个DDL之前提交DML,或者在我的脚本结尾处进行一次大提交是否安全?

oracle ddl transactions commit dml

0
推荐指数
1
解决办法
183
查看次数

如何在Go中使用清晰的结构值来优化性能?

我的API服务器接受post请求,请求体是JSON,所以我创建两个struct对象来接受JSON字符串并将其持久化到database.But每次我接受一个请求我需要一遍又一遍地创建struct对象,我试着清除结构而不是重新创建它.演示代码如下:

//The two struct
type Card struct {
  Number string
  Type   string
}

type Person struct {
  Name string
  Cards []Card
}

var p Person

//parse JSON to the struct object
func init() {
  str := `{"name":"aaa","cards":[{"number":"1","type":"visa"},{"number":"2","type":"mastercard"}]}`
  json.Unmarshal([]byte(str), &p)
}

func PersistToDatabase() {
  var err error
  tx, err := db.Begin()
  if err != nil {
    return
  }

  defer func() {
    if err != nil && tx != nil {
      if err := tx.Rollback(); err != nil {
        return
      }
    } …
Run Code Online (Sandbox Code Playgroud)

optimization performance struct transactions go

0
推荐指数
1
解决办法
244
查看次数

Grails或Spring方法级别事务

我是春季/学生交易的新手,阅读后我仍然不清楚,所以我在这里发帖,

我有一个服务类,注释为@Transactional,我有一些方法,其中一些注释为

@Transactional(propagation = Propagation.REQUIRES_NEW)
Run Code Online (Sandbox Code Playgroud)

其中一些不是.

@Transactional
class SomeService {

    def findJob() {
        MyInstance myInstance = getMeAJob();
        if (myInstance) {
            doSomeThing(myInstance)
            doTask()
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception)
    private doSomeThing(MyInstance myInst) {
        myObj = MyInstance.lock(myInst.id)
        try {
            differentObj = doTask(myObj)
            myObj.save()
            doAnotherThing()
            }
        } catch (Exception e) {

            log("Error in doAnotherTask")
        }
    }


    private doAnotherThing(MyInstace myInst) {
        perform some update on myInst
        myInstant.save(flush: true)
    }
    private doTask() {    
    }
Run Code Online (Sandbox Code Playgroud)
  • 假设我有来自类级别的事务t1和来自doSomething()的t2事务 - REQUIRES_NEW.
  • 将在t1中执行的方法 - findJob()和doTask()
  • 将在t2中执行的方法 - doSomeThing() …

grails spring transactions spring-transactions

0
推荐指数
1
解决办法
535
查看次数

事务在truncate上不起作用

我第一次尝试Laravel事务...我使用Eloquent进行大部分查询,因为那里没有事务,我必须混合使用Eloquent和查询构建器.

这是我的代码:

DB::beginTransaction();

try{
    Setting::truncate();
    Setting::insert($data);
    DB::commit();
    jok('all ok');

}
catch (\Exception $e)
{
    DB::rollback();
    jerror('some error accorded! ');
}
Run Code Online (Sandbox Code Playgroud)

所以我已经绑定到添加一些无效的数据到设置,我得到了some error accorded错误按预期但INSERT之前的查询Setting::truncate();仍然执行,我最终得到一个空表.

所以要么我做错了什么,要么事务不能截断.

transactions laravel laravel-5.2

0
推荐指数
1
解决办法
876
查看次数

为什么需要并发执行交易?

有人可以解释一下为什么同时执行交易是可取的吗?搜索了几个小时,我找不到一个明确的答案.谢谢.

database sql-server transactions

0
推荐指数
1
解决办法
88
查看次数

快照与所有其他隔离级别的更新丢失

假设我们使用create new table并为我们的数据库启用快照隔离:

alter database database_name set allow_snapshot_isolation on

create table marbles (id int primary key, color char(5)) 
insert marbles values(1, 'Black') insert marbles values(2, 'White')
Run Code Online (Sandbox Code Playgroud)

接下来,在会话1中开始一个快照事务:

set transaction isolation level snapshot
begin tran
update marbles set color = 'Blue' where id = 2
Run Code Online (Sandbox Code Playgroud)

现在,在提交更改之前,在会话2中运行以下命令:

set transaction isolation level snapshot 
begin tran 
update marbles set color = 'Yellow' where id = 2
Run Code Online (Sandbox Code Playgroud)

然后,当我们提交会话1时,会话2将失败,并显示有关事务中止的错误 - 我知道这可以防止更新丢失.

如果我们逐个执行此步骤但具有任何其他隔离级别,例如:可序列化,可重复读取,读取提交或未提交读取,则会执行此会话2,从而对表进行新的更新.有人可以解释一下我为什么会这样吗?对我来说,这是一种丢失的更新,但似乎只有快照隔离才能阻止它.

t-sql sql-server transactions transaction-isolation isolation-level

0
推荐指数
1
解决办法
159
查看次数

启用mysql binlog后,为什么仍需要innodb重做日志?

以我的理解,mysql binlog可以完全充当InnoDB的重做日志。

那么,启用Binlog后,为什么InnoDB必须同时编写重做日志,而不是仅仅切换为使用Binlog?这是否会大大降低数据库的写入性能?

除了简化设计和实现之外,这样做还有什么好处?

AFAIK,要在保证ACID符合性的同时启用两个日志,将发生以下问题:

  1. 具有相同含义的每个日志记录必须分别写入两次。
  2. 每次提交事务或事务组时,都要刷新两个日志。
  3. 为了确保两个日志文件之间的一致性,使用了复杂而低效的方法,例如XA(2PC)。

因此,所有其他产品似乎仅使用一组日志(SQL Server称为事务日志,ORACLE称为重做日志,PostgreSQL称为WAL)来完成所有相关工作。难道只有MySQL必须同时打开两组日志以确保ACID合规性和强而一致的主从复制吗?

在仅启用其中一项的情况下,是否有一种方法可以实现ACID遵从性和强大的一致半同步复制?

mysql innodb transactions acid mariadb

0
推荐指数
1
解决办法
114
查看次数

如何在多个表中锁定插入?

我使用此命令在多行中插入多个记录,如果插入不成功,如何锁定命令和回滚更改?

SqlCommand cmd = new SqlCommand();

        string s = @"

                declare @one_id int; 

                INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);

                set @one_id=SCOPE_IDENTITY();

                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
                ";

        cmd.CommandText =s;
Run Code Online (Sandbox Code Playgroud)

sql sql-server asp.net locking transactions

-1
推荐指数
1
解决办法
81
查看次数

Spring + Hibernate手动创建事务,PROPAGATION_REQUIRED失败.BUG?

请不要建议我为此使用交易注意事项.

我遇到了一个与Spring处理事务有关的错误.

请看一下这两个测试用例,注释在代码中:

实体类例如:

@Entity
public class Person{
    @Id
    String name;
}
Run Code Online (Sandbox Code Playgroud)

使用的一些方法:

public TransactionStatus requireTransaction() {
        TransactionTemplate template = new TransactionTemplate();
        template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        return getTransactionManager().getTransaction(template);
}

public Session session() {
        return getRepository().session();
}

public PlatformTransactionManager getTransactionManager() {
        return getRepository().getTransactionManager();
}
Run Code Online (Sandbox Code Playgroud)

这是第一个测试,testA();

@Test
public void testA() throws InterruptedException {
        // We create the first transaction
        TransactionStatus statusOne = requireTransaction();

        // Create person one
        Person pOne = new Person();
        pOne.name = "PersonOne";
        session().persist(pOne);

        // ---> 111) NOTE! We do not commit! Intentionally! …
Run Code Online (Sandbox Code Playgroud)

spring hibernate transactions spring-transactions

-18
推荐指数
1
解决办法
1456
查看次数