数据库事务

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。——百度、维基百科百科

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

       当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

————————————————————————————————————————————————————————

小猫在爱奇艺首充6元:1、小猫支微信余额减少6元  2、爱奇艺财务账号金额增加6元 3、小猫获得会员权限

小猫事务 爱奇艺事务
  开始事务(时刻等待用户充值会员)
开始事务(打开支微信钱包开始剁手)  
1、小猫支微信余额减少6元  
  2、爱奇艺财务账号金额增加6元
  3、小猫获得会员权限
提交事务  

小猫付钱了,爱奇艺莫得钱,也不会给小猫会员。这就是没有将这些事件放在一个事务中处理,1执行成功,而2、3执行失败,导致最终出现问题。将两个放在一个事务中,事务成功则说明1、2、3都成功执行,事务失败则1、2、3都失败,这样就不会出现金额的误差。

————————————————————————————————————————————————————————

ACID性质

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

————————————————————————————————————————————————————————

并发操作异常

  1. 脏读(Dirty-Reads):A事务对数据执行操作(100+1),A未提交,B事务读取,此时B读取数据还是未变(100);
  2. 不可重复读(Not-Repeatable-Read):A事务重新读取前面读取过的数据(100),发现该数据已经被已提交的B事务修改(update)过数据值为(100+1);
  3. 幻读(Phantom Read):A事务重新执行一个查询(value=100),返回一套符合条件的行(10),发现这些行因为最近提交的B事务(insert或delete)而发生了改变,行为(11或9);
  4. 回滚丢失(Rollback Lost):两个事务对同一个数据进(100)行操作,A事务执行成功(100+1),数据改变(101);但B事务执行失败(100+1),B事务回滚数据不变(100),最终数据为100,数据丢失;
  5. 事务覆盖(Transaction Coverage):A事务对数据执行操作(100+1),B事务对数据执行操作(100+2),A事务先提交,B事务后提交,最终数据为(102),B事务覆盖了A事务。

————————————————————————————————————————————————————————

隔离级别

读未提交(Read Uncommitted):A事务更新数据未提交,B事务可以读取到数据的改变

读已提交(Read Committed):A事务更新数据未提交,B事务不可读,A事务更新数据已提交,B事务可读

可重复读(Repeatable Read):保证A事务中重复读取的数据是一样的,读或改数据时禁止写【默认隔离级别】

序列化(Serializable):所有事务按序列执行,不允许并发事务执行,最安全,但是效率最慢

————————————————————————————————————————————————————————

Java处理事务

1.Java使用工具类连接代码

connection.setTransactionlsolation(Connection.事务级别):MySql默认为可重复读
connection.setAutCommit(false):关闭事务自动提交
connection.commit():手动提交事务
connection.rollback():事务回滚

2.SpringBoot事务代码

maven依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.1.4.RELEASE</version>
</dependency>
启动类注解
@EnableTransactionManagement:开启事务管理



事务方法

@Transactional:事务注解
	//回滚
	@Transactional(rollbackFor=Exception.class):指定回滚
	@Transactional(noRollbackFor=Exception.class):指定不回滚
	
	@Transactional(propagation=Propagation.REQUIRED):如果有事务,那么加入事务,没有的话新建一个
	@Transactional (propagation = Propagation.REQUIRED,readOnly=true):readOnly=true只读,不能更新、删除
	@Transactional (propagation = Propagation.REQUIRED,timeout=10):timeout=10设置超时时间
	@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT):isolation=Isolation.DEFAULT设置隔离级别
	@Transactional(propagation=Propagation.NOT_SUPPORTED):容器不为这个方法开启事务

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章