mysql:13103
From: TOMTOM <TOMTOM <tomf1@xxxxxxxxxx>>
Date: Mon, 19 Jun 2006 14:21:07 +0900
Subject: [mysql 13103] Re: : 排他制御????
こんにちは、池田さん、 返信ありがとうございます。 いろいろ、試してみたのですが、 lock tablesが、期待したように、動作するみたいです。 ありがとうございました。 On Mon, 19 Jun 2006 09:46:49 +0900 Tetsuro IKEDA <te.ikeda@xxxxxxxxxx> wrote: > 池田です。 > > > これって、排他制御というのですか。??? > > 概ね合っていると思います。 > > 以下のコードではINSERT文同士をぶつけようとしていますよね。 > > 従ってInnoDBの場合なら、接続を確立した後に分離レベルを > SERIALIZABLEに変更するとかどうでしょう。 > > con = DriverManager.getConnection(url,user,pass); > con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); > > あるいはMyISAMの場合などですが、テーブルロックを使うとか。 > > stat.executeUpdate("LOCK TABLES ff WRITE"); > for(int i =0;i<100;i++){ > ・・・処理・・・ > } > stat.executeUpdate("UNLOCK TABLES"); > > いろいろ動かしながらイメージをつかんでいただければ・・・。 > > TOMTOM wrote: > > こんにちは、 > > 教えて欲しいことがあるのですが、 > > 例えば、二台のパソコンから、mysqlにデータを > > 追加している時、一方のパソコンが、追加している時は、 > > 他方は、待機して、追加が終わったとき、 > > 待機していた方が、追加更新を始めるようにしたいのです。 > > これって、排他制御というのですか。??? > > > > パソコンが一台しか、無いので、 > > javaで、スレット処理を利用して、あたかも、二台から、アクセス > > しているようなコードにして、実行したのですが、 > > 二つのスレットが交互にアクセスしているみたいで、 > > どうの様にしたら、期待した、 > > アクセスになるか、以下のプログラムを > > どのように、改造したらいいのか、教えてください。 > > > > > > 環境 win xp > > jdk 1.5 > > mysql 5.0 > > connector 3.1.11 > > > > ******************************************* > > package threadsql; > > > > import java.sql.Connection; > > import java.sql.DriverManager; > > import java.sql.SQLException; > > import java.sql.Statement; > > > > /** > > * > > * @author > > */ > > class tsql extends Thread { > > Connection con=null; > > Statement stat = null; > > String data=null; > > > > public tsql(String url,String user,String pass,String data) { > > try { > > Class.forName("com.mysql.jdbc.Driver"); > > con = DriverManager.getConnection(url,user,pass); > > stat = con.createStatement(); > > con.setAutoCommit(false); > > } catch (ClassNotFoundException ex) { > > ex.printStackTrace(); > > } catch (SQLException ex) { > > ex.printStackTrace(); > > } > > this.data=data; > > > > } > > > > public void run() { > > String sql = "insert into ff values('"+data+"')"; > > for(int i =0;i<100;i++){ > > try { > > > > int k = stat.executeUpdate(sql); > > System.out.println(data+" "+ i); > > Thread.sleep(100); > > } catch (InterruptedException ex) { > > ex.printStackTrace(); > > } catch (SQLException ex) { > > ex.printStackTrace(); > > } > > } > > try { > > con.commit(); > > stat.close(); > > con.close(); > > } catch (SQLException ex) { > > ex.printStackTrace(); > > } > > > > } > > > > } > > public class threadsql { > > > > /** Creates a new instance of threadsql */ > > public threadsql() { > > String url="jdbc:mysql://localhost/test"; > > String user = "root"; > > String pass = "*********"; > > String data ="user1"; > > tsql t1 = new tsql(url,user,pass,data); > > > > String url1="jdbc:mysql://prim/test"; > > String user1 = "user2"; > > String pass1 = "*********"; > > String data1 ="user2"; > > tsql t2 = new tsql(url1,user1,pass1,data1); > > > > > > t1.start(); > > t2.start(); > > > > } > > > > /** > > * @param args the command line arguments > > */ > > public static void main(String[] args) { > > new threadsql(); > > // TODO code application logic here > > } > > > > } > > > > ***************************************************** > > 実行結果、 > > > > user1 0 > > user2 0 > > user1 1 > > user2 1 > > user1 2 > > user2 2 > > user1 3 > > user2 3 > > -------- > > > > これを、以下の様な、実行結果にしたいのです。 > > > > user1 0 > > user1 1 > > user1 2 > > user1 3 > > -------- > > -------- > > user2 0 > > user2 1 > > user2 2 > > user2 3 > > -------- > > -------- > > > > よろしくお願いいたします。 > > > > > > > > > > > > > > > > > -- > Tetsuro IKEDA > Sumisho Computer Systems Corp. > Open Source System Div. > te.ikeda@xxxxxxxxxx > TEL +81-3-5166-2420 > FAX +81-3-5166-1189 -- 溝井 友晴 <tomf1@xxxxxxxxxx>
13101 2006-06-19 09:27 [TOMTOM <tomf1@xxxxxx] 排他制御???? 13102 2006-06-19 09:46 ┗[Tetsuro IKEDA <te.ik] -> 13103 2006-06-19 14:21 ┗[TOMTOM <tomf1@xxxxxx] Re: : 排他制御????