Spring的4种事务特性,5种隔离级别,7种传播行为

1.事务的四个关键属性(ACID)

>原子性:事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么完成要么都不完成

>一致性:事务被提交后,数据和资源就处于一种满足业务规则的一致性状态中。

>隔离性:可能有许多事务会同时处理相同的数据,因此要求每个事务都与其他事务隔离起来,防止数据损坏

>持久性:事务一旦完成,无论发生系统错误,它的结果都不会受到影响。(事务结果被写道持久化存储器中)

2.事务的传播属性

         当一个事务被另一个事务方法调用时,必须指定事务应该如何传播。事务的传播行为可以由传播属性指定。

required:如果有事务在运行,当前的方法就在该事务中运行,否则启动新的一个事务

required_new:当前的方法必须启动新的事务,并在它自己的事务内运行。如果有事务正在运行,应该将它挂起

supports:如果有事务在运行,当前方法在这个事务运行,否则它可以不运行在事务中

not_supports:当前的方法不应该运行在事务中。如果有事务运行,将它挂起

mandatory:当前的方法必须运行在事务内部,如果没有运行的事务,就抛出异常

never:当前方法不应该运行在事务中,如果有运行的事务,就将抛出

nested:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。

2.事务的隔离级别

当一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题

并发事务所导致的三个典型问题类型:

1.脏读:两个事务t1,t2 , t1读取了已经经被t2更新但没有提交的字段之后,如t2回滚,t1读取的内容就是临时无效的

2.不可重复度:两个事务t1,t2,t1读取了一个字段后,t2更新了该字段,当t1再次读取该字段,值就不同了。

3.幻读:两个事务t1,t2, t1从一个表中读取了一个字段,然后t2在该表中插入了新的行。如果事务t1再次读取同一个表,就会多出几行。

隔离级别:

default:使用底层数据库的默认隔离级别对于大多数的数据库来说,默认的隔离级别都是read_commted

read_commted:只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可以避免不可重复读和幻读

read_uncommted:允许事务读取未被其他事务提交的变更,脏读,不可重复读,幻读都会出现。

repeatable_read: 可避免脏读和不可重复读,但幻读问题仍然存在

serlalizable:所有问题都可以避免,但性能十分低下。

事务的隔离级别要得到底层数据库引擎的支持, 而不是应用程序或者框架的支持.

Oracle 支持的 2 种事务隔离级别:READ_COMMITED , SERIALIZABLE

Mysql 支持 4 中事务隔离级别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值