@@TRANCOUNT
トランザクションが開始されているかの判定に使用する
開始されていれば1以上の数値が返ってくる
@@TRANCOUNT = 0の時にROLLBACKをしようとするとエラー
トランザクションの入れ子での@@TRANCOUNTの推移イメージ
code:sql
select @@TRANCOUNT; /* 最初は0 */
begin transaction;
select @@TRANCOUNT; /* 1つ目のトランザクション始まりなので@@TRANCOUNTは1 */
/* なにかしらの前処理… */
begin transaction;
select @@TRANCOUNT; /* transactionの入れ子始まり、1インクリメントで@@TRANCOUNTは2 */
/* なにかしらのSQL処理… */
commit;
select @@TRANCOUNT; /* 内側のtransactionをコミット、1デクリメントで@@TRANCOUNTは1 */
/* なにかしらの後処理… */
commit;
select @@TRANCOUNT; /* 1つ目のtransactionをコミット、1デクリメントで@@TRANCOUNTは0 */
途中でロールバックが入ったときのイメージ
code:sql
select @@TRANCOUNT; /* 最初は0 */
begin transaction;
select @@TRANCOUNT; /* 1つ目のトランザクション始まりなので@@TRANCOUNTは1 */
/* なにかしらの前処理… */
begin transaction;
select @@TRANCOUNT; /* transactionの入れ子始まり、1インクリメントで@@TRANCOUNTは2 */
/* なにかしらのSQL処理… */
--commit;
rollback; /* ここだけロールバックに書き換えてしまった!このまま続けると次のcommitに対応するトランザクションがないのでエラーになる… */
select @@TRANCOUNT; /* 一行上でrollbackしているので@@TRANCOUNTは0に */
/* なにかしらの後処理… */
commit; /* ここでエラー */
(以下実行されず)