Spring 声明式事务
编程式事务:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务
声明式事务:通过xml或者注解配置的⽅式达到事务控制的⽬的,叫做声明式事务
事务的概念
事务指逻辑上的⼀组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。从⽽确保了数据的准确与安全
事务的四大特性
- 原子性(Atomicity) 原⼦性是指事务是⼀个不可分割的⼯作单位,事务中的操作要么都发⽣,要么都不发⽣。从操作的⻆度来描述
-
⼀致性(Consistency) 事务必须使数据库从⼀个⼀致性状态变换到另外⼀个⼀致性状态。⼀致性是从数据的⻆度来说的
-
隔离性(Isolation) 事务的隔离性是多个⽤户并发访问数据库时,数据库为每⼀个⽤户开启的事务,每个事务不能被其他事务的操作数据所⼲扰,多个并发事务之间要相互隔离
- 持久性(Durability) 持久性是指⼀个事务⼀旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发⽣故障也不应该对其有任何影响
事务的隔离级别
不考虑隔离级别,会出现以下情况:(以下情况全是错误的),也即为隔离级别在解决事务并发问题
- 脏读:⼀个线程中的事务读到了另外⼀个线程中未提交的数据。
- 不可重复读:⼀个线程中的事务读到了另外⼀个线程中已经提交的update的数据(前后内容不⼀样)
- 虚读(幻读):⼀个线程中的事务读到了另外⼀个线程中已经提交的insert或者delete的数据(前后条数不⼀样)
数据库定义了四种隔离级别:
- Serializable(串⾏化):可避免脏读、不可重复读、虚读情况的发⽣。 (串⾏化) 最⾼
- Repeatable read(可重复读):可避免脏读、不可重复读情况的发⽣,该机制下会对要update的⾏进⾏加锁。 (幻读有可能发⽣) 第⼆
- Read committed(读已提交):可避免脏读情况发⽣。不可重复读和幻读⼀定会发⽣。 第三
- Read uncommitted(读未提交):最低级别,以上情况均⽆法保证。 (读未提交) 最低
注意:级别依次升高,效率依次降低
MySQL的默认隔离界别是:REPEATABLE READ
查询当前使用的隔离级别:select @@tx_isolation;
设置MySQL事务的隔离级别:set session transaction isolation level xxx; (设置的是当前mysql连接的会话,并不是永久改变的)
事务的传播行为
事务一般在service层进⾏控制,如果出现service层⽅法A调⽤了另外⼀个service层⽅法B,A和B⽅法本身都已经被添加了事务控制,那么A调⽤B的时候,就需要进⾏事务的⼀些协商,这就叫做事务的传播⾏为
下表为spring的事务传播行为:加粗为常用的
|
PROPAGATION_REQUIRED
|
如果当前没有事务,就新建⼀个事务,如果已经存在⼀个事务中,加⼊到这个事务中。这是最常⻅的选择
|
|
PROPAGATION_SUPPORTS
|
⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏
|
|
PROPAGATION_MANDATORY
|
使⽤当前的事务,如果当前没有事务,就抛出异常
|
|
PROPAGATION_REQUIRES_NEW
|
新建事务,如果当前存在事务,把当前事务挂起
|
|
PROPAGATION_NOT_SUPPORTED
|
以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起
|
|
PROPAGATION_NEVER
|
以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常
|
|
PROPAGATION_NESTED
|
如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则执⾏与PROPAGATION_REQUIRED类似的操作
|
Spring 中事务的API
public interface PlatformTransactionManager { /** * 获取事务状态信息 */ TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; /** * 提交事务 */ void commit(TransactionStatus status) throws TransactionException; /** * 回滚事务 */ void rollback(TransactionStatus status) throws TransactionException; }
作用:
此接⼝是Spring的事务管理器核⼼接⼝。Spring本身并不⽀持事务实现,只是负责提供标准,应⽤底层⽀持什么样的事务,需要提供具体实现类。此处也是策略模式的具体应⽤。在Spring框架中,也为我们内置了⼀些具体策略,例如:DataSourceTransactionManager , HibernateTransactionManager 等
浙公网安备 33010602011771号