什么是事务
Transaction
一个事务对应一个不可再分单位,一个事物
事务特性(4大特性ACID)
- 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
要么都做,要么都不做 - 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
a+b=100,不管如何转账,最终结果a+b还是要100 - 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
执行事务a,执行事务b,两个事务并发互相干扰,将两个事务a、b相互隔离 - 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
事务一旦提交成功,数据变更将永久性保存,不受其他影响
隔离性产生的问题
更新丢失
脏读
不可重复读
幻象读(虚读)
设置事务隔离级别
数据库事务的隔离级别有4个,
- Read uncommitted(未授权读取、读未提交)
- Read committed(授权读取、读提交)
- Repeatable read(可重复读取)
- Serializable(序列化)
这四个级别可以逐个解决脏读、不可重复读、幻象读这几类问题。级别越高,越能保证数据完整性和一致性,对并发性能也影响大。
MySQL默认隔离级别Repeatable read;大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。能够避免脏读取,性能较好,相对不可重复度、幻象读、第二类丢失更新,可以通过悲观锁和乐观锁进行操作控制。