Php 使用DB:Transaction插入数据

Php 使用DB:Transaction插入数据,php,ajax,laravel,Php,Ajax,Laravel,我有简单的Laravel上传、插入/更新 我有一个将csv文件上传到我的目录的ajax $.ajax({ url:'uploadExcel', data: new FormData($("#uploadForm")[0]), headers: { 'X-CSRF-TOKEN' : $('meta[name="_token"]').attr('content') }, // dataType:'json', async: true,

我有简单的Laravel上传、插入/更新

我有一个将csv文件上传到我的目录的ajax

$.ajax({
    url:'uploadExcel',
    data: new FormData($("#uploadForm")[0]),
    headers: {
        'X-CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
    },
    // dataType:'json',
    async: true,
    type:'post',
    cache: false,
    processData: false,
    contentType: false, 
    success: function(){
        //chunk data from CSV
    },
    error: function(data){
        var errors = data.responseJSON;
        console.log(errors);
    },
    complete:function(completeData){
        console.log(completeData);
    }
});
成功后,我从csv中分块数据。它使用这个函数成功地分块,现在我使用的是
DB::transaction(function(){})插入到数据库中。但是现在我想使用
DB:COMMIT
DB:ROLLBACK

你知道我该怎么做吗

对于
DB:COMMIT
我有一个提交最后一个事务的按钮

对于
DB:ROLLBACK
我有一个按钮,可以回滚上一个事务中的所有内容

注意:我正在为此使用ajax,但它不起作用。

更新:我用手工方式。 我有一个用于
beginTransaction

DB::beginTransaction();
    foreach($results as $row){
        $item = new items;
        $selectQuery = DB::table('items')
            ->where('title', '=', $row["1"])
            ->where('description', '=', $row["2"])
            ->get();

        if (count($selectQuery) > 0) {
            // update
            DB::table('items')
                ->where('title', '=', $row["1"])
                ->where('description', '=', $row["2"])
                ->update([
                    "title" => $row["1"],
                    "description" => $row["2"]
                ]);

        } else {
            //insert
            $item->title = $row["1"];
            $item->description = $row["2"];
            $item->save();
        } 
    }
控制器中的第二个函数是
DB::commit()DB:rollback()


此方法不保存csv中的任何数据,回滚和提交不起作用。有什么想法吗?

如果您将闭包传递给
DB::transaction()
,Laravel将自动调用
DB::commmit
,如果没有,闭包将成功执行,如果抛出异常,则将自动调用
DB::rollBack

如果您想控制它(手动方式),请使用
DB::beginTransaction()

例如:

DB::beginTransaction();
try{
   ...

   DB::commit();
}catch(\Exception $e){
   // echo $e->getMessage();
   DB::rollBack();
}

如果将闭包传递给
DB::transaction()
,如果没有,则Laravel将自动调用
DB::commmit
,如果抛出异常,则闭包将成功执行,并且
DB::rollBack

如果您想控制它(手动方式),请使用
DB::beginTransaction()

例如:

DB::beginTransaction();
try{
   ...

   DB::commit();
}catch(\Exception $e){
   // echo $e->getMessage();
   DB::rollBack();
}
Laravel:数据库事务

如果在DB facade上使用transaction方法,并且在事务闭包中引发异常,则事务将自动回滚。如果关闭成功执行,事务将自动提交。使用事务处理方法时,您无需担心手动回滚或提交:

DB::transaction(function () {
    //your queries
});
手动使用事务处理

如果希望手动开始事务并完全控制回滚和提交,可以在DB facade上使用beginTransaction方法:

DB::beginTransaction();
您可以通过回滚方法回滚事务:

DB::rollBack();
最后,您可以通过提交方法提交事务:

DB::commit();
有关更多详细信息,请访问文档:

Laravel:数据库事务

如果在DB facade上使用transaction方法,并且在事务闭包中引发异常,则事务将自动回滚。如果关闭成功执行,事务将自动提交。使用事务处理方法时,您无需担心手动回滚或提交:

DB::transaction(function () {
    //your queries
});
手动使用事务处理

如果希望手动开始事务并完全控制回滚和提交,可以在DB facade上使用beginTransaction方法:

DB::beginTransaction();
您可以通过回滚方法回滚事务:

DB::rollBack();
最后,您可以通过提交方法提交事务:

DB::commit();

有关更多详细信息,请访问文档:

尝试一下。为此,请在
config/database.php
中定义一个单独的连接,比如说
临时连接

现在,在控制器中,使用新创建的连接,而不是在
DB
上使用事务(它使用默认连接)

您的方法包含
beginTransaction

$connection = DB::connection('temporary_connection');
$connection->beginTransaction();
//rest of the code
包含
回滚的方法

$connection = DB::connection('temporary_connection');
$connection->rollback();
//rest of the code
包含
提交
的方法:

$connection = DB::connection('temporary_connection');
$connection->commit();
//rest of the code

试试这个。为此,请在
config/database.php
中定义一个单独的连接,比如说
临时连接

现在,在控制器中,使用新创建的连接,而不是在
DB
上使用事务(它使用默认连接)

您的方法包含
beginTransaction

$connection = DB::connection('temporary_connection');
$connection->beginTransaction();
//rest of the code
包含
回滚的方法

$connection = DB::connection('temporary_connection');
$connection->rollback();
//rest of the code
包含
提交
的方法:

$connection = DB::connection('temporary_connection');
$connection->commit();
//rest of the code

我采用手动方式使用
DB::beginTransaction()
因此控制器中有3个函数第一个函数用于
beginTransaction()
第二个函数用于提交,第三个函数用于回滚,但我仍然无法回滚最后一个事务…我使用的是手动方式
DB::beginTransaction()
所以我在控制器中有3个函数第一个函数用于
beginTransaction()
第二个函数用于
提交
,第三个函数用于
回滚
,但我仍然无法回滚上一个事务…您不应该将其包装在
try catch
中吗?将
DB::beginTransaction()
DB::commit()
放在try块内,将
DB::rollback()
放在catch块内。为什么有用于回滚和提交的按钮?@Doom5因为我想首先检查csv中的数据是否正确,为此我想首先将其保存到数据库,并为提交()和回滚()设置两个单独的按钮,然后在将其保存到数据库之前,您应该先验证它。此外,您似乎正在执行更新或插入保存模式.Offtopic,但选择要更新的行是一种不好的做法,也是一种性能损失。只需执行$updated=DB::table…->update(…);如果没有更新行,则插入。@AiXEn您能确认您的函数是否抛出任何错误吗?您不应该将其包装在一个
try catch
中吗?将
DB::beginTransaction()
DB::commit()
放在try块内,将
DB::rollback()
放在catch块内。为什么有回滚和提交按钮?@Doom5因为我想先检查csv中的数据是否正确,然后我想先将其保存到数据库中