事务
2015-12-05 16:46
337 查看
基本概念:
事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。事务ACID特性
l 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
l 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
l 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
l 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的特性:
原子性,是一个最小逻辑操作单元 !
一致性,事务过程中,数据处于一致状态。
持久性, 事务一旦提交成功,对数据的更改会反映到数据库中。
隔离性, 事务与事务之间是隔离的。
案例
需求: 张三给李四转账设计: 账户表
技术:
|-- Connection
void setAutoCommit(boolean autoCommit) ; 设置事务是否自动提交
如果设置为false,表示手动提交事务。
void commit() (); 手动提交事务
void rollback() ; 回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)
Savepoint setSavepoint(String name)
-- 账号表 CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, accountName VARCHAR(20), money DOUBLE )
java:
package js; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Savepoint; public class AccountDao { //全局参数 private Connection conn; private PreparedStatement pstmt; private String sql_zs="UPDATE account SET money=money-1000 WHERE accountName='张三'"; private String sql_ls="UPDATE account SET money=money+1000 WHERE accountName='李四'"; private String sql_zs1="UPDATE account SET money=money-500 WHERE accountName='张三'"; private String sql_ls1="UPDATE1 account SET money=money+500 WHERE accountName='李四'"; //1.转账 没有使用事务 public void trans(){ try { //创建连接 conn=JdbcUtil.getConnection();//默认开启的隐士事务 //创建pstmt对象 //第一次执行Sql pstmt=conn.prepareStatement(sql_zs); pstmt.executeUpdate(); //第二次执行sql pstmt=conn.prepareStatement(sql_ls); pstmt.executeUpdate(); } catch (Exception e) { throw new RuntimeException(); }finally{ JdbcUtil.close(conn, pstmt, null); } } /* * 使用事务 */ public void trans1(){ try { //创建连接 conn=JdbcUtil.getConnection();//默认开启的隐士事务 conn.setAutoCommit(false); //创建pstmt对象 //第一次执行Sql pstmt=conn.prepareStatement(sql_ls); pstmt.executeUpdate(); //第二次执行sql pstmt=conn.prepareStatement(sql_zs); pstmt.executeUpdate(); } catch (Exception e) { try { conn.rollback(); } catch (SQLException e1) { throw new RuntimeException(); } }finally{ try { conn.commit(); JdbcUtil.close(conn, pstmt, null); } catch (SQLException e) { throw new RuntimeException(); } } } /* * 回滚到指定位置 */ public void trans2(){ Savepoint sp=null; try { //创建连接 conn=JdbcUtil.getConnection();//默认开启的隐士事务 conn.setAutoCommit(false); //创建pstmt对象 //第一次转账 //第一次执行Sql pstmt=conn.prepareStatement(sql_ls); pstmt.executeUpdate(); //第二次执行sql pstmt=conn.prepareStatement(sql_zs); pstmt.executeUpdate(); //设置回滚位置 sp=conn.setSavepoint(); //第二次转账 //第一次执行Sql pstmt=conn.prepareStatement(sql_ls1); pstmt.executeUpdate(); //第二次执行sql pstmt=conn.prepareStatement(sql_zs1); pstmt.executeUpdate(); } catch (Exception e) { try { conn.rollback(sp); } catch (SQLException e1) { throw new RuntimeException(); } }finally{ try { conn.commit(); JdbcUtil.close(conn, pstmt, null); } catch (SQLException e) { throw new RuntimeException(); } } } }
相关文章推荐
- 解决apache 443端口被占用
- OOP面向对象技术初识
- 模式的快速匹配与查找
- H5中需要掌握的 ANIMATION 动画效果
- TS科普22 PAT PMT PES关系
- android(26)(使用开源框架xutils实现多线程断点下载)
- 信息安全系统设计基础第十三周学习总结
- OC中的字符串(NSString)、字符串数组(NSArray)和字典(NSDictionary)
- Facade(外观)设计模式
- 查看端口
- lintcode 主元素
- 在PHP中$_SESSION的使用方法
- Python爬虫入门五之URLError异常处理
- 函数指针
- 函数指针
- 【已解决】Android Studio项目编译出错,可以运行
- [探测与发现]星际之门计划
- 另一篇并查集
- sql加索引和删除索引,提高效率等
- 宏与内联函数的区别