事务的隔离级别和传播方式

一、事务的四大要素

1.1 特性

1、原子性:在事务中所有的操作都是一致的,要么成功,要不不成功。

2、一致性:事务的执行使得数据库从一种正确状态转移到另一种正确的状态。事务开始和结束,数据库的完整性约束没有被破坏。

3、隔离性:在一个事务没有提交之前,其他事务不应该修改这个事务所操作的数据,没有提交的结果也不应该被其他事务读取到。

4、持久性:事务提交后的结果将保存进数据库,提交后即使数据库出现了其他故障,也应该被保存进去。

事务的作用:事务可以保证一系列的操作有序执行。保证用户的每一次操作都是可靠的,保证了后台数据的完整性。

二、事务在并发下可能出现的问题

1、脏读:指事务A读到了事务B没有提交的数据。

2、不可重复读:指某个事务两次读到的同一个数据,数据不一致的情况。

3、幻读:指在某个事务中读到了未被操作的数据。

三、事务的隔离级别

事务的隔离级别越高在并发的情况下就越安全,同时系统付出的性能代价越大。

1、default

2、read_uncommitted:读未提交,不可以防止脏读、不可重复读、幻读,一般使用较少。

3、read_committed:读已提交,可以防止脏读。不可以防止不可重读读、幻读。

4、repeatable_read:可重复读,可以防止脏读、不可重复读,不可防止幻读。读一条数据,这个事务不结束,别的事务就不可以修改这条数据。

5、串行化:可以防止脏读、幻读、不可重复读。事务串行执行,一个事务执行完了才可以执行另外一个。

mysql默认的隔离级别是repeatable_read。

四、Spring中7种事务传播类型

1、@Transactional(propagation=Propagation.REQUIRED) 

required:支持当前事务,如果当前没有事务,将会新建一个事务。

2、@Transactional(propagation=Propagation.SUPPORTS)

supports:支持当前事务,如果当前没有事务,就一非事务的方式运行。

3、@Transactional(propagation=Propagation.MANDATORY) 

mandatory:强制必须有事务,如果没有事务将抛出异常。

4、@Transactional(propagation=Propagation.REQUIRES_NEW) 

requires_new:新建事务,如果当前存在事务,将此事务挂起。事务A的方法调用事务B的方法,事务B是requires_new,那么事务A将会被挂起,等事务B提交后才继续执行事务A。事务B失败了,则事务B回滚,事务A不会。失败后抛出的异常被事务A捕捉到后,事务A仍然可以事务提交成功。

5、@Transactional(propagation=Propagation.NOT_SUPPORTED) 

not_supported:已非事务方式运行,如果当前存在事务,那么将此事务挂起。等待此方法已非事务方式执行完后,再继续执行此事务。

6、@Transactional(propagation=Propagation.NEVER) 

never:不能在事务方式中运行,如果当前存在事务则抛出异常。

7、@Transactional(propagation=Propagation.PROPAGATION_NESTED) 

nested:如果当前存在事务,就嵌套在事务之中运行,如果不存在和requires_new类似。

Kommentare

:D 一言句子获取中...

Loading...Wait a Minute!