一,数据库中事务的四大特性(ACID)
- 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 - 一致性(Isolation)
一个事务执行之前和执行之后都必须处于一致性状态。类似于能量守恒,例如在银行转账的时候,A账户上有金额300元,B账户上有200元,A给B转账100,AB账户上的金额总和依然是500元 - 隔离性(Consistency)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 - 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的
二,四种隔离级别
不考虑隔离性会出现的问题
- 脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。
- 不可重复读(虚读):指一个线程中的事务读取到了另外一个线程中提交的update的数据。
- 幻读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据。
MySQL数据库为我们提供的四种隔离级别:
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。(默认级别)
- Read committed (读已提交):可避免脏读的发生。
- Read uncommitted (读未提交):最低级别,任何情况都无法保证。
Oracle数据库中,只支持串行化和读已提交这两种级别,其中默认的为读已提交级别。
三,注意事项
- 设置数据库的隔离级别一定要是在开启事务之前!
- 隔离级别的设置只对当前链接有效。 对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。