package com.loaderman.demo.d_tx;

import com.loaderman.demo.utils.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint; public class AccountDao { // 全局参数
private Connection con;
private PreparedStatement pstmt; // 1. 转账,没有使用事务
public void trans1() { String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName='张三';";
String sql_ls = "UPDATE account SET money=money+1000 WHERE accountName='李四';"; try {
con = JdbcUtil.getConnection(); // 默认开启的隐士事务
con.setAutoCommit(true); /*** 第一次执行SQL ***/
pstmt = con.prepareStatement(sql_zs);
pstmt.executeUpdate(); /*** 第二次执行SQL ***/
pstmt = con.prepareStatement(sql_ls);
pstmt.executeUpdate(); } catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.closeAll(con, pstmt, null);
} } // 2. 转账,使用事务
public void trans2() { String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName='张三';";
String sql_ls = "UPDATE1 account SET money=money+1000 WHERE accountName='李四';"; try {
con = JdbcUtil.getConnection(); // 默认开启的隐士事务
// 一、设置事务为手动提交
con.setAutoCommit(false); /*** 第一次执行SQL ***/
pstmt = con.prepareStatement(sql_zs);
pstmt.executeUpdate(); /*** 第二次执行SQL ***/
pstmt = con.prepareStatement(sql_ls);
pstmt.executeUpdate(); } catch (Exception e) {
try {
// 二、 出现异常,需要回滚事务
con.rollback();
} catch (SQLException e1) {
}
e.printStackTrace();
} finally {
try {
// 三、所有的操作执行成功, 提交事务
con.commit();
JdbcUtil.closeAll(con, pstmt, null);
} catch (SQLException e) {
}
} } // 3. 转账,使用事务, 回滚到指定的代码段
public void trans() {
// 定义个标记
Savepoint sp = null; // 第一次转账
String sql_zs1 = "UPDATE account SET money=money-1000 WHERE accountName='张三';";
String sql_ls1 = "UPDATE account SET money=money+1000 WHERE accountName='李四';"; // 第二次转账
String sql_zs2 = "UPDATE account SET money=money-500 WHERE accountName='张三';";
String sql_ls2 = "UPDATE1 account SET money=money+500 WHERE accountName='李四';"; try {
con = JdbcUtil.getConnection(); // 默认开启的隐士事务
con.setAutoCommit(false); // 设置事务手动提交 /*** 第一次转账 ***/
pstmt = con.prepareStatement(sql_zs1);
pstmt.executeUpdate();
pstmt = con.prepareStatement(sql_ls1);
pstmt.executeUpdate(); // 回滚到这个位置?
sp = con.setSavepoint(); /*** 第二次转账 ***/
pstmt = con.prepareStatement(sql_zs2);
pstmt.executeUpdate();
pstmt = con.prepareStatement(sql_ls2);
pstmt.executeUpdate(); } catch (Exception e) {
try {
// 回滚 (回滚到指定的代码段)
con.rollback(sp);
} catch (SQLException e1) {
}
e.printStackTrace();
} finally {
try {
// 提交
con.commit();
} catch (SQLException e) {
}
JdbcUtil.closeAll(con, pstmt, null);
} }
}
package com.loaderman.demo.d_tx;
import org.junit.Test;
public class App {
@Test
public void testname() throws Exception { AccountDao accountDao = new AccountDao();
accountDao.trans();
}
}

最新文章

  1. [问题2014S13] 复旦高等代数II(13级)每周一题(第十三教学周)
  2. 使用spring手动控制事务
  3. WIN7 如何关闭Aero
  4. 切换samba用户
  5. Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
  6. KEIL中的一些细节
  7. UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>
  8. maven安装scala插件
  9. PHP 底层的运行机制与原理 --转
  10. 201521123011 《java程序设计》 第9周学习总结
  11. Java~类,抽象类和接口
  12. 腾讯通信云服务端使用心得,腾讯云IM
  13. (2.1)mysql升级与降级
  14. linux下crontab定时执行shell脚本调用oracle 存储过程
  15. Git使用:安装,使用及常用命令整理
  16. Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)
  17. Android开发各种Utils收集库
  18. js文件加载太慢,JavaScript文件加载加速
  19. JS怎么刷新当前页面
  20. iOS笔记,得到一个控件的坐标

热门文章

  1. Intellij IDEA显示调用时序图插件SequenceDiagram
  2. Jmeter中间件处理-缓存
  3. Appium安装(环境配置)
  4. 【audition CC】将3分钟的歌曲无缝延长到15分钟
  5. Java语言基础(14)
  6. mybatis配置加载源码概述
  7. C#工具:ASP.net 调用MySQL 帮助类(包括存储过程调用)
  8. PXE远程自动安装操作系统
  9. 报表开发工具!DevExpress Reporting v19.1:WPF/Web平台报表
  10. 一些需要禁用的PHP危险函数(disable_functions)