一、为什么需要事务
事务是为了解决数据安全操作提出的,事务控制实际是控制数据的安全访问。
二、事务的原则(属性)
原子性:事务执行过程中任何失败,都可能导致整个事务全部失败。简而言之,要么都成功,要么都失败。
一致性:当事务执行失败时,所有事务影响的数据都应该恢复到事务执行之前。
隔离性:当前事务不能对其他事务造成影响。
持久性:当事务提交后,数据会持久化,不在受该事务影响。
三、java事务的类型
jdbc事务(最常见的一种)、JTA、容器事务。
jdbc:
jdbc事务是通过connection对象控制的,jdbc connection接口提供了自动提交和手动提交事务。
原理:在sql开始执行时save point,当事务出现失败时,rollback到save point,或这个事务回滚。
缺陷:只能用于单个数据源
JTA(Java Transaction API)事务:
JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。可以处理多个数据源的事务。
使用过程需要实现javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。
应用程序应该使用
UserTransaction.begin()
UserTransaction.commit()
setTransaction.rollback()
现在的版本升级,不知道有没有更好的处理。
容器事务:
这个事务对容器的要求很强.不需要程序特殊处理,只要打上标识,全权由容器处理。理论上来说,必须使用EJB.
四、事务的隔离级别
TRANSACTION_NONE JDBC驱动不支持事务
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。
TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读