谈谈事务及Spring事务

一 什么是事务?
1 事务的定义
我们先看看下面几种定义:
百度百科:事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

下面是我选取的二个网友在博客中的定义:

事务:是数据库中一个单独的执行单行(Unit),事务就是由一种数据操纵语言DML语句组成,这一组DML要么全部成功要么全部失败,是一个整体。

事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)。

综上,事务就是一组操作集合,这组集合中的操作要么全部执行,要么全部不执行;这组操作集合是操作数据库的一个单独的程序执行单元,而这个执行单元是用来更新数据库中各项数据的。

2 事务的四个特点

事物的四个特性(ACID)

● 原子性(Atomicity):事务中包含的操作指令,要么全部执行,要么全部不执行。只要其中一个操作指令执行失败,所有的操作指令都执行失败,数据进行回滚,回到执行指令前的数据状态。

● 一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

● 隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

● 持久性(Durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

3 事务的隔离级别
① Read uncommitted (读未提交):最低级别,任何情况都无法保证。

② Read committed (读已提交):可避免脏读的发生。

③ Repeatable read (可重复读):可避免脏读、不可重复读的发生。

④ Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

4 事务不隔离会怎样?

●脏读:(针对未提交数据)如果一个事务中对数据进行了更新,但事务还没有提交,另一个事务可以“看到”该事务没有提交的更新结果,这样造成的问题就是,如果第 一个事务回滚,那么,第二个事务在此之前所“看到”的数据就是一笔脏数据。

●不可重复读:(针对其他提交前后,读取数据本身的对比)一个事务两次读同一行数据,可是这两次读到的数据不一样。不可重复读取是指同一个事务在整个事务过程中 对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据,一次,两 次结果是不同的。
●幻读:(针对其他提交前后,读取数据条数的对比) 一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
●丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
注:不可重复都和幻读主要的区别是:前者注重的是数据修改,后者是数据添加。

二 Spring 事务

Spring为事务提供了完整的支持,Spring用来管理事务的一组API称为Spring事务。
1 Spring事务的特点:
①支持主流的事务API,如JTA(Java Transaction API)、JDBC(Java Database Connectivity)、Hibernate、JPA(Java Persistence API)等;
②支持声明式事务,更容易地管理事务
③程序接入简单;
④Spring事务与其它Spring框架很好的集成。

2 Spring的事务实现方式
●声明式事务
通常情况下只需要一个 **@Transactional **就可以。
●编程式事务
编程式事务是指将事务管理代码嵌入嵌入到业务代码中,来控制事务的提交和回滚。
比如说,使用 TransactionTemplate 来管理事务。

3 Spring事务默认设置
默认的事务能力是:
●传播机制是REQUIRED,即当前无事务时新建一个事务,当前存在事务,则加入该事务中。
●隔离级别是DEFAULT,即使用数据库默认的隔离级别,那么数据库层默认的隔离级别是REPEATABLE_READ (可重复读)。
●transaction is read-write。服务于传播机制,相对应的read-only来表明只做只读操作。
●默认超时时间,跟随底层事务服务提供方,如果不支持超时逻辑则没有。
●回滚机制适用于RuntimeException。checked Exception不会触发。

猜你喜欢

转载自blog.csdn.net/helloworldchina/article/details/127635400