事务
1 事务概述
●在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术。
●事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。
●事务的四个关键属性(ACID)
○原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。
○一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。
○隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰。
○持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。
简单实现
配置文件
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在需要进行事务控制的方法上加注解
@Transactional
简单程序
public void test() { Connection con=null; con = JDBCUtil.getConnection(); String sql="insert into lhw_wad values(null,?)"; PreparedStatement ps =null; try { //开启事务需要手动提交 //同一个事务要获取同一个Connection con.setAutoCommit(false); //批处理 ps = con.prepareStatement(sql); long start = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) { ps.setString(1, "qq"+i); ps.addBatch(); } ps.executeBatch(); long end = System.currentTimeMillis(); System.out.println(end- start); con.commit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); try { con.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); }finally { try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
dao层(注意dao层不要关闭Connection,一个事务公用一个Connection)
public class Acount { public void update(Connection con,Integer id, Integer count){ PreparedStatement ps=null; String sql="update l_bank set money=money+? where id=?"; try { ps = con.prepareStatement(sql); ps.setInt(1, count); ps.setInt(2, id); ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JDBCUtil.close(null, ps, null); } } }