我有简单的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的任何数据,并且回滚和提交不起作用。有什么想法吗?
答案 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