「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。
什么是事务
事务( transaction )是一次处理的基本单元,一次事务的操作要么全部执行完成,要么全部不执行。另外事务还允许回滚、还原,所以事务是非常适合安全性较高的场景中,比如金融付款等等。
在 mysql 中,事务是 innodb 取到 myisam 的主要原因。事务有以下四个基本特性(ACID):
- 原子性(atomicity),即事务是不可分割的
- 一致性(consistency),是指事务需要从一个一致性状态变到另外一种一致性状态,这种一致性的约束是业务规定的
- 隔离性(isolation),每个事务都是彼此独立的,不会收到其它事务的影响
- 持久性(durability),事务提交后对数据的修改是持久性的,即使在系统出了问题,也能成功恢复数据状态
持久性通常通过事务日志来保证,通常包括回滚日志和重做日志,其中先写重做日志再进行数据库改写,这样即使数据库崩溃也可以通过重做日志来写数据库。
如何写事务
事务的常用控制语句有:
- BEGIN:显式开启一个事务;
- COMMIT:提交事务,提交了之后对数据库的修改是永久性的;
- ROLLBACK:撤销没有进行提交的修改;
- SAVEPOINT:在事务执行过程中创建保存点,方便后续针对保存点进行回滚;
- SET TRANSACTION:设置事务的隔离级别
事务分为显式提交和自动提交,innodb默认自动提交
CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO test SELECT 'a'; COMMIT; INSERT INTO test SELECT 'b'; INSERT INTO test SELECT 'c'; ROLLBACK; SELECT * FROM test;
由于mysql是自动提交,所以 INSERT INTO test SELECT 'b'; 这个语句依然作为一个独立事务依然执行成功,只对 INSERT INTO test SELECT 'c'; 进行了回滚。
有了事务使数据库的安全性大大提高。