事务的四大特性:
(1)原子性
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
(2)一致性
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
(3)隔离性
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。每个事务都感觉不到有其他事务在并发地执行。
(4)持久性
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
不考虑事务隔离性会出线的问题:
(1)、脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这次一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。
(2)、不可重复读
对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔内,另一个事务访问这个数据,并进行了修改。
不可重复读和脏读的区别是:不可重复读是访问了前一数据提交了的数据,脏读时读取了另一个数据未提交的数据。
(3)、幻读
如果一个事务修改一个数据库中的所有行,此时另一个事务插入一个数据行,此时第一个事务再查看刚刚修改的行的时候,发现还有一行没修改,放佛发生了幻觉。
四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读),而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。