1 事务简介
数据库中的事务是一个最小不可分割的单元,可以维护数据库的完整性,它保证一组SQL语句要么同时执行,要么同时不执行。在Mysql中,InnoDB引擎支持数据的事务处理。使用事务处理只能用来管理insert、update和delete语句,既可以执行数据表的更改操作,也可以不执行进行回滚。
2 开启事务
有两种方式开启:
begin; --第一种方式
start transaction; --第二种方式
3 提交和回滚
开启事务之后,可以运行想要执行的sql代码,例如insert、update和delete语句等,也可以执行create和drop,但是只有insert、update和delete语句可以进行回滚操作,其他语句均默认提交。执行完commit或rollback后,数据库自动关闭事务。
commit; --提交
rollback; --回滚
对于常规的sql语句默认的操作是执行即提交,可以使用如下语句查看当前的提交状态:
select @@autocommit;
如果显示为1,则默认执行即提交,如果显示为0,则为可以手动提交。
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
4 事务的四大特性(ACID)
- 原子性(Atomicity):事务是最小的单位,不可以再分割
- 一致性(Consistency):同一事务的sql语句,必须同时成功或同时失败
- 隔离性(Isolation):事务1和事务2是隔离的
- 持久性(Durability):事务一旦结束,不可以返回
5 事务的隔离级别
由于数据库中的存在事务操作,如果在并发的情况下每个事务的不能完全的隔离,即一个事物不应该被另一个事务所干扰,就会出现如下状况:
- 脏读:A开启事务,执行insert,但没有提交,而B查询到了没有提交的结果。
- 不可重复读:A查询结果,B开启事务进行修改并提交,A再次查询的结果为B提交以后的,A两次查询不一致。
- 幻读:A查询结果,B插入或者删除数据,A再次查询的结果不一致。
其中,不可重复读的重点在于修改,而幻读的重点在于新增或删除。针对上述状况,数据库提供了四种隔离级别,分别用不同的锁实现。
- 读未提交的(read uncommitted):可能会出现脏读、不可重复读、幻读
- 读已提交的(read committed):可能会出现不可重复读、幻读,不会出现脏读
- 可以重复读(repeatable read):可能会出现幻读,不会出现脏读和不可重复读
- 串行化(serializable):不会出现脏读、不可重复读、幻读
四种隔离级别中,串行化(serializable)的级别最高,而读未提交的(read uncommitted)级别最低,大多数数据库的默认隔离级别为读已提交的(read committed),例如Sql Server和Oracle,少数数据库的默认隔离级别为可以重复读(repeatable read),例如Mysql InnoDB的存储引擎。