laravel使用DB:Transaction插入数据

时间:2016-08-22 01:47:43

标签: php ajax laravel

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

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

import pygame, sys
from livewires import games
from pygame.locals import *

games.init(screen_width = 640, screen_height = 480, fps = 50) #setup up the window siz

class Mario(games.Sprite):

    def update(self, pressed_keys):
        move = 50 #Setup the origianl position of the character
        if pressed_keys[K_RIGHT]: move += 1 #press right key to move forward
        if pressed_keys[K_LEFT]: move -= 1 #press left key to move back     

    def main():
        pygame.init()
        screen_image = games.load_image("World 1-1.bmp", transparent = False) #setup the background image
        games.screen.background = screen_image
        mario_image = games.load_image("Mario3.bmp")
        mario = games.Sprite(image = mario_image, x = move, y=370) #setup the position of the character
        sprites.add(mario)
        pygame.display.update()

        while True:
            for event in pygame.event.get():
                if event.type == QUIT: return pygame.quit() #if the player quits

            keys_pressed = pygame.key.get_pressed()

    games.screen.mainloop()

    main()

成功后,我从csv中分块数据。它使用此link成功分块,现在我使用$.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); } }); 插入数据库。但现在我想使用DB::transaction(function() {});DB:COMMIT ...

我对如何做到这一点有任何想法?

对于DB:ROLLBACK,我有一个提交最后一笔交易的按钮。

对于DB:COMMIT我有一个按钮,可以在最后一次交易中回滚所有内容。

注意:我正在为此做ajax并且无效。

更新:我采用手动方式。  我有DB:ROLLBACK

的功能
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();

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

3 个答案:

答案 0 :(得分:1)

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

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

例如:

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

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

答案 1 :(得分:0)

  

Laravel:数据库交易

如果您在数据库外观上使用事务方法,并且如果在事务Closure中抛出异常,则事务将自动回滚。如果Closure成功执行,则将自动提交事务。使用事务方法时,您不必担心手动回滚或提交:

DB::transaction(function () {
    //your queries
});

手动使用交易

如果您想手动开始事务并完全控制回滚和提交,可以在数据库外观上使用beginTransaction方法:

DB::beginTransaction();

您可以通过rollBack方法回滚事务:

DB::rollBack();

最后,您可以通过提交方法提交事务:

DB::commit();

有关详细信息,请转到文档:https://laravel.com/docs/5.2/database#database-transactions

答案 2 :(得分:0)

试一试。在config/database.php中为此目的定义单独的连接,例如temporary_connection 现在,在您的Controller中,不使用DB上的事务(它使用默认连接),而是使用新创建的连接。

您的方法包含beginTransaction

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

您的方法包含rollback

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

您的方法包含commit

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