Transaction
What Is a Transaction
- Transaction 是一种将许多个SQL statements整合到一起执行的技术,当序列中某个statement出错时,会复原之前statement所做的更改。
example (pseudocode)
START TRANSACTION UPDATE account SET avail_balance = avail_balance - 500 WHERE account_id = 9988 AND avail_balance > 500 IF <excatly one row was updated by the previous statement> THEN UPDATE account SET avail_balance = avail_balance + 500 WHERE account_id = 9989; IF <excatly one row was updated by the previous statement> THEN COMMIT; ELSE ROLLBACK; END IF; ELSE ROLLBACK; END IF;- 只有前面的query执行完毕,后续的query才能执行
- 遇到任何的query出现bug时,则会使用rollback撤回之前的操作。
- 当遇到commit和rollback执行前,服务器突然宕机,则会在重新登录时,执行rollback操作,撤回之前的操作
- 当完成transaction发出commit的过程中,服务器突然宕机,则会在重启时,重新执行一次commit操作。
Starting a Transaction
two ways of Transaction
- Transaction 和 database session 相联系,不需要明确声明Transaction开始,当最近的Transaction 结束,服务器会自动开始新的Transaction.
- 除非明确声明Transaction开始,否则,单独的SQL statement会被独立执行。为了声明Transaction开始,必须在开头加一行statement.
第一种方式的优势在于:当某些执行存在一定问题时,可以撤销之前的执行操作;MySQL采用第二种方式,因此,一旦单独的statement被执行,就无法通过Transection撤回。
START TRANSACTIONorBEGIN TRANSACTION- 关闭
auto-commit mode:SET AUTOCOMMIT = 0;
Ending a Transaction
commitsave change permanentrollbackundo其他导致Transaction停止的因素
- 服务器宕机,会在重启后自动roll back
- 采用SQL schema statement, 如
ALERT TABLE会导致之前的操作直接commited. 因此,SQL schema statement 必须在Transaction之外 - 新启一个
start transaction,会导致之前的transaction直接commit - 探测到 dead-lock 导致服务器停止对Transaction的运行,并执行rollback操作,并返回错误信息。
- deadlock 当两个不同的transaction都在等待对方的lock资源时,例如:A Transaction刚写完
account table,打算接下来得到transactiontable的write lock,B Transaction 刚写完transaction,希望得到account table的 write lock, 这样会导致两个transaction一直等待对方释放write lock,陷入死循环。当服务器检测到这个情况是,会掐断一个Transaction的进程,使其会退到执行之前的情况,让另一个Transaction先执行。 - 降低deadlock出现频率的方法:尽量让所有的操作以同样的顺序进行。
- deadlock 当两个不同的transaction都在等待对方的lock资源时,例如:A Transaction刚写完
Transaction Savepoints
MySQL 8.0+ Engines
- types of engines
- MyISAM
- nontransactional, table locking
- MEMORY
- nontransactional, in-memory tables
- CSV
- transactional, store data in comma-separed files
- InnoDB
- transactional, row-level locking
- Merge
- used to make a multiple identical MyISAM tables apear as a single table
- Archive
- used to store large amounts of unindexed data, mainly for archival purposes.
- MyISAM
Setting Engines
- 查看table engine:
SHOW TABLE STATUS LIKE '$tbl_name'; - 设置table engine:
- 新建:
CREATE TABLE $tbl_name ($fld_setting) ENGINE = $engine_type; - 修改:
ALERT TABLE $tbl_name ENGINE = $engine_type;
- 新建:
- 查看table engine:
Savepoints
- create savepoint:
SAVEPOINT $sp_name; - roll back to a particular savepoint:
ROLLBACK TO SAVEPOINT $sp_name; Example
START TRANSACTION; UPDATE product SET date_retired = CURRENT_TIMESTAMP() WHERE product_cd = 'XYZ'; SAVEPOINT before_close_accounts; UPDATE account SET status = 'CLOSED', close_date = CURRENT_TIMESTAMP(), last_activity_date = CURRENT_TIMESTAMP() WHERE product_cd = 'XYZ'; ROLLBACK TO SAVEPOINT before_close_accounts; COMMIT;