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后 ...
随机推荐
- Swing EDT引起的客户端卡死
最近调试程序时发现,点击某个界面时会出现卡死的情况,出现的频率还是比较频繁的. 再次出现卡死的情况后,利用jvisualvm查看线程的运行情况,dump操作之后发现线程间出现了死锁: Found on ...
- IOS教程视频汇总
使用StoryBoard做iOS UI界面跳转
- 解决PhpStorm卡顿的问题
以前的开发一直使用phpstorm.可谓是情有独钟,但是发现随着开发phpStorm逐渐变得卡顿,也试过其他的编译器,但是都感觉没有PhpSrom好用,网上百度了一下,看到不一样的回答.只要修改两个J ...
- PHP实现session对象封装
<?php class Session { private $db; // 设置数据库变量 private $expiry = 3600; // 设置Session失效时间 public fun ...
- 常用VI操作命令
# ------------------- VI basic ------------------------------- # file name: VI_basic # author : # da ...
- linux下简洁优化部署tomcat应用
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本文是自己根据公司架构部署tomcat方法整理出来的文本 修 ...
- mongodb的TTL索引介绍(超时索引)
TTL索引是mongodb新支持的用于延时自动删除记录的一种索引.它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引.可以指定某条记录在延时固定时间后自动删除.数据自动超时删除主要用 ...
- MySQL Server 5.0安装教程
相信很多朋友刚开始接触mysql数据库服务器,下面是mysql的安装教程,步骤明细也有详细的说明. 工具/原料 mysql MySQL安装的图解 1 打开下载的mysql安装文件mysql-5 ...
- hibernate学习(六) flush()和clean()区别和使用
session.flush()是强制和数据库同步 session.clean()是清除session中的缓存 对于批量数据插入的时候优化:减少cpu和内存(缓存)占用量 @Test public vo ...
- LNMP搭建环境遇到的N多坑
最近配置开发用的lnmp环境,环境配置完成后,爆500错误,查看nginx错误日志 open_basedir 将 PHP 所能打开的文件限制在指定的目录树,包括文件本身 错误日志显示,访问脚本不在 o ...