- ベストアンサー
Hibernate&Springによる宣言的トランザクション管理
- Hibernate&Springを利用したアプリの宣言的トランザクション管理がうまく機能しない
- 特集5のサンプルを実行してもトランザクションが思った通りに機能しない
- テスト方法や情報提供を求めている
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- トランザクションについて
トランザクションについての質問なのですが、下にある1のSQLを実行すると 'a'だけ登録されるのは、分かるのですが、 2のSQLを実行すると、'c'と'd'の両方が登録されてしまいます。 私的には、両方登録されないのかなぁと思っていたのですが・・・ COMMITが来た時点で、START TRANSACTIONの開始位置は、 あまり関係ないということなのでしょうか? よろしくお願いします。 1. START TRANSACTION; insert into test values('a'); START TRANSACTION; insert into mtuser values('b'); ROLLBACK; COMMIT; 2. START TRANSACTION; insert into test values('c'); START TRANSACTION; insert into mtuser values('d'); COMMIT; ROLLBACK; 環境:Mysql4.1.19
- ベストアンサー
- MySQL
- insert1つの処理でもトランザクションは必要?
お世話になります。 現在、MYSQLデータベースを使用したプログラムを書いており、 そこでトランザクションについて質問があります。 トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、 では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか? 例えば、 ・あるテーブルにデータをinsertしたい。 このような単一の処理を書く場合でも、 以下のようにトランザクションを使うべきでしょうか? $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8'; $user = 'user'; $pwd = 'pwd'; //DB接続 try { $pdo = new PDO($dsn, $user, $pwd); } catch (PDOException $e) { die('DB接続失敗'); } //トランザクション開始 $pdo->beginTransaction(); //INSERT try { $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)'; $st= $pdo->prepare($sql); $ret = $st->execute(array( ':a' => $a, ':b' => $b, ':c' => $c, )); if (!$ret) { throw new Exception('INSERT 失敗'); } //commit $pdo->commit(); } catch (PDOException $e) { //rollback $pdo->rollBack(); } $pdo = null; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。
- ベストアンサー
- PHP
- hibernate toolsのHQLエディタについて
Eclipseパーフェクトマニュアルvol.6(技術評論者)のspring+hibernateのサンプルを作成しているのですが、 HSQLDBを使用してドライバの設定もウィンドウの設定のドライバ定義でjarファイルを追加しています。 HSQLDBは起動させています。 <問題点> hibernate toolsのHQLエディタでfrom Customerと入力するといかのようなエラーが表示さす。. hibernate.exception.SQLGrammarException: could not execute query hibernate構成のデータベースをクリックしてもなにも表示されません 接続テストでpingには成功しています session factoryは表示されています。 Hibernate動的SQLプレビューの内容は以下のとおりです。 0: sample.entity.Customer ----------------- select customer0_.ID as ID34_, customer0_.NAME as NAME34_, customer0_.ADDRESS as ADDRESS34_, customer0_.AGE as AGE34_ from T_CUSTOMER customer0_ HSQL Database Managerで接続できることは確認しています。 どうかご教授よろしくお願いします。
- 締切済み
- Java
- postgresqlでのトランザクションについて
postgresqlで、「WARNING 進行中のトランザクションがありません」のエラーが出てしまいました。 これはそのままの意味だと思うのですが 直す方法がわかりません。 ワーニングなので、、、といいたいところですが、そうもいかず。 apのログで、トランザクション関係の辺りを見ましたところ、 トランザクションを開始し、 TABLEをDROPしようとしましたが、存在しなかった(ようだ)。 (PQexecがエラーでリターン) 存在しないけれど、commit してトランザクションを終わらせている。 のが原因かなと思いました。 なので、PQexec()がエラーの場合はcommitしなければいいのかと はずしましたが結果は同じでした。 トランザクションが無いのだからrollbackもいらないですよね。 そこで質問ですが drop文、1ステップのSQL実行も明示的にトランザクションの処理をしたほうがいいのでしょうか? このワーニングは通常のトランザクションの処理の中で、どういう時にでるのでしょうか? oracleとpostgresqlの明示的・暗黙的な制御に戸惑っています。 (oracleからpostgresqlに移行することになりました) 叱咤でも何でもかまいませんので、アドバイスよろしくお願いいたします。
- ベストアンサー
- PostgreSQL
- ActiveX DLLでのオラクルのトランザクション
VB6とOracle9iのOO4Oにてシステムを構築しておりますが、一つ解らないことがありましたので、どなたかご教授願います。 あるPG(通常のEXEです)よりActiveX DLLを呼び出してOracleの表へデータを挿入する処理があります。呼び出し元となる通常のEXEはまずOracleの接続処理を記述しています。正常に接続が完了したならトランザクションを開始し、表のDeleteを実行します。その後ActiveX DLLを呼び出して表のInsertを実行しています。再び通常のEXEに制御が戻り、トランザクションの完了(COMMIT)または破棄(ROLLBACK)を行います。しかし、最後のトランザクションのCOMMIT(ROLLBACK)を行うと『コッミト(ロールバック)時にアクティブなトランザクションがありません』というエラーが発生してしまいます。正しくBegin Transactionを実行しているのに、これはどういうこと何のでしょうか。ご存知の方がいらっしゃましたら教えてください。
- ベストアンサー
- Oracle
- トランザクションモード
早速ご教示ください。 データベース(TEST_db)のM_SYAIN_CDというテーブルがあるとします。 【クエリアナライザ】TEST_db BIGIN TRANSACTION GO DELETE M_SYAIN_CD GO 上記を実行します。 この状態で、M_SYAIN_CDの全行を返すと、『Microsoft odbc sqlserver driver 時間切れになりました』とエラーになり全行返すことができません。 (1)なぜMicrosoft odbc sqlserver driver 時間切れになりました。とな るのか? トランザクションモード中にテーブルは見れないのでしょうか? 【クエリアナライザ】TEST_db BIGIN TRANSACTION GO DELETE M_SYAIN_CD GO COMMIT TRANSACTION GO (2)上記実行後、ROLLBACKはできるのでしょうか? ご教示の程宜しくお願い致します。
- ベストアンサー
- SQL Server
- accessVBAでのワークスペース
こんばんわ。 今年の四月から新米SEとして働いているものです。 他の言語の場合どうなるかわかりませんが、accessの場合、トランザクションを開始してSQL文を実行する際、「データベース.Execute SQL文」となると思うのですがDAOやADOで接続する際、最初のほうでワークスペースを定義しますよね。 トランザクションの開始、コミットやロールバックは、「ワークスペース.BeginTrans、ワークスペース.CommitTrans、ワークスペース.RollBack」なのになぜSQLを実行するときだけ「データベース.Execute SQL文」なのでしょうか? 私なりの考えでは、ワークスペースは中間作業領域。中間作業領域でなにかしらのエラーが起きたらロールバック、もし問題なければコミットするのでワークスペース.Commit等というのは理解したのですが、SQL文を実行するのはトランザクション中なのでワークスペースで実行「ワークスペース.Execute SQL文」なのではないのでしょうか? ワークスペースへの理解が誤っているのでしょうか? よろしくお願いします。
- ベストアンサー
- その他(データベース)
- AccessShareLock はどの程度気にする必要がある?
PostgreSQL8.2とJavaを使ったWebアプリケーションを構築しています。 pgAdminでサーバー状態>ロック で参照してみたところ、AccessShareLockというのが大量に発生していました。 マニュアルを参照してみたところ、 >AccessShareLock を除き,トランザクション内で獲得されたすべての ロックモードは,そのトランザクション実行の間維持されます. とあり、つまりAccessShareLockはトランザクションの間でも維持されないということだと思うのですが、どうも解放されてはいないようです。 これは通常の(つまり、更新しない)select文を発行したときに発生するロックだと思うのですが、いろいろ調べても、どうもこのAccessShareLockというのをどのくらい気にしたらいいのかがわかりません。 このロックが残っていると、どのようなときに困るでしょうか。 また、解放するためには通常のselectのあとでもcommit(またはrollback)をする必要があるということになるでしょうか。その際にはcommitとrollback、どちらがいいということはあるでしょうか。 ご存じのかたがいらっしゃいましたらご教示いただければと思います。よろしくお願いいたします。
- ベストアンサー
- PostgreSQL
- アスペクト指向によるトランザクションの記述のサンプル
PHP5.2.4を使用しています。 Sabelフレームワーク内でのトランザクションの記述のサンプルというか例を 教えて頂きたいのですが、以前はHPが見れてそのサンプルを見れたような気がするのですが、 今はアクセスできる状態じゃなく(http://www.sabel.jp/)コミュニティのようなものもあるわけではないので ここで質問させて下さい。 app/logics/aspects/Transaction.php class Logics_Aspects_Transaction implements Sabel_Aspect_MethodInterceptor { public function invoke(Sabel_Aspect_MethodInvocation $inv) { if (!$active = Sabel_Db_Transaction::isActive()) { Sabel_Db_Transaction::activate(); } try { $result = $inv->proceed(); if (!$active) { Sabel_Db_Transaction::commit(); } return $result; } catch (Exception $e) { if (!$active) { Sabel_Db_Transaction::rollback(); } throw $e; } } } 詳しくは分からないのですがここにトランザクションのロジックがあるようなのですが、 これを例えばデータベースのデータを保存するさいにどのような記述で使えばよいのか というサンプルを示して頂けないでしょうか? ここでダウンロードができます Sabel ドキュメントとか(非公式) http://ebine.org/sabel/doc/index.html
- ベストアンサー
- PHP
- MySQLのトランザクションについて
初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。
- ベストアンサー
- Perl
お礼
s2tさん回答ありがとうございます。 早速サンプルを参考にし試しにCustomerDAOImpl.saveOrUpdate()を、以下のように修正してみたところ、思った通りに動作させることが出来ました。私の考え方が少し間違ってたみたいですね。 public void saveOrUpdate(Customer customer) { getHibernateTemplate().saveOrUpdate(customer); getHibernateTemplate().save("test"); } 本当に助かりました。ありがとうございました。