2012-11-03 47 views
0

我正在嘗試將一個SQL事務提交給MySQL,但我得到自己過去MySQLSyntaxErrorExceptionMySQL異常:執行SQL事務

我使用的代碼是:

implicit connection => 
     SQL(""" 
      start transaction; 
      insert into projects(id_user, name, description) values({idUser}, {name}, {description}); 
      set @last_id = last_insert_id(); 
      insert into assigned(id_user, id_project) values({idUser}, @last_id); 
      commit; 
     """) 
    .on('idUser -> idUser, 
     'name -> project.name, 
     'description -> project.description 
    ).execute() 

的例外,我得到:

[MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into projects(id_user, name, description) values(1, 'First inserted proje' at line 1] 

我開始想,我不能在所有ANORM執行這樣的語句。

+0

您確定插入查詢不會導致語法錯誤嗎? –

+0

@VaibhavDesai我甚至把整個陳述縮減爲'開始交易;提交;'這是同一個例外。 – Andrew

+0

您是否在啓動事務之前將自動提交設置爲false?此外,當您剛剛擁有事務語句時,它會給出什麼錯誤? –

回答

2

您不能以這種方式使用交易。你必須明白,anorm只是現有jdbc庫的一個包裝。默認情況下,使用withConnectionSQL時:

DB.withConnection { conn => 
    SQL("... 
} 

您的查詢使用PreparedStatement改變。意思是;字符導致錯誤。

因此,如果你想使用交易,你必須使用anorm's mecanism

DB.withTransaction { conn => 
    SQL("... 
} 
+0

然後我在'SQL'語句中使用所有語句,或者我爲每個語句寫了一個'SQL'聲明? – Andrew

+0

這取決於你的應用程序。如果您需要執行多次相同的查詢,請編寫一個重複的查詢。否則,使用每條語句的SQL語句。 –