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后 ...
随机推荐
- C# 语法学习整理
1.协变与逆变的概念 文章地址:https://segmentfault.com/a/1190000007005115 **************************************** ...
- 深入理解Java内存模型之系列篇[转]
原文链接:http://blog.csdn.net/ccit0519/article/details/11241403 深入理解Java内存模型(一)——基础 并发编程模型的分类 在并发编程中,我们需 ...
- RandomAccess接口的使用
RandomAccess在类Collections的shuffle()方法中的使用:(jdk源码如下) /** * Randomly permute the specified list using ...
- BZOJ 2809: [Apio2012]dispatching [斜堆]
题意:主席树做法见上一题 我曾发过誓再也不写左偏树(期末考试前一天下午5个小时没写出棘手的操作) 于是我来写斜堆啦 从叶子往根合并,维护斜堆就行了 题目连拓扑序都给你了... 说一下斜堆的操作: 合并 ...
- Nodejs的运行原理-函数回调篇
前言 当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程:开始于libuv,终止于js代码里的callback(promise ...
- WPF中的Command事件绑定
在项目中使用Command绑定能够使我们的代码更加的符合MVVM模式.不了解的同学可能不清楚,只有继承自ButtonBase类的元素才可以直接绑定Command(Button.CheckBox.Rad ...
- 微信小程序项目踩过的几个坑
一.前言 近期,开始了一段辛酸的还未开始就已经结束的"创业"(参见我的第二次创业,以梦为马,莫负韶华).大体上是开发了一款微信小程序,关于创业这件事情就不细说了,本文主要介绍一下开 ...
- C#常用代码片段备忘
以下是从visual studio中整理出来的常用代码片段,以作备忘 快捷键: eh 用途: 类中事件实现函数模板 private void MyMethod(object sender, Event ...
- 【ASP.NET Core】处理异常(上篇)
依照老周的良好作风,开始之前先说点题外话. 前面的博文中,老周介绍过自定义 MVC 视图的搜索路径,即向 ViewLocationFormats 列表添加相应的内容,其实,对 Razor Page 模 ...
- 【技术干货】git常用命令
2.1 git init语法: git init在当前目录初始化git仓库,适用于尚未使用git管理的项目2.2 git clone语法: git clone <url>例如: git c ...