事务-数据库事务,hibernate事务和spring管理事务
什么是事务:
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
事务的特性:
一般来说,事务是必须满足4个条件(ACID):
原子性(Atomicity,或称不可分割性):是不可分割的。在事务中的操作要么全部成功,要么全部失败。
一致性(Consistency)在事务开始之前和事务结束以后,数据的完整性没有被破坏。
隔离性(Isolation,又称独立性):隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。
持久性(Durability):在事务完成后,事务所做的修改将一直保存在数据库,不会被回滚
事务不考虑隔离性可能会引发的问题
脏读:读到别人未提交的(未提交)
不可重复读:多次读到是数据不同,
是指一个事务范围内,多次查询某个数据,却得到不同的结果。
在第一个事务中的两次读取数据之间,由于第二个事务的修改,第一个事务两次读到的数据可能就是不一样的。
(提交的,重点是修改)
幻读:读取到了别的事务插入的数据(新增或者删除 (数据条数变化))
不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。
https://www.cnblogs.com/balfish/p/8298296.html
事务的隔离级别
MySQL数据库共定义了四种隔离级别:
- Read uncommitted(读未提交):最低级别,以上情况均无法保证。 即使一个更新语句没有提交,但是别的事务可以读到这个改变。
- Read committed(读已提交):可避免脏读情况发生。(锁行 ) 执行了COMMIT以后别的事务就能读到这个改变,并且只能读取到已经提交的数据。
- Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。(锁行) 在同一个事务里面先后执行同一个查询语句的时候,得到的结果是一样的。
- Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。(锁表) 事务执行的时候不允许别的事务并发执行,完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
MySQL 事务
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
1.查看当前会话隔离级别 select @@tx_isolation;
2.查看系统当前隔离级别 select @@global.tx_isolation;
数据库的各种锁的问题
共享锁(s):只可读,共享锁可以重复加,但不能加排他锁
排他锁(x):只可写, 不允许加其它任何锁
意向排他锁(IS),意向共享锁(IX):意向锁是表级锁, 在事务中, 用户申请加行锁时, 数据库会默认先申请意向锁, 也就是数据库自动处理意向锁的.
说明:
1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。
2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显示给记录集加共享锁或排他锁。
共享锁(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE … FOR UPDATE。
**对于锁定行记录后需要进行更新操作的应用,应该使用Select…For update 方式,获取排它锁。(用共享锁,在读了之后再写会阻塞,会导致死锁)
这里说说Myisam:MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
3)InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
原文链接:https://blog.csdn.net/qq_39495922/article/details/82886781

问题:既然有了锁,为什么还要隔离级别?
事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。
锁是数据库并发控制的内部机制,是基础
对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有必要在语句中手动设置锁,不恰当的设置锁可能导致严重的阻塞和死锁。建议在完全了解锁机制的情况下,才可以再语句中手动设置锁,否则应该使用事务隔离级别。
Spring事务和Hibernate事务
事务管理是Hibernate实现的,Spring的事务只是管理hibernate的事务,所以二者是管理者与被管理者的关系。 Spring通过Aop实现了对Hibernate的事务管理,Spring没有单独实现事务的管理。

浙公网安备 33010602011771号