有关事务、事务特性、事务隔离级别、spring事务传播特性

1.事务(Transaction) 是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。事务是恢复和并发控制的基本单位。
在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。判断事务是否配置成功的关键点在于出现异常时事务是否会回滚。
只有和数据打交道才会出现事务,事务归根结底是个锁!
Spring开启事务是在service层,如果我们的事务注解@Transactional加在dao层,那么只要与数据库做增删改,就要提交一次事务,如此做事务的特性就发挥不出来,尤其是事务的一致性,当出现并发现问题时,用户从数据库查到的数据都会有所偏差。 一般的时候,我们的service层可以调用多个dao层,我们只需要在service层加一个事务注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。

除了MySQL默认采用RR隔离级别之外,其它几大数据库都是采用RC隔离级别。
但是他们的实现也是极其不一样的。Oracle仅仅实现了RC 和 SERIALIZABLE隔离级别。默认采用RC隔离级别,解决了脏读。但是允许不可重复读和幻读。其SERIALIZABLE则解决了脏读、不可重复读、幻读。

MySQL的实现:MySQL默认采用RR隔离级别,SQL标准是要求RR解决不可重复读的问题,但是因为MySQL采用了gap lock,所以实际上MySQL的RR隔离级别也解决了幻读的问题。MySQL的SERIALIZABLE采用了经典的实现方式,对读和写都加锁。
事务开始于:

开启事务:
start transaction;
设置事务的隔离级别:
set session transaction_isolation='SERIALIZABLE';

●连接到数据库上,并执行一条DML语句(INSERT、 UPDATE或DELETE)。
●前一个事务结束后,又输入了另外一条DML语句。
事务结束于:

提交事务:
commit;
回滚事务:
rollback;

●执行COMMIT或ROLLBACK语句。
●执行条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
●执行条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。
●断开与数据库的连接。
●执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行ROLLBACK语句。

2.事务四大特性(ACID):
原子性(Atomicity): 事务是数据库逻辑工作单元,事务中包含的所有操作是一个整体,要么都执行成功,要么都执行失败。
一致性(Consistency): 事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说数据库处于一致性状态。如果在执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于不一致状态。
隔离性(Isolation): 一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
持久性(Durability): 即一个事务一旦提交,它对数据库数据的改变是永久性的,之后的其它操作不应该对其执行结果有任何影响。
3.事务的隔离级别(Transaction_isolation): 也分为四种,由低到高依次分别为:read uncommitted(读取未提交)、read committed(读取已提交)、read repeatable(可重复读)、serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
在这里插入图片描述
隔离级别和数据库有关,是规定两个事务之间的数据可见性。
read-uncommitted(读未提交): 是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
read-committed(读提交): 保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
repeatable-read(可重复读): 这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。(mysql默认隔离级别)
serializable(序列化): 这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。

脏读: 指当一个事务正访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作可能是不正确的。
不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
幻读: 一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)

4.spring事务传播特性: 事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
传播特性是数据的传播特性(java),和数据库没有关系。传播特性规定当前是有几个事务和描述事务之间的关系。
spring支持7种事务传播行为:
propagation_mandatory: 支持当前事务,如果没有当前事务,就抛出异常。
propagation_nested: 支持当前事务,如果当前存在事务,则执行一个嵌套事务,如果当前没有事务,就新建一个事物。(新增Savepoint点,与当前事务同步提交或回滚。)
propagation_never: 以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_not_supported: 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_requierd: 支持当前事务,如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
propagation_required_new: 新建事务,如果当前存在事务,把当前事务挂起。
propagation_supports: 支持当前事务,如果没有当前事务,就以非事务方法执行。

在这里插入图片描述
Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值