Java-事务管理
1、事务的概念:
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。
2、 管理事务:
2.1. 数据库默认的事务
数据库默认支持事务的,但是数据库默认的事务是一条sql语句独占一个事务,这种模式,意义不大。
2.2. 手动控制事务
如果希望自己控制事务也是可以的:
start transaction;
-- 开启事务,在这条语句之后的所有的sql将处在同一事务中,要么同时完成要么同时不完成
......
--事务中的sql在执行时,并没有真正修改数据库中的数据
commit;
-- 提交事务,将整个事务对数据库的影响一起发生
rollback;
-- 回滚事务,将这个事务对数据库的影响取消掉
2.3. JDBC中控制事务
Connection conn
PreparedStatement pstat
ResultSet rs
当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:
conn.setAutoCommit(false);
--关闭自动提交后,conn将不会帮我们提交事务,在这个连接上执行的所有sql语句将处在同一事务中,需要我们是手动的进行提交或回滚
conn.commit();
--提交事务
conn.rollback();
--回滚事务
也可以设置回滚点回滚部分事务。
Savepoint sp = conn.setSavepoint();
conn.rollback(sp);
--注意,回到回滚点后,回滚点之前的代码虽然没被回滚但是也没提交呢,如果想起作用还要做commit操作.
public class TranDemo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstat = null;
Savepoint sp =null;
try{
//String url = "jdbc:mysql://ip:3306/database";
String url = "jdbc:mysql:///day20";
Class.forName("com.mysql.jdbc.Driver");
conn= DriverManager.getConnection(url,
"root", "root");
//开启事务
conn.setAutoCommit(false);
//a-520
pstat = conn.prepareStatement("update account set " +
"money=money-? where name=?");
pstat.setDouble(1, 520);
pstat.setString(2, "a");
pstat.executeUpdate();
//b+520
pstat = conn.prepareStatement("update account set " +
"money=money+? where name=?");
pstat.setDouble(1, 520);
pstat.setString(2, "b");
pstat.executeUpdate();
//设置回滚点
sp= conn.setSavepoint();
//b消费了1040
pstat = conn.prepareStatement("update account set " +
"money=money-? where name=?");
pstat.setDouble(1, 1040);
pstat.setString(2, "b");
pstat.executeUpdate();
//人为抛出一个异常
int x = 3/0;
//a+1040
pstat = conn.prepareStatement("update account set " +
"money=money+? where name=?");
pstat.setDouble(1, 1040);
pstat.setString(2, "a");
pstat.executeUpdate();
//提交事务
conn.commit();
}catch (Exception e) {
if(conn!=null){
if(sp!=null){
try {
//回滚到到sp
conn.rollback(sp);
//将转账的操作提交
conn.commit();
} catch (SQLException e1) {
e1.printStackTrace();
}
}else{
try {
//回滚事务开启的地方
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}finally{
//关闭数据库连接。。。。
}
}
}
最新文章
- Web服务
- jq添加数组
- 用jQuery基于原生js封装的轮播
- 改写《python基础教程》中的一个例子
- ORA-12520:TNS:监听程序无法为请求的服务器类型找到可用的处理程序
- 开机提示grub可咋办啊
- 20145317彭垚 《Java程序设计》第8周学习总结
- 关于css3的自定义字体
- IIS6下PHP环境的资源未找到(404)问题
- jQuery设计思想
- php7 安装 及和php5的共存
- 各种实用的js,bootstrap插件
- 疯狂VirtualBOX 实战讲学录:小耗子之VirtualBOX修炼全程重现
- 带计时器的做题器(gui
- Python编程从入门到实践笔记——用户输入和while循环
- nginx 启动错误
- 06-JavaScript的流控制语句
- [daily][mirror][daemonlogger][tc] 我想把一个网卡(port A)的流量,镜像到虚拟机的一个网卡(port VA)上去
- ip定位
- andorid——自定义seekbar(转)
热门文章
- BZOJ1787 [Ahoi2008]Meet 紧急集合 【LCA】
- 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告
- 一个acm过来人的心得
- 【BZOJ 1485】[HNOI2009]有趣的数列 卡特兰数
- CodeForces 167B - Wizards and Huge Prize 期望概率dp
- YUI Compressor是如何压缩JS代码的?
- [cdoj 1344]树状数组区间加等差数列
- 设置edittext的样式
- springboot搭建web项目(转)
- gitlab7.2安装