事务的四个特性以及应用

事务

一、事务的四个特性 ACID

1.1 事务

​ 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

1.2 ACID

​ ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性。

1.3 原子性

 原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

案例:A想B转帐100元

事务的四个特性以及应用_第1张图片

1.4 一致性

​ 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

案例:对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中aaa和bbb的存款总额为2000元。

1.5 隔离性

隔离性:用于处理事务的并发问题

​ 多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

​ 这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

​ 事务之间的相互影响分为几种:脏读不可重复读幻读丢失数据

1)脏读

​ 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。

2)不可重复读

​ 事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

3)幻读

​ 管理员A将数据库所有数据更新一遍,管理员B在这个时候插入一条新数据,当管理员A改结束后发现还有一条数据没有改过来,就好像发生了幻觉一样,这就叫幻读。

4)丢失数据

​ 两个事务同时读取同一条记录,A先修改记录,B也修改记录(B是不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

总结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增和删除。解决不可重复读的问题只需要锁住满足条件的行,解决幻读需要锁表。

隔离级别

事务的四个特性以及应用_第2张图片

1.6 持久性

持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。

二、事务注解 @Transactional

1.失效的场景

1) @Transactional注解用于一个方法上,并且该方法内有try-catch块处理异常,因为处理异常会导致回滚失效。

2)@Transactional注解标注方法修饰符为非public时,事务无效

3)在类内部调用类内部的 用@Transactional标注的方法。这种情况下也会导致事务不开启

4)@Transactional 注解属性 propagation 设置错误

  • 这种失效是由于配置错误,若是错误的配置以下三种 propagation,事务将不会发生回滚。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常

5)@Transactional 注解属性 rollbackFor 设置错误

  • rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。

    6)在spring中可以使用**@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效**,如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚,导致数据错误。

你可能感兴趣的:(数据库,java)