一、什么是事务
通常的观念认为,事务仅与数据库相关。事务必须服从ISO/IEC所制定的ACID原则。
- 原子性(atomicity)
事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 - 一致性(consistency)
一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 - 隔离性(isolation)
隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 - 持久性(durability)
持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?
实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。
二、事务的四种隔离级别
- Read uncommitted
读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。 - Read committed
读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 - Repeatable read
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作 - Serializable
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用
大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。