码迷,mamicode.com
首页 > 编程语言 > 详细

Spring事务

时间:2019-05-01 13:28:25      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:一个   针对   ted   port   ali   idt   new   ports   com   

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事务

标签:一个   针对   ted   port   ali   idt   new   ports   com   

原文地址:https://www.cnblogs.com/brook-alisa/p/10798903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!