一、 数据库事务四大特性 ACID
1、 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部执行成功,否则失败回滚,回到未执行事务前的状态。
2、一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变成另一个一致性状态,也就是事务执行前后必须处于一致性状态。 以转账为例,假设用户 A 和 B 两者的钱加起来是 5000,那么不管 A 和 B 之间如何转账,转多少次,事务结束后两个用户的钱加起来应该还得是 5000,这就是事务的一致性。
3、 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其它的事务操作所干扰,多个并发事务之间要相互隔离。
既要达到这么一种效果:对于任意的两个并发的事务 T1 和 T2,它们相互之间感觉不到对方正在并发的执行,关于事务的隔离性数据库提供了多种隔离级别,假设我们不考虑隔离性会发生什么问题呢?
-
脏读
在一个事务中对数据做了修改,但还未提交,这是其他人读取这个数据,得到的是修改后的值,一旦事务回滚了,再次读取时发现值又变了。
-
不可重复读
不可重复读是在对数据库中的某个数据重复查询时,返回了不同的查询结果,这是由于在查询期间,被另一个事物修改并提交了。和脏读的区别是脏读读取的是另一个事物未提交的脏数据,不可重复读读取的是前一事物已提交的数据。通常情况下不可重复读并不是问题。
-
幻读(虚读)
幻读是事物非独立执行时发生的一种现象,例如事物 T1 对一个表中所有的行的某个数据设置为了 1,这时还有一个其他操作向该表中插入了一行数据,并且数据不为 1,如果操作 T1 的用户查看刚刚修改的数据就会发现还有一行没有修改,其实这行是在修改操作完毕后新加入的一条数据。
4、 持久性
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用 jdbc 操作数据库时,在提交事务方法成功后,就可以认定事务已经被正确提交,即使数据发生重大故障,操作也会正确完成。
二、 四种隔离级别
Mysql 数据库提供了四种数据库的隔离级别:
- Serializable(串行化):对表加了读写锁,每次读写都需要获取共享锁,丧失了并发速度,可避免脏读,不可重复读,幻读的发生
- Repeatable read(可重复读):在同一个事务内的查询都是事务开始时刻一致的,可避免脏读、不可重复读的发生
- Read committed(读已提交):只能读取到已经提交的数据,避免了脏读的发生。
- Read uncommitted(读未提交):所有都能读取到,啥都无法避免
Mysql 默认的事务隔离级别是 2。