1.什么是事务?
事务是对数据库中一系列操作进行统一的回滚或者提交的操作,主要用来保证数据的完整性和一致性。
2.事务四大特性(ACID)原子性、一致性、隔离性、持久性?
1. 原子性(Atomicity):
事务的原子性确保动作要么全部完成,要么完全不起作用;
2. 一致性(Consistency):
执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
3. 隔离性(Isolation):
并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
4. 持久性(Durability):
一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
3、并发事务带来的问题
1. 脏读(Dirty read):
当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。
因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
2. 不可重复读(Unrepeatableread):
指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。
那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。
这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
3. 幻读(Phantom read):
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。
在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
4. 丢失修改(Lost to modify)
指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。
这样第一个事务内的修改结果就被丢失,因此称为丢失修改
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
4、MySQL数据库共定义了四种隔离级别:
1. Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。
2. Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。
3. Read committed(读已提交):可避免脏读情况发生。
4. Read uncommitted(读未提交):最低级别,以上情况均无法保证。
mysql数据库查询当前事务隔离级别:select @@tx_isolation
MySQL默认的事务隔离级别为repeatable-read 可重复读
我们在项目中一般用读已提交(Read Commited)这个隔离级别