javaWeb事务
JDBC事务:
cmd 命令上的事务开启: start transaction; / begin;
回滚 rollback;
提交 commit;
JDBC事务控制:
开启事务:conn.setAutoCommit(false);
提交:conn.commit();
回滚:conn.rollback();
DBUtils的事务控制 也是通过jdbc
ThreadLocal:实现的是通过线程绑定的方式传递参数
事务回滚后 ,一定要commit 才能算这个事务完成
jdbc事务的运用
form 提交表单
<fieldset>
<legend> 转账</legend>
<form action="${pageContext.request.contextPath}/transferServlet" method="post">
转出账户:<input type="text" name="outName"><br/><br>
转入账户:<input type="text" name="inName"><br><br>
转账金额 :<input type="text" name="money"><br/><br>
<input type="submit" value="确定"> </form>
</fieldset>
web 层 servlet doGet 和doPost 方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String inName=request.getParameter("inName");
String outName=request.getParameter("outName");
String moneystr=request.getParameter("money");
double money=Double.parseDouble(moneystr);
//调用service层的方法
TransferService transfer=new TransferService();
boolean falg = transfer.transfermoney(inName,outName,money);
if (falg) {
response.getWriter().write("转账成功");
}else {
response.getWriter().write("转账失败");
}
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
service 层类:
package com.study.transfer.service; import java.sql.Connection;
import java.sql.SQLException; import com.study.transfer.dao.TransferDao;
import com.study.util.C3P0Utils; public class TransferService { public boolean transfermoney(String inName, String outName, double money) {
//调用dao层的inMoney 和 outMoney TransferDao dao=new TransferDao();
Connection conn=null;
//dao 层 的conn
//jdbc事务的处理 conn SQL语句的执行 和事务的提交,回滚需要时同一个conn;
boolean isTransfer=true;
int number1=-1;
int number2=-1;
try {
//缺点是 出现了dao层的conn连接 ,
conn=C3P0Utils.getConnection();
conn.setAutoCommit(false);
number1=dao.inMoney(conn,inName ,money);
// int a=1/0;
number2=dao.outMoney(conn,outName,money);
if (number1==-1 || number2==-1) {
//当sql语句的任何一条没有执行成功,就回滚的初始状态
conn.rollback();
}
} catch (Exception e) {
isTransfer=false;
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
conn.commit();
//把事务提交,结束,最后把conn返回给连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
return isTransfer;
} }
dao层:
package com.study.transfer.dao; import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import com.study.util.C3P0Utils; public class TransferDao { public int inMoney(Connection conn, String inName, double money) throws SQLException {
//Connection conn=C3P0Utils.getConnection();
QueryRunner qr=new QueryRunner();
String sql="update account set money=money+? where name=?";
int number=qr.update(conn, sql, inName,money);
return number;
} public int outMoney(Connection conn, String outName, double money) throws SQLException {
// Connection conn=C3P0Utils.getConnection();
QueryRunner qr=new QueryRunner();
String sql="update account set money=money-? where name=?";
int number =qr.update(conn, sql, outName,money);
return number;
}
}
DBUtils 事务提交对上面的代码进行了修改:
service层:
public class TransferService { public boolean transfermoney(String inName, String outName, double money) {
//调用dao层的inMoney 和 outMoney TransferDao dao=new TransferDao();
Connection conn=null;
boolean isTransfer=true;
int number1=-1;
int number2=-1;
try {
//开启事务
C3P0Utils.startTransaction();
number1=dao.inMoney(inName ,money);
number2=dao.outMoney(outName,money);
if (number1==-1 || number2==-1) {
//当sql语句的任何一条没有执行成功,就回滚的初始状态
conn.rollback();
}
} catch (Exception e) {
isTransfer=false;
try {
C3P0Utils.rollbackTransaction();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
C3P0Utils.commitTransaction();
//把事务提交,结束,最后把conn返回给连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
return isTransfer;
}
dao层:
public class TransferDao { public int inMoney( String inName, double money) throws SQLException {
Connection conn=MyC3P0Utils.getCurrenConnection();
QueryRunner qr=new QueryRunner();
String sql="update account set money=money+? where name=?";
int number=qr.update(conn, sql, money,inName);
return number;
} public int outMoney( String outName, double money) throws SQLException {
Connection conn=MyC3P0Utils.getCurrenConnection();
QueryRunner qr=new QueryRunner();
String sql="update account set money=money-? where name=?";
int number =qr.update(conn, sql, money,outName);
return number;
} }
C3P0Utils 的代码改变:
public class C3P0Utils {
private static ComboPooledDataSource dataSource=new ComboPooledDataSource("login");
private static ThreadLocal<Connection > tl=new ThreadLocal<Connection>();
// ThreadLocal 只能存储一个变量
//可TreadLocal<List<Object>>
//获取当前线程的连接connection
public static Connection getCurrenConnection(){
Connection conn = tl.get();
if (conn==null) {
conn=getConnection();
tl.set(conn);
}
return conn;
}
//开启事务
public static void startTransaction() throws SQLException{
Connection conn=getCurrenConnection();
conn.setAutoCommit(false);
}
//回滚事务
public static void rollbackTransaction() throws SQLException{
getCurrenConnection().rollback();
}
//提交事务
public static void commitTransaction() throws SQLException{
Connection conn=getCurrenConnection();
conn.commit();
//将Connection从ThreadLocal移除
tl.remove();
conn.close(); }
public static DataSource getDataSource(){
return dataSource;
} public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
javaWeb事务的更多相关文章
- JavaWeb 之事务
什么是事务? 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全部成功,要么全部失败. 以转账为例: 张三给李四转账,张三扣1000,李四加1000; 加钱和扣钱两个操作组成了一个事务. 1 ...
- javaweb学习总结(三十八)——事务
一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句 update from account set mone ...
- 传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、
1. 什么叫做事务? 2.默认情况下每一条sql语句都是一个事务,然后自动提交事务 ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false 3.关键字 start tr ...
- JavaWeb学习总结(十二)--事务
一.事务的介绍 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功 ...
- 【JAVAWEB学习笔记】19_事务
事务 学习目标 案例-完成转账 一.事务概述 1.什么是事务 一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败 就是将n个组成单元放到一个事务中 2.mysql的事务 默认的 ...
- JavaWeb学习笔记七 事务
什么是事务?一件事情有n个组成单元 ,要么这n个组成单元同时成功,要么n个单元就同时失败.就是将n个组成单元放到一个事务中. mysql的事务 默认的事务:一条sql语句就是一个事务,默认就开启事务并 ...
- Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式
事务 什么是事务? 转账: 1.给张三账户减1000元 2.给李四账户加1000元 当给张三账户减1000元之后,抛出了异常,这 ...
- JavaWeb学习(二十九)———— 事务
一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句 update from account set mone ...
- JavaWeb基础—JDBC(二)事务与批处理
一.批处理 这里给出PrepareStatement的示例,优点是可以发送预编译的SQL,缺点是SQL语句无法更换,但参数可以更换 批处理:多条语句的处理 mysql默认是关闭的,要打开需要在url后 ...
随机推荐
- linux中vim常用的快捷键
移动光标的方法 h或者向左箭头:光标向左移动一个字符 j或者向下箭头:光标向下移动一个字符 k或者向上箭头:光标向上移动一个字符 i或者向右箭头:光标向右移动一个字符 Ctrl+f:屏幕向下移动一页[ ...
- BZOJ 1485: [HNOI2009]有趣的数列 [Catalan数 质因子分解]
1485: [HNOI2009]有趣的数列 Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所 ...
- 百度地图、高德地图、Google地图等坐标系相关梳理
1.地理坐标系与投影坐标系 地理坐标系也就是球面坐标系,是将本不是椭球体的地球进行椭球体化,从而形成球面坐标体系,国际标准的地理坐标系就是WGS-84坐标系: 只不过各个国家为了反映该国家所在区域地球 ...
- WPF 使用DMSkin for WPF 快速搭建漂亮的WPF程序
DMSkin-for-WPF是一个基于WPF的.Net WPF开源界面库,实现了无边框的WPF开发方案,内置部分控件模板. 你可以参照模板自行修改完善.(以下简称DFW). 核心 DFW实现了比较完美 ...
- 【SSH框架】之Spring系列(一)
微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.前言 前面更新过几篇关于 Struts2 框架和 Hibernate 框架的文章,但鉴于这两 ...
- 创建hbase-indexer出现 0 running
新建hbase-indexer后通过hbase-indexer list-indexers发现SEP subscription ID: null并且0 running processes,如下: IN ...
- 关于目前自己iOS项目使用的第三方开源库
1.AFNetworking 目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理. 2.FMDB 对sqlite数据库操作进行了封装,demo也比较简单. ...
- 同步博客—CSDN推广
niiickのCSDN 用CSDN也有几个月了 其实一开始有人让我转到博客园我是拒绝的 (毕竟强迫症接受不了一边博客只有一半= =) 不过最近有幸观赏了某位dalao的博客园 发现没有广告好棒!!!设 ...
- python入门学习笔记(一)
写在开头: A:python的交互式环境 ...
- centos/linux下的安装Nginx
1.安装gcc编译器 先查看gcc编译器是否安装 在shell控制台输入gcc-v 如果没有安装请看下一步 使用yuma安装gcc yum intsall gcc 看到如下视图则说明安装成功 2.安装 ...