事务

事务:一组逻辑操作单元,使数据从一种状态变成另一种状态,这组执行单元要么全部成功,要么全部失败。

  • 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级别。

记住:设置数据库的隔离级别一定要是在开启事务之前!

你可能感兴趣的:(事务)