事务的特性:
-
原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。
-
一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
-
隔离性(isolation):一个事务的执行不能被其他事务所影响。
-
持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。
数据库的两种事务模式
- 自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。
- 手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。
默认是自动提交模式
数据库读写中的并发事务问题
- 脏读:在事务的执行过程中,读取到了其他事务的 未提交 的数据,即读到了脏数据。
- 不可重复读:在事务的执行过程中,读到了其他事务 修改后 的数据,换句话说在该事务中的不同时间点读取到了不一致的数据,即不可重复读。
- 幻读/虚读:在事务的执行过程中,读取到了其他事务对 记录数 修改后的数据,对同一张表的两次查询的 COUNT(*) 不一致。
隔离级别
隔离级别 | 说明 | 备注 |
---|---|---|
READ UNCOMMITTED | 脏读、不可重复读、虚读都有可能发生 | |
READ COMMITTED | 避免脏读;不可重复读、虚读都有可能发生。 | Oracle 默认 |
REPEATABLE READ | 避免脏读;不可重复读、虚读有可能发生。 | Mysql 默认 |
SERIALIZABLE | 避免脏读、不可重复读、虚读 |
注意:隔离级别与系统并发性成反比,并不是隔离级别越高越好,我们需要根据具体的业务来设定隔离级别