Java Spring事务
发布时间:2023-02-14 23:37:07 265
相关标签: # 数据库# 数据
三种问题
-
脏读
:A事务读取了并发事务B未提交的数据。若并发事务B失败导致回滚,则A读取到数据为不正确数据,即脏数据 -
不可重复读
:A事务对某一字段进行多次读取,在两次读取过程中B事务对改数据进行修改,导致A两次读取数据结果不一致 -
幻读
:A事务读取两次数据,在此过程中B事务新增/删除数据,导致两次读取数据集合
不一致。例如:A事务将某字段所有数据更新为1,此时B事务插入一条该字段值为2的数据,A再次读取,发生幻读。
四大特性(ACID)
-
原子性
:事务所包含所有操作要么全部成功,要么全部失败回滚 -
一致性
:事务必须由一个状态到另一个状态,事务执行之前和执行之后都必须处于一致性状态(要么成功,要么失败,不存在第三种状态) -
隔离性
:事务并发执行时,不能被其他事务干扰,多个并发事务间要相互隔离 -
持久性
:事务一旦提交,对数据库中数据改变就是永久性的,任何错误都不会影响该事务的执行结果
五种隔离级别
-
ISOLATION_DEFAULT
:默认隔离级别 -
ISOLATION_READ_UNCOMMITED
:读未提交。最低隔离级别,允许读取未提交的事务数据,可能导致脏读、幻读、不可重复读 -
ISOLATION_READ_COMMITED
:读已提交。允许读取并发事务已提交的数据,可以防止脏读 -
ISOLATION_REPEATABLE_READ
:可重复读。对同一字段多次读取结果是一致的,可以阻止脏读和不可重复读。 -
ISOLATION_SERIALIZABLE
:串行化。最高的隔离级别。完全服从ACID的隔离级别。所有事务逐次执行,效率低,影响程序性能。
六种传播级别
支持当前事务情况
-
PROPAGATION_REQUIRED
:如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。 -
PROPAGATION_SUPPORTS
:如果当前存在事务,则加入该事务;如果不存在事务,则以非事务的方式运行。 -
PROPAGATION_MANDATORY
:如果当前存在事务,则加入该事务;如果不存在事务,则抛出异常。
不支持当前事务情况
-
PROPAGATION_REQUIRES_NEW
:创建一个新的事务,如果当前存在事务,则把当前事务挂起 -
PROPAGATION_NOT_SUPPORTED
:以非事务方式运行,如果当前存在事务,则把当前事务挂起 -
PROPAGATION_NEVER
:以非事务方式运行,如果当前存在事务,则抛出异常
其他情况
-
PROPAGATION_NESTED
:如果存在当前事务,则创建一个新事物作为嵌套事务运行;否则与PROPAGATION_REQUIRED
一样
文章来源: https://blog.51cto.com/u_11958276/6040565
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报