事务:一组逻辑操作单元,使数据从一种状态变成另一种状态,这组执行单元要么全部成功,要么全部失败。
- Atomicity 原子性:事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行。
- Consistency 一致性:事务必须使数据库从一个一致状态变成另一个一致状态。
- Isolation 隔离性:一个事务执行不能被其他事务干扰。
- (一个事务内部的操作,以及使用的数据对其他并发的事务是隔离的,并发执行的各个事务之间不能互相干扰)
- Durability 持久性:事务一旦提交,则会永久改变数据库的数据。
脏读,不可重复读,幻读
- 脏读:对于两个事务T1,T2,如果T1读取了已经被T2更新,但是还没有提交的字段,如果T2回滚,那么T1读的数据时无效的。
- 不可重复读: 对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。T1再次读取同一个字段,值就不同了。
- 幻读:对于两个事务T1,T2,T1读取了一个字段,然后T2在表中插入了一些新的行,之后T1再次读取同一个表,就会多出几行。
- 避免脏读即可。
JDBC开启事务,setAutoCommit方法为false,然后调用commit或者rollback
隔离级别
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。