sql >> データベース >  >> RDS >> Mysql

複数のテーブルでのSpringトランザクションとロールバック

    私の答えを更新する:

    1. 「publicQuotesave(Quotequote)」メソッドをトランザクション型にする必要があります。
    2. このメソッドが呼び出されると...トランザクションはTransactionInterceptorで開始され、プロキシから「public Quote save(Quotequote)」が呼び出されます
    3. 行"quoteLineDao.delete(new Long(44));"正常に動作します
    4. 行"System.out.println("°°°°°°°°°°°°°°°°°°行44が削除されました ");"正常に動作します
    5. 行"quoteDao.save(quote);"制約違反の例外を与えます。トランザクションはロールバックとしてマークされます
    6. この例外をキャッチして消費し、例外を伝播していません
    7. メソッド"publicQuote save(Quote quote)"は、 "return null;"という行があるため、nullを返します。
    8. コードがトランザクションインターセプターに到達し、このインターセプターに例外がなかったため、コミットしようとしますが、トランザクションはすでにロールバックとしてマークされているため、失敗します。

    解決策:-トランザクションの必要性のために、例外を消費せず、代わりに例外を伝播する必要があります。

    以下に変更します。 throwステートメントを追加しました。

    try{
          quoteLineDao.delete(new Long(44));
          System.out.println("°°°°°°°°°°°°°°°°°°Line 44 deleted");
          return  quoteDao.save(quote); 
    } catch(Exception e){
          Logger.getLogger(QuoteService.class).log(Logger.Level.ERROR, e);
          throw e;
    }
    

    ステップバイステップの説明は、次のリンクで入手できます: JPAトランザクションをコミットできませんでした:トランザクションはrollbackOnlyとしてマークされています




    1. mysqlとcassandraに速度を挿入します

    2. PostgreSQLの日付から曜日名を取得する

    3. SQL列でフィルタリングされた列の最大値を持つ行のみを選択します

    4. MySQLCREATETABLEクエリのエラー