Spring事务

Posted brook-alisa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务相关的知识,希望对你有一定的参考价值。

1.数据库事务的4个基本特征,即ACID

Atomic(原子性):数据库包含的操作被看作是一个整体的业务单元,该业务单元内的操作要么全部成功,要么全部失败。

Consistency(一致性):事务在完成时,必须使所有的数据保持一致的状态。

Isolation(隔离性):多线程同时操作同一数据时,会产生数据丢失,通过设置隔离级别,尽可能压制数据丢失的发生。

Durability(持久性):事务结束后,所有的数据都会固化到一个地方,比如放在磁盘中,即使断电重启也可以再次提供给程序使用。

 

2.隔离性中的隔离级别:未提交读,读写提交,可重复读,串行化

未提交读(read uncommitted)是最低的隔离级别,允许一个事务读取另外一个事务未提交的数据,容易发生脏读。

读写提交(read committed)是指一个事务可以读取另一个事务已经提交的数据,不能读取未提交的数据,缺点不可重复读。

可重复读(read repeatable)克服了不可重复读的问题,当一个事务未提交时,另一个事务不允许读取该数据,会产生幻读。

*注*:可重复读针对数据库的单条数据记录,幻读针对的是多条记录。

串行化(Serializable)是数据库最高隔离级别,保证所有的SQL按照顺序执行,所以能够完全保证数据的一致性,但是并发性能很低。

 

隔离级别和可能发生的现象如下:

项目类别 脏读 不可重复度 幻读
未提交读 Y Y Y
读写提交 N Y Y
可重复读 N N Y
串行化 N N N

对于隔离级别,不同的数据库的支持也有所不同:

Oracle只能支持读写提交和串行化,默认读写提交

MySQL支持以上四种,默认可重复读

 

3.事务的传播行为

传播行为是方法之间调用事务采取的策略问题。

Spring事务机制中存在7种传播行为,通过枚举类Propagation定义。

REQUIRED:默认传播行为,如果当前存在事务,就沿用当前事务,否则新建一个事务运行子方法。

REQUIRES_NEW:无论当前事务是否存在,都会新建事务运行方法,并且新事务拥有新的锁和隔离级别等特性,与当前事务相互独立。

SUPPORTS:支持事务,如果当前存在事务就沿用此事务,否则以无事务状态运行。

NOT_SUPPORTED:不支持事务,当前存在事务时,将挂起事务运行方法。

MANDATORY:必须使用事务,如果当前没有事务,则会抛出异常,如果存在当前事务就沿用此事务。

NEVER:不支持事务,如果当前存在事务,则会抛出异常,否则以无事务状态运行。

NESTED:在当期方法调用子方法时,如果子方法发生异常,则只回滚子方法执行的SQL,不回滚当前方法的事务。

 常用的三种传播行为:REQUIRED,REQUIRES_NEW,NESTED

 

以上是关于Spring事务的主要内容,如果未能解决你的问题,请参考以下文章

Spring本地事务

如何手动开启spring事务

spring的读写事务和只读事务的区别

什么叫做spring的声明式事务

Spring框架--Spring事务管理和Spring事务传播行为

Spring框架--Spring事务管理和Spring事务传播行为