MySQL 事务的隔离级别和传播机制

本文详细阐述了数据库事务的原子性、一致性、隔离性和持久性特性,介绍了不同隔离级别的概念,以及Spring框架中的传播机制,帮助读者掌握事务处理的核心原理。
摘要由CSDN通过智能技术生成

数据库事务的特性

原子性

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性

事务前后数据的完整性必须保持一致。

隔离性

并发操作数据时,不同事务的操作不会对彼此产生干扰。

持久性

事务一旦被成功提交,其对数据库中数据的改变是永久性的,即使数据库发生故障也不应该对其有任何影响。

隔离级别

类型描述
脏读事务1对数据有修改操作,但修改未提交的情况下,事务2使用了该数据,因为这个数据还没提交,所以另一个事务读取的数据是脏数据。
不可重复读同一事务中,多次读取同一数据返回的结果不一样
幻读事务1查询数据,不存在某个数据则新增,在此新增操作未执行前,事务2新增了此数据,在事务1再次查询数据的时候,就出现了数据不一致

1. ISOLATION_DEFAULT

默认的隔离级别,使用数据库默认的事务隔离级别。
SqlServer、Oracle默认Read Commited;
MySql默认Repeatable Read。
在隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。

2. ISOLATION_READ_UNCOMMITTED

读未提交,事务最低的隔离级别。在并发事务中,允许一个事务可以读到另一个事务未提交的更新数据。
会出现脏读、不可重复读、幻读。

3. ISOLATION_READ_COMMITTED

读已提交。在并发事务中,保证一个事务修改的数据提交后,才会被另一个事务读取到。
会出现不可重复读,幻读。

4. ISOLATION_REPEATABLE_READ

可重复读。此隔离级别可以防止脏读、不可重复读。一般采用快照的方式实现。
可能会出现幻读。

5. ISOLATION_SERIALIZABLE

序列化顺序执行事务,事务最高的隔离级别,但是花费时间最高。可以避免脏读,不可重复读,幻读。

传播机制

1. PROPAGATION_REQUIRED (默认的传播机制)

在事务环境下被调用,就加入该事务;否则为其创建一个新事务。

2. PROPAGATION_SUPPORTS

在事务环境下被调用,就加入该事务;在非事务环境下被调用,就以非事务的方式运行。

3. PROPAGATION_MANDATORY

业务方法只能在事务环境中运行,不能发起自己的事务;如果在非事务环境下运行,则抛出异常。

4. PROPAGATION_REQUIRESNEW

不管是否存在于事务中,都会为其起一个新事务。
如果被调用的业务方法,存在于事务中,则原事务挂起,新事务被创建,直到新事务执行结束,原事务才会恢复执行。
事务相互隔离,回滚成功失败互不影响,但外层事务可以捕获内层抛出的异常。

5. PROPAGATION_NOT_SUPPORTED

业务方法不需要事务。
如果业务方法在事务环境下被调用,该事务会被挂起,直到业务方法执行完成,原先的事务才会恢复执行。
外层回滚不影响内层操作,但是抛出的一样可以被外层事务捕获。

6. PROPAGATION_NEVER

业务方法绝不能在事务范围内执行。
如果业务方法在事务环境下被调用,就会抛出异常;只有在非事务环境下,才能正常执行。

7. PROPAGATION_NESTED

如果没有活动事务,则按REQUIRED属性执行。
它使用了一个单独的事务,拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSource TransactionManager事务管理器有效。
开启一个嵌套的事务,它是已存在事务的子事务。嵌套事务开始执行时,它将取得一个保存点,如果这个嵌套事务执行失败,将会回滚到此保存点,嵌套事务是外部事务的一部分,只有外部事务结束后,它才会被提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值