事务概念
事务指的是一个或一组sql语句组成一个执行单元,在这个单元中,sql语句相互依赖。这个执行单元要么全部执行,要么全不执行。
ACID属性
- 原子性(atomicity):事务是一个不可分割的各种单位,要么都发生,要么都不发生。
- 一致性(consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态
- 隔离性(isolation):一个事务的执行不能被其它事务干扰。
- 持久性(durability):一旦事务被提交,它对数据库中数据的改变是永久性的,接下来的操作和数据库故障都不应对其有影响。
事务分类
隐式事务:没有明显的开启和结束标记。如:insert,update,delete语句等
显式事务:有明显的开启和结束标记,前提是先设置自动提交功能(autocommit)为禁用(off)。
如果要查看变量的参数可以通过:show variables like ‘%变量名%’,如此处可以写成
SHOW VARIABLES LIKE '%autocommit%';
显式事务
- 开启事务
SET autocommit=0;
#将自动提交功能禁用
START TRANSACTION;
#这一步可以不写,如果写了则表示默认开启事务
注:该操作只对当前事务有效,并非永久关闭。
- 编写事务中的sql语句(select insert update delete,DDL语言没有事务之说)
- 结束事务
两个代码二选一即可
commit;
#提交事务
rollback;
#回滚事务:最后并不提交,而是返回事务前的状态
事务隔离级别
运行多个事务时会导致一些并发问题:
注意:这些问题都是在两个事务进行时发生的。举例来说就是,如果T1在更改数据,T2在T1更改前后分别读取的数据不一致,则是脏读;但是如果T2结束后,重开一个事务读取了T1更新的数据,并与T2不一致,并不算做脏读。
四种事务隔离级别:
随着隔离级别的升高,效率会降低。MySQL默认的是repeatable read。
- 查看当前事务隔离级别:
SELECT @@tx_isolation;
- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL 隔离级别;
#设置当前MySQL连接的隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
#设置全局的隔离级别
回滚点(savepoint)
指搭配rollback使用
例:
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点,取名为a
DELETE FROM account WHERE id=29;
ROLLBACK;#回滚至保存点
delete和truncate在事务中的区别
truncate是实际的删除,不支持回滚,但是delete支持。