事务(Transaction)
什么是事务
1.事务是并发控制的单元, 所谓事务, 它是一个操作序列, 这些操作要么都执行,要么都不执行, 它是一个不可分割的单位. 在关系型数据库中,一个事务可以是一条sql语句,一组sql语句,整个程序。
事务的四大特性(ACID)
1.A(Atomic)
(1)原子性 : 事务中包含的操作被看作一个逻辑单元,对于事务进行的增加修改等操作,要么都执行,要么都不执行
2.C(Consistency)
(1)一致性 : 事务在完成时, 必须所有的数据都保持一致状态
①而且在相关数据中,所有的规则都必须应用于事务的修改,以保持所有数据的完整性
3.I(Isolation)
(1)隔离性 : 事务与事务之间是隔离开的,事务在正确提交之前,他可能的结果不应该显示给其他事务
4.D(Durability)
(1)持久性 : 事务正确提交之后, 结果将永远保存在数据库中。
并发下事务会产生什么问题?
1.更新丢失 : 两个事务都去企图更新同一行数据,导致事务抛出异常退出, 那么两个事务的更新白费
2.脏读 : 一个事务读到另一个事务没有提交的数据
3.不可重复读 : 一个事务范围两个相同的查询却返回了不同的数据
4.幻读 : 一个事务读第一次取到的数据比后来读取到的数据条目少或多
事务的隔离级别(Isolation level)
1.事务的隔离级别,就是为了解决以上几种问题而出现的
2.事务的隔离级别越高,在并发情况下产生的问题就越小,但是同时付出的性能消耗就越大,因此很多时候必须在并发与性能之间做一个权衡
隔离级别
1.读操作未提交(ISOLATION_READ_UNCOMMITTED)
允许读取未提交的数据,无法避免脏读,幻读,不可重复读
2.读操作已提交(ISOLATION_READ_COMMITTED)
只允许读取已经提交的数据,可以避免脏读,但是无法避免幻读,不可重复读
3.可重复读(ISOLATION_REPEATABLE_READ) : MySQL的默认隔离级别
说明事务保证能够再次读取相同的数据,能够避免脏读,不可重复读,不可以避免幻读
4.串行化(ISOLATION_SERIALIZABLE)
提供了非常严格的事务隔离,能够保证任何并发情况下的问题发生,但是效率最低,因此没人使用
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted(未提交读) | √ | √ | √ |
read committed(提交读) | × | √ | √ |
repeatable read(可重复读) | × | × | √ |
serializable (可串行化) | × | × | × |