概要
タイトルの通りSQLのTips的なサンプルコードです。MySQLで動作確認をしています。
内容的には個人的な備忘録になるかもしれませんが、随時更新していきます。
環境
- Windows10 Professional
 - MySQL 5.6.25
 
参考
- [MySQL 5.6 リファレンスマニュアル / 関数と演算子 / その他の関数] (https://dev.mysql.com/doc/refman/5.6/ja/miscellaneous-functions.html)
 
時間のかかるクエリを疑似的に発生させる
SLEEP関数を使用します。
> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
|         0 |
+-----------+
1 row in set (10.00 sec)
技術検証や動作確認などでタイムアウトを意図的に起こしたい場合、下記のようなビューを作り、それに対して問い合わせを行います。
CREATE OR REPLACE VIEW temp_v (
      id
    , sleep
    , create_at ) AS
SELECT UUID() AS id
    , SLEEP(10) AS sleep
    , NOW() AS create_at
;
mysql> select * from temp_v;
+--------------------------------------+-------+---------------------+
| id                                   | sleep | create_at           |
+--------------------------------------+-------+---------------------+
| 68ce1e08-940a-11e7-9c5f-1c6f65331b46 |     0 | 2017-09-07 21:23:28 |
+--------------------------------------+-------+---------------------+
1 row in set (10.00 sec)
Javaでは下記のようなエンティティクラスを作成しJPAで検索すると結果が返るまで10秒かかります。
このことを利用してトランザクションタイムアウトを意図的に発生させることができます。
エンティティクラス
@Entity
@Table(name="temp_v")
public class Temp implements Serializable {
    private static final long serialVersionUID = -7295335149208136304L;
    @Id
    private String id;
    @Column(name="sleep")
    private Integer sleep;
    @Column(name="create_at")
    private LocalDateTime createAt;
    @Override
    public String toString() {
        return "Temp{" +
                "id='" + id + '\'' +
                ", sleep=" + sleep +
                ", createAt=" + createAt +
                '}';
    }
}