您现在的位置是:主页 > news > 公司网站上传不了图片/企业网站建设cms
公司网站上传不了图片/企业网站建设cms
admin2025/5/10 12:05:23【news】
简介公司网站上传不了图片,企业网站建设cms,开发银行助学贷款系统登录官网,rob为翁美玲做的网站Java事务 1) 说到事务,不得不提的就是ACID特性,再次回顾: 原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。 一致性(consistency):在事务处理执行前后…
Java事务
1) 说到事务,不得不提的就是ACID特性,再次回顾:
Ø 原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
Ø 一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。
Ø 隔离性(isolcation):一个事务处理对另一个事务处理的影响。
Ø 持续性(durability):事务处理的效果能够被永久保存下来 。
2) 然后就是事务在Java中的最基本操作:
Ø connection.setAutoCommit(false);//打开事务。
Ø connection.commit();//提交事务。
Ø connection.rollback();//回滚事务。
这里需要提的就是,当只想撤销事务中的部分操作时可使用SavePoint:
Ø SavePoint sp = connection.setSavepoint();
Ø connection.rollerbak(sp);connection.commit();
3) 下面用一个实例代码来展示一下:
package cn.itcast.jdbc;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
/*** 事务测试*/
public class SavePointTest {public static void main(String[] args) throws SQLException {testTransaction();}static void testTransaction() throws SQLException {Connection conn = null;Statement st = null;ResultSet rs = null;Savepoint sp = null;try {//获取Connection(JdbcUtils为自定义的包装类,这里不做解释)conn = JdbcUtils.getConnection();//开启事务conn.setAutoCommit(false); st = conn.createStatement();//id为1的人的Money减10String sql = "update user set money=money-10 where id=1";st.executeUpdate(sql);//********************回滚界限***************************//设置回滚点(savepoint)sp = conn.setSavepoint();//********************回滚界限***************************//id为2的人的Money减10sql = "update user set money=money-10 where id=3";st.executeUpdate(sql); sql = "select money from user where id=2";rs = st.executeQuery(sql);float money = 0.0f;if (rs.next()) {money = rs.getFloat("money");}if (money > 300){throw new RuntimeException("已经超过最大值!");}//id为2的人的Money加10sql = "update user set money=money+10 where id=2";st.executeUpdate(sql);//提交事务conn.commit();} catch (RuntimeException e) {if (conn != null && sp != null) {//回滚事务,注意里面的参数sp即为我们上面设置的savePoint,如果回滚的话只能回滚到savePoint以下的部分//上面的部分不会得到回滚conn.rollback(sp);conn.commit();}throw e;} catch (SQLException e) {if (conn != null)conn.rollback();throw e;} finally {//释放资源(JdbcUtils为自定义类)JdbcUtils.free(rs, st, conn);}}
}
上面所有的操作(CRUD)都是在同一个数据源上的操作,无法处理跨多数据源(分布式)操作。跨多个数据源的事务就要使用JTA容器实现事务。根本思想就是“分成两阶段提交”,具体内容这里不做介绍。
javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName");tx.begin();//connection1 connection2 (可能来自不同的数据库)… tx.commit();//tx.rollback();
隔离级别
1) 为了应对多线程并发读取数据时出现的问题,事务有了“隔离级别”特性,多线程并发读取数据一般会引发如下三个问题:
Ø 脏读(dirtyreads)
Ø 不可重复读(non-repeatablereads)
Ø 幻读(phantomread)
下面进行简要介绍:
Ø 脏读:一个事务读取了另一个未提交的并行事务写的数据。
Ø 不可重复读:一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。
Ø 幻读:一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。
2) 为了处理上面的读数据问题,java事务提供了4种隔离级别,如下:
Ø 读未提交(Read uncommitted)
Ø 读已提交(Readcommitted)
Ø 可重复读(Repeatableread)
Ø 可串行化(Serializable)
3) 4种隔离级别与上面3个问题的对应关系如下:
注意上面的“可能”二字。
4) 隔离级别的设定:
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
在代码中的应用:
总结
除了隔离级别,上面所有的东西在.net中相信大家都很熟悉。当然在八期的.net教务系统也用到了事务隔离级别这一点,当时自己还是初步接触,现在可以详细的学习,可以看到学习就是一个不断反复的过程。