MYSQL 5.2 を使用してAndroidからDB操作している。
使い方は、Javaと同じで特にAndroidだから何か特別な事が必要と言う事もない。
テーブルを作成しデータを作成し、レコードへ書き込む(Insert、Update)
うまく書き込めた。
・サンプル(大体こんな感じ)
public Connection mConn = null;
// SQLサーバ ユーザー名
public static final String DATABASE_USER = "user";
// SQLサーバ パスワード
public static final String DATABASE_PASSWORD = "password";
// キャラクターコード
public static final String CHARACTER_ENC = "characterEncoding";
・
・
・
Class<?> driverClass = Class.forName("com.mysql.jdbc.Driver");
// サーバーマシンのIPアドレスを設定
// ローカルにMySQLがある場合、10.0.2.2 を指定
String strCon = "jdbc:mysql://192.168.100.100:3306/test_tbl?useUnicode=true";
Driver driver = (Driver)driverClass.newInstance();
Properties prpt = new Properties();
prpt.put(DATABASE_USER, "root");
prpt.put(DATABASE_PASSWORD, "123");
prpt.put(CHARACTER_ENC, "utf8");
mConn = driver.connect(strCon, prpt);
// オートコミットの解除(トランザクション制御がしたい為)
mConn.setAutoCommit(false);
Statement stmt = _conDB.mConn.createStatement();
stmt.executeUpdate("UPDATE persondata SET age=10");
しかし、後で気づいた。
>mConn.setAutoCommit(false);これ、やってるんだから更新されてはいけない。
更新する為には明示的にCommitが必要のはず。
Commitの前にExceptionが出たらRollbakしないといけない。
Exceptionになったら、Rollbakするように記述してみた。
mConn.rollback();
executeUpdateした後、わざとExceptionを発生させロールバックしてみるも、正常に更新されてしまう。
調査して分かった事。
テーブル作成時のストレージエンジンの種類を全部「MyISAM」で作成していた。
「MyISAM」はトランザクション処理をサポートしていない。
トランザクション制御するなら有名な「InnoDB」がセオリーか。
なので、テーブルを全部「InnoDB」にしようと思ったが、それぞれ特徴があるので良く考えて変えるべき。
「MyISAM」はスピードが速いので更新しないSelectしかしない様なテーブルや更新が少ないテーブル(マスター系等)に使う。
「InnoDB」はトランザクション処理に対応しているので更新系(明細系)のテーブルに使う。
「MyISAM」はテーブルロックする
「InnoDB」はレコードロックする
まぁ、主流が「InnoDB」なので例外的に「MyISAM」を使用する機会がなければ全部「InnoDB」でもいいと思う。
とりあえず、コミットとロールバックは出来るようになって解決。
↓クリックで、このブログの評価が上がり執筆者が喜びます
にほんブログ村
0 件のコメント:
コメントを投稿