一、事务的ACID特性
1、原子性(Atomicity):
事务开始后的所有操作要么全部成功,要么全部失败,不能停在某一个环节,如果执行过程中出错,要回滚到操作之前。
2、一致性(Consistency):
事务开始前和结束后,数据库的的完整性没有被破坏,比如A向B转账,不能A账号钱扣了,而B没有收到转账。
3、隔离性(Lsolation):
同一个数据在同一时间只允许一个事务处理,不同事务之间的操作彼此之间没有干扰,比如A正在给B转账,A给B转账结束前C不能给A转账。
4、持久性(Durability):
事务执行完成后,事务对数据的所有操作都被持久化保存到数据库。
二、事务的隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED:读未提交 | 是 | 是 | 是 |
READ COMMITTED:读已提交 | 否 | 是 | 是 |
REPEATABLE READS :可重复读 | 否 | 否 | 是 |
SERIALIZABLE :串行化 | 否 | 否 | 否 |
三、并发问题
1、脏读:
事务A读取到了事务B更新的数据,然后事务B因为某种原因进行了回滚,那事务A就读取到了事务B的脏数据,称为脏读。
2、不可重复读:
读提交是指在提交以后可以读,在一个事物内两个相同的查询却返回了不同的结果。在一个事务内多次读取同一数据,这个事务还没有结束时另一个事务也读取了这个数据并做了修改,那么第一个事务有可能两次读取到的数据不一样,就是不可重复读问题。
3、幻读:
例如A将数据库中的性别全部修改为0和1表示,这个时候B插入了一条新数据用的数’男’和’女’表示,A更新完后刷新发现还有一条数据没有修改过来,就产生了幻读,幻读专指新插入的行。幻读产生的原因是行锁只能锁住行,即使把所有的行都锁上,也无法阻止新记录的插入。
四、事务的传播行为
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。
1、PROPAGATION_REQUIRED:
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
2、PROPAGATION_SUPPORTS:
如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。
3、PROPAGATION_MANDATORY:
如果已经存在一个事务,支持当前事务。如果没有事务,则抛出异常。
4、PROPAGATION_REQUIRES_NEW:
新建事务,如果当前存在事务,把当前事务挂起。
5、PROPAGATION_NOT_SUPPORTED:
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、PROPAGATION_NEVER:
以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_NESTED:
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。