产生缘由
事务概念在数据库操作中产生,主要用于解决两个问题:一段读写的操作序列,在执行时,发生异常而造成的数据错误,将数据恢复到正常的状态;当应用并发的访问数据库中同一数据或依赖数据时,保证对数据操作后,数据的正确性
Java事务即**通过Java语言操作底层数据库的事务,故此事务的特性取决于使用的底层数据库。**不同的数据库事务设计不同,但遵循同一原则。
事务原则:ACID原则
- Atomicity 原子性: 一组事务操作视为一个原子操作,操作中的任意一个失败,将导致所有的操作失败,即事务执行失败。
- Consistency 一致性: 事务执行失败时,该事务已影响的数据都应恢复到事务执行前的状态。
- Isolation 隔离性: 在事务执行过程中对数据的修改,在提交前,其他事务对数据的修改不可见。解决一下问题:
- 脏读:读取未提交的数据,即事务二读取事务一未提交的修改数据,事务一发生回滚时,事务二读取到修改的数据。
- 幻读:一个事务多次统计查询结果集时,两次统计查询间隔时间中,另一事务增加或删除数据并提交。造成两次结果集数量不一致。
- 不可重复读:一个事物多次读取同一数据,得到的数据不一致。即大型的事务A在读取同一条数据时,两次读取间隔时间中,事物B修改了此数据并提交。
- Durability 持久性: 事务执行成功后,对数据的更改持久的保存在数据库中,不能回滚。
Java事务定义
一组操作指令的集合单元,该单元中的操作要不全成功,要不全失败。具有这样性质的集合单元为事务(Transaction)。用以保证数据的一致性、完整性和正确性。
Java事务类型
-
JDBC事务:由Connection对象控制,事务范围局限于一个数据库连接。java.sql.Connection
//关于事务的源码方法和属性 interface Connection extends Wrapper,AutoCloseable{ //隔离级别的支持程度由驱动决定 int TRANSACTION_NONE = 0;//驱动不支持事务 int TRANSACTION_READ_UNCOMMITTED = 1;//不处理 脏读、不可重复读、幻读 int TRANSACTION_READ_CONMMITTED = 2;//只处理 脏读 int TRANSACTION_REPEATABLE_READ = 4;//处理 脏读、不可重复读 int TRANSACTION_SERIALIZABLE = 8;//处理 脏读、不可重复读、幻读 //设置为true时,则当执行一条SQL语句就自动提交。false时,手动提交才可以使SQL语句生效,可以有多条SQL语句。 void setAutoCommit(boolean autoCommit) throws SQLException; boolean getAutoCommit() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void setTransactionIsolation(int level) throws SQLException; int getTransactionIsolation() throws SQLException; } SavePoint SavePoint接口,支持细粒度的事务控制,当设置保存点后,rollback到保存点,而不是整个事务 Connection接口的setSavePoint(),releaseSavePoint()设置和释放保存点
使用步骤:
1、Class.forName(driverClass) 加载驱动,用以判断驱动是否存在。
2、Connection conn = DriverManager.getConnection(url,userName,password) 创建连接
3、设置conn的事物配置 setAutoCommit setTransactionIsolation
4、Statement state = connection.createStatement(); 创建SQL语句执行体
5、使用state执行SQL 显示事务 执行前要beginTransaction 隐式事物 执行前不用指定beginTransaction
6、state.close() 关闭语句执行体
7、conn.commit() 提交事物
8.1、 事务异常,执行回滚
8.2、conn.close() 关闭连接 -
JTA事务(Java Transaction API):高层、与协议无关、与实现无关的API,允许执行分布式事务处理。
使用JTA事务,驱动程序必须实现javax.sql.XADateSource、javax.sql.XAConnection、javax.sql.XAResource
未完待续
- 容器事物:主要由J2EE应用服务器提供,大多基于JTA完成
未完待续