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后 ...
随机推荐
- 17年年终总结——走过2017,迎来2018Flag
引言 记得大概从大学毕业到现在都没有写作啥总结性的文章了(ps:应该是没写过啥长篇大论了),所以也不知道怎么个起头.我也闲聊的方式起头吧. 其实跨入18年就想着写篇总结,总结下自己17年的得与失,不足 ...
- IIS 加载 JSON 错误 404 解决办法
MIME设置:在IIS的站点属性的HTTP头设置里,选MIME 映射中点击”文件类型”-”新类型”,添加一个文件类型:关联扩展名:*.json内容类型(MIME):application/x-java ...
- python3加密解密模块 cryptography
cryptography 的目标是成为"人类易于使用的密码学包cryptography for humans",就像 requests 是"人类易于使用的 HTTP 库H ...
- Linux下LNMP启动不了的问题总结(2015.05)
[1] *****@*****-VirtualBox:~$ sudo /etc/init.d/mysql.server start Starting MySQL * Couldn't find MyS ...
- [POJ 3581]Sequence
[POJ 3581]Sequence 标签: 后缀数组 题目链接 题意 给你一串序列\(A_i\),保证对于$ \forall i \in [2,n],都有A_1 >A_i$. 现在需要把这个序 ...
- Java经典编程题50道之十九
打印出如下图案(菱形) * *** ****** ******** ****** *** * public class Example19 ...
- Yii的HTML助手
Html 帮助类 基础 表单 样式表和脚本 超链接 图片 列表 任何一个 web 应用程序会生成很多 HTMl 超文本标记.如果超文本标记是静态的, 那么将 PHP 和 HTML 混合在一个文件里 这 ...
- MysqL自动提交机制的关闭
MysqL在执行一句数据库操作命令的时候,通常都是自动提交的.常用引擎下有两种,分别是MyIsam和InnoDB,MyIsam是不支持事务处理的,但InnoDB支持,但InnoDB在不开启事务处理的情 ...
- c#IO的学习
常见应用方面 一.路径的相关操作,如判定路径是否合法,路径类型,路径的特定部分,合并路径,系统文件夹路径等内容:二.相关通用文件对话框,这些对话框可以帮助我们操作文件系统中的文件和目录:三.文件.目录 ...
- uva140
全排列回溯剪枝. 题目数据很水.记录当前最小带宽,边回溯边计算当前序列最大的距离(也就是带宽),如果当前带宽超过了当前的最小带宽就剪枝. 注意下,数据读入时的字符串处理. AC代码 #include& ...