AS400のDB2では、通常ではトランザクションが扱えないようです。ただし、ジャーナル処理を設定すれば扱えるようになるみたいです。*1
で、今回の案件。
- ジャーナルは作成しない
- IDはテーブルを使って採番
という方針があり、それと関連してFOR UPDATEについてあれこれ調べたりしてました。
DB2で「SELECT … FOR UPDATE」のロックを検証 – 130単位
S2JDBC DB2DialectでのforUpdate()を調べてみた – 130単位
さて、Javaには「synchronized」という修飾子があるそうです。これをメソッドの宣言に記述すれば、排他処理が行えるとのこと。
というわけで、S2JDBCのサービスにid採番用のメソッドを書いてみます。
- 採番用テーブルのカラムはkeyとvalueのみ
- エンティティを作成してSQL自動生成で記述
- 各サービスから扱えるようにAbstractServiceに定義
- 最初の採番時、対象キーのレコードが無くても動作可
- valueカラムの現在値=次に採番される値
こんな感じの仕様です。
で、synchronizedが実際に効くのかどうか試してみましたが、いまいちわかりませんでした。
- トランザクションは無しに設定
- メソッドの採番中にユーザーAのみ分岐されるThread#sleep()を仕込む
- ユーザーAにて採番実行
- ユーザーBにて採番実行
こんな手順でやってみたのですが、synchronizedがない状態でも3の時点で止まってくれました。おそらく検証方法がまずいのか、理解が足りないかのどちらかかと思われますが…。考えてもわからないので、ひとまず一区切りとしたいと思います。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92146 人正在系统学习中 相关资源:番茄助手2017破解版_vs2017番茄助手-C++工具类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!