事务就是指作为单个逻辑工作单元执行的一组数据操作,这些操作要么全部成功,要么全部失败,以保证数据的一致性和完整性
事务具有以下ACID属性:
A(Atomic)原子性:事务是由一个或者多个行为绑在一起组成,好像是一个单独的工作单元。原子性确保在事务中的所有操作要么都发生,要么不发生。
C(Consistent)一致性:一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。即数据应当不会被破坏。
I(Isolated)隔离性:事务应该允许多个用户操作同一个数据,一个用户的操作不会和其他用户操作相混淆。
D(Durable)持久性:一旦事务完成,事务的记过应该持久化。
数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志撤销事务对数据库所做的更新,是数据库退回到执行事务的前期初始状态。数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新数据。
JDBC中使用事务
在jdbc API中提供了一下方法控制事务。
- setAutoCommit(boolean autoCommit):设置是否自动提交事务
- commit():提交事务
- rollback():撤销事务
Hibernate对JDBC进行了轻量级的对象封装,Hibernate本身在设计时并不具备事务处理功能,平时所用的hibernate的事务,只是将底层的JDBCTransaction或者JTATransaction进行封装,在外面套上Transaction和session的外壳,其实底层都是通过委托底层的JDBC或JAT来实现事务的调度功能。
hibernate使用JDBC事务:在hibernate.cfg.xml中指定使用哪一种事务
<session-factory>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</session-factory>
hibernate使用JTA事务:
<session-factory>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</session-factory>