什么是事务
什么是事务?
当多个操作有这样的要求时:要么都成功要么都失败,这说明这多个操作必须在一个事务中,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
事务的四个特性?
- A:原子性(Atomicity)
事务中包括的诸操作要么全成功,要么全失败。
- B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
也就是说事务执行之前数据库数据处于正确状态,执行之后也处理正确状态,如果有些事务运行中发生故障,这些事务对数据库所做的修改有一部分已写入数据库,这时数据库就处于不正确的状态即不一致的状态。
一致性与原子性是密切相关的,如果事务没有原子性的保证,那么在发生系统故障的情况下,数据库就有可能处于不一致状态。
- C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。解决多个线程并发操作事务情况,每个事务互相不影响
- D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
隔离级别
ANSI SQL 标准定义了隔离级别,但并不是SQL数据库独有.JTA也定义了同样的隔离级别.级别越高,成本越高。
由事务隔离性引发几种问题 ?
脏读、 不可重复读 、虚读 、 丢失更新
n 脏读: 一个事务读取到另一个事务 未提交数据
n 不可重复读: 一个事务中,先后读取两次,两次读取结果不同,读取到了另一个事务已经提交的数据,此问题针对update更新来说。
n 虚读: 一个事务,先后读取两次,结果不同,读取到了另一个事务已经提交的数据 ,此问题针对insert插入来说。
n 丢失更新: 两个事务 同时修改一条数据,后提交事务,覆盖了之前提交事务结果(使用悲观锁和乐观锁处理,悲观锁性能太差,建议使用乐观锁)
隔离级别 |
含义 |
READ_UNCOMMITTED |
允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读 |
READ_COMMITTED |
允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生 |
REPEATABLE_READ |
对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。 |
SERIALIZABLE |
完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。 |
事务的隔离级别 ,是由数据库提供的 ,并不是所有数据库都支持四种隔离级别
MySQL : READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE (默认 REPEATABLE_READ)
Oracle : READ_UNCOMMITTED、READ_COMMITTED、 SERIALIZABLE(默认 READ_COMMITTED )
在使用数据库时候,隔离级别越高,安全性越高 ,性能越低
实际开发中,不会选择最高或者最低隔离级别,选择 READ_COMMITTED(oracle 默认)、REPEATABLE_READ (mysql默认)