javaで、下記の様なmysql(mariaDb)のクラスを作りました。
コミットとロールバックも出来るようにしたつもりなのですが、これだと上手く動作しませんでした。
常にコミットになってしまいます。
構造に問題があるのでしょうか。
出来るだけ、db関係の変数はdbクラス内だけで処理できればと思って作りました。
mainクラス
public class Sample { public void main(){ String sql = ""; String url = "****"; String user = "****"; String pass = "****"; SampleDb sampleDb = new SampleDb(url, usr, pass); sampleDb.setCommit(); //コミット設定 sampleDb.execute(sql); //処理 //sampleDb.commit(); //コミット sampleDb.rollback(); //ロールバック } }
dbクラス
public class SampleDb { Connection con; Statement stmt; //コンストラクタ public SampleDb(String url, String user, String pass) { con = DriverManager.getConnection(url, user, pass); stmt = con.createStatement(); } //コミット設定 public void setCommit() throws SQLException{ con.setAutoCommit(false); } //コミット public void commit() throws SQLException{ con.commit(); } //ロールバック public void rollback() throws SQLException{ con.rollback(); } //クエリ実行 public boolean execute(String sql) throws SQLException{ boolean bl = stmt.execute(sql); return bl; } //クエリ実行(insert, update, delete) public int executeUpdate(String sql) throws SQLException{ int n = stmt.executeUpdate(sql); return n; } }
――――――――――――――――――――――――――――――――――
追記
回答有難うございました。
こちらの勘違いでした。insertではコミット・ロールバックともに動作致しました。
ですが、適当なテストテーブルを作成して、下記の様なクエリを実行すると必ずコミットになるようです。
回答者様の仰られた通りです。
//重複削除 sampleDb.setCommit(); sampleDb.execute("CREATE TEMPORARY TABLE tblTmp AS SELECT DISTINCT * FROM test"); sampleDb.executeUpdate("DELETE FROM test"); sampleDb.executeUpdate("INSERT INTO test SELECT * FROM tblTmp"); sampleDb.execute("DROP TABLE tblTmp"); sampleDb.commit(); //sampleDb.rollback();
――――――――――――――――――――――――――――――――――
追記の追記
クラスを使用しない場合でも、動作しない場合がありました。これって、仕様なのでしょうか。
String ip = "localhost"; String port = "3307"; String db = "sample"; String user = "****"; String pass = "****"; //接続 String url = "jdbc:mariadb://" + ip + ":" + port + "/" + db; Connection con = DriverManager.getConnection(url, user, pass); Statement stmt = con.createStatement(); // テーブル作成 stmt.execute("DROP TABLE IF EXISTS test"); stmt.execute("CREATE TABLE IF NOT EXISTS test (id int, name varchar(255))"); stmt.execute("INSERT INTO test (id, name) values (1, '日本語')"); //コミット/ロールバック con.setAutoCommit(false); stmt.execute("INSERT INTO test (id, name) values (2, '英語')"); stmt.execute("INSERT INTO test (id, name) values (2, '英語')"); //con.rollback(); //動作する con.commit(); //コミット/ロールバック con.setAutoCommit(false); stmt.execute("CREATE TEMPORARY TABLE tblTmp AS SELECT DISTINCT * FROM test"); stmt.executeUpdate("DELETE FROM test"); stmt.executeUpdate("INSERT INTO test SELECT * FROM tblTmp"); stmt.execute("DROP TABLE tblTmp"); con.rollback(); //動作しない //con.commit();
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/18 10:12
2017/09/18 11:15
2017/09/18 14:41
2017/09/19 00:46 編集
2017/09/19 07:23