事务隔离特性
支持事务的数据库必须满足四个特性:
- 原子性:整个操作要么执行成功,要么执行失败
- 持久化:事务提交后就持久化到数据库
- 隔离性:各个事务之间是相互隔离的
- 一致性:事务开始前和开始后,数据的完整性没有破坏。如A向B转账,不可能A扣了钱,B没收到钱
概念
- 脏读: 可以读到其他事务没有提交的数据。
- 不可重复读:多次查询期间,有人进行了更新操作,读取的数据不一致。
- 幻读:多次查询期间,有人进行了新增、删除操作,读取的数据发生了变化。一脸懵逼,刚才发生了什么。
事务隔离级别
- 读未提交读(read uncommit):可以读到没有提交的数据
- 提交读(read commited):只能读到其他事务已经提交的数据,并不是加锁使用了快照读
- 可重复读(repeated read):多次读取,读到的数据都是一样的。不能避免幻读( insert or delete)
- 序列化(Serializable):一个一个来,串行执行
事务隔离级别
- PROPATION_REQUIRED_NEW: 开启一个新事务,如果当前已经存在事务则挂起
- PROPATION_REQUIRED: 如果当前有事务,则加入当前事务,如果当前没有事务,则创建一个新的
- PROPATION_NOT_SUPPORT: 非事务的执行,如果存在一个活动事务则挂起
- PROPATION_NEVER: 总是非事务的执行,如果存在一个活动事务则抛出异常
- PROPATION_MANDATORY: 如果存在一个事务,则支持当前事务。如果没有一个活动的事务,则抛出异常。
- PROPATION_SUPPORTS: 如果当前方法存在一个事务,则将方法置于同一个事务,如果之前不存在事务,则以非事务执行
- PROPATION_NESTED: 如果一个活动的事务存在,则运行一个嵌套的事务中。如果没有活动事务,则按PROPATION_REQUIRED属性执行。
区别
假设服务A调用服务B:
情景 | requires_new(两个独立的事务) | nested(B嵌套在A的事务里) | required(同一个事务) |
---|---|---|---|
A和B都正常提交 | B先提交,A再提交 | A和B一起提交 | A和B一起提交 |
B抛异常,A正常 | 1.A有catch B的异常,B回滚,A正常提交;2.A没有catch B的异常,B回滚,A再回滚 | B先回滚,A再回滚 | A和B一起回滚 |
B正常,A异常 | B正常提交,A回滚 | A和B一起回滚 | A和B一起回滚 |
A和B都异常 | B先回滚,A再回滚 | A和B一起回滚 | A和B一起回滚 |
网友评论