1、数据库事务
针对数据库的某一组操作要么全部成功,要么全部失败。
2、数据库事务的四个特性
原子性(Atomicity):要么全部完成,要么全部不完成。
一致性(Consistency):事务必须始终保持系统处于一致性。
隔离性(Isolation):隔离执行事务,使它们好像是系统在给定时间内执行的唯一操作。
持久性(Durability):事务完成后,该事务对数据库的更改持久保存在数据库中。
3、事务的隔离性
1. 不考虑事务的隔离性会出现的问题
脏读:一个事务T1读到了事务T2未提交的数据,如果T2事务不提交,那么T1再次读到的数据跟前一次不一样。
不可重复读:一个事务T1读事务T2的数据,多次内数据不一样。
幻读:事务T1对自己某一项的数据全部修改后T2又对数据进行修改,T1在读后发现有一条不一样。
2. 数据库事务隔离级别
Mysql四种,Oracle两种(Read Commited,Serializable)。
Mysql默认Repeatable read,Oracle默认Read committed。
4、事务隔离
READ UNCOMMITTED:使用查询语句不会加锁,可能读取未提交的行。
READ COMMITTED:只对记录加记录锁,不会在记录之间加间隙锁,允许新的记录插入到被锁记录的附近,多次使用查询语句时,可能得到不同的结果。
REPEATABLE READ:多次读取同一范围的数据会返回第一次查询的快照,不会返回不同的数据行,可能发生幻读。
SERIALIZABLE:InnoDB隐式地将全部的查询语句加上共享锁,解决幻读的问题。
5、数据库的隔离级别导致的问题
脏读:一个事务对数据进行了修改,但未提交,另一个事务可以读取到未提交的数据。如果第一个事务回滚了,第二个事务读到的了脏数据。
不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次读操作时间,另外一个数据对数据进行了修改,这时候两次读取的数据不一致。
幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围内增加了一条数据,这时候第一个事务就会丢失对新增数据的修改。