什么事物
事物是一条或者多条sql语句组成的执行序列,这个序列中的所有语句都属于同一个工作单元,要么同时完成,其中如果有一个失败,则其他操作都要回滚。
原子性 (Atomicity)
事物是一个不可分割的数据库逻辑工作单位,要么全部完成,要不失败回滚。
一致性 (Consistency)
事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。
隔离性 (Isolation)
一个事物的执行不能被别的并发事物所干扰
持久性 (Durability)
事物一旦提交,其对数据库的改变应该是永久的。
隔离级别
数据库4中隔离级别如下所示。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted(读未提交的) | √ | √ | √ |
Read committed (读已提交的) | × | √ | √ |
Repeatable read(可重复的) | × | × | √ |
Serializable(可串行化) | × | × | × |
脏读:即一个事物读到了另一个事物(当其执行插入,更新等操作时)未提交的数据。读脏数据一般来说是不被允许的,许多数据库默认设置的隔离级别也不会是读未提交的,如oracle默认的是读已提交的,在oracle中,当前一个事物如果未提交,其DML操作,对别的事物来说是不可见的,未提交的数据,存在高速缓存区当中,只有提交了之后才会持久化。而mysql默认的数据库隔离级别是可重复读。
不可重复读:(在没有加锁的情况下)事物A,执行前后2次执行一条sql,发现sql的结果不同,因为B事物在A事物执行第二次查询的时候,对A的结果的某些行提交了进行了更新,或者删除,并提交了事物。导致A事物,第二次查询出的结果和第一次不一样。
幻读:A事物执行一条sql查询,B事物对A事物sql的相关表添加一条数据,并提交。A事物第二次查询时发现数据行增加了。由此出现了幻读,可重复读和幻读的区别在于,前者是对已存在的数据进行并发操作,后者则是新增数据对旧的结果集的影响。有时候幻读是我们需要的,有时候是不需要的,这还得看具体业务的要求。
Serializable(可串行化) :严重影响数据库性能,一般不会用到。
企业中大多数都是使用Read commited来避免脏读,如果要避免不可重复读则需要加乐观锁或悲观锁来对,数据操作定制不同的策略来解决。