mysql:13102
From: Tetsuro IKEDA <Tetsuro IKEDA <te.ikeda@xxxxxxxxxx>>
Date: Mon, 19 Jun 2006 09:46:49 +0900
Subject: [mysql 13102] Re: 排他制御????
池田です。 > これって、排他制御というのですか。??? 概ね合っていると思います。 以下のコードでは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
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: : 排他制御????