事务实例(基于Mysql)
来源:互联网 发布:淘宝卖家星级 编辑:程序博客网 时间:2024/06/13 22:45
转账事例:
小A有1000元,想转账给小B100元,小B有1000元。
数据库内的操作:
小a的钱减少100,小b的钱增加100,然后这两个必需都得完成,如果有一个语句失败,更新的钱数就得回到原来的状态,因此此处需要数据库的事务。
还是采用三层架构:
数据库连接采用c3p0连接池技术。
Dao层采用dbutil框架。详细用法看我自己记的笔记。
Dao层不做任何业务逻辑的处理,业务逻辑处理全部放到service层。在service层进行数据库事务的处理。
Model层内的Account这个javabean必需和数据库内的字段一模一样。因为dbutil是采用的反射技术。
先贴上dao层和service层的代码:
Dao层:
publicclass TransformMysqlImpl {
/*
* 用事务进行转账 1.把a的钱转到b a-100,b+100但是dao层不能做任何业务逻辑处理所有的业务逻辑放到业务逻辑层 dao层只负责连接
*/
private Connectionconn;
private QueryRunnerqr =new QueryRunner(JdbcUtil.getSouce());
public TransformMysqlImpl(Connection conn) {
this.conn = conn;
}
public TransformMysqlImpl() {
}
publicvoid update(Account account) {
String sql = "update account set balance=? where accountName=? ";
Object params[] = { account.getBalance(), account.getAccountName() };
try {
qr.update(conn, sql, params);
} catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
//根据用户的姓名查处是account对象
public Account quaryAccount(String name) {
Account account = null;
String sql = "select *from account where accountName=? ";
// PreparedStatementprsmt=null;
try {
account = (Account) qr.query(sql, name,new BeanHandler<Account>(
Account.class));
System.out.println(account.getAccountName()
+ account.getAccountID());
return account;
// qr.query(sql,param, rsh)
} catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
returnnull;
service层:
publicclass Transform {
private Connectionconn = JdbcUtil.getConn();
private TransformMysqlImpltf =new TransformMysqlImpl(conn);
publicvoid transform(String souceName, String targetName,double money) {
//业务逻辑层
//先查出账户
Account source = tf.quaryAccount(souceName);
// System.out.println(source.getName()+source.getBalance());
Account target = tf.quaryAccount(targetName);
//进行转账计算
//转出账号减少钱
source.setBalance(source.getBalance() - money);
//转入账号加钱
target.setBalance(target.getBalance() + money);
//开启事务,放入dao层
try {
conn.setAutoCommit(false);
tf.update(source);
inti = 1 / 0;
tf.update(target);
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
conn.commit();
} catch (SQLException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
} finally {
JdbcUtil.close(conn);
}
//TODO Auto-generated catch block
e.printStackTrace();
}
}
- 事务实例(基于Mysql)
- mysql 事务应用实例
- MySQL事务应用实例
- 基于spring事务简单实例
- 基于mysql事务应用分析
- php/ mysql 执行事务实例
- mysql事务回滚实例
- PHP使用Mysql事务实例解析
- mysql 事务操作详细实例介绍
- mysql 存储过程及事务实例
- java基于atomikos做分布式事务(简单实例)
- 事务实例
- 基于MySQL的分布式事务控制方案(C#实现)
- 解决基于SpringMVC+MYSQL注解@Transaction事务无效问题
- 在Mysql存储过程中使用事务实例
- MySQL数据库事务隔离级别(Transaction Isolation Level)-详细实例!
- MySQL事务隔离级别详解与实例说明
- MySQL数据库事务实例(模拟银行转账)
- 并查集题集(一)
- 会话管理
- 二叉树非递归的后序前序中序遍历
- 窗口关闭过程,非模态对话框为什么不能使用enddialog关闭窗口
- java web的知识点总结
- 事务实例(基于Mysql)
- oracle flash table
- TBODY的解释和用法
- 【曾国藩语录】
- c++ 函数返回引用
- JQuery Mobile入门——分割列表项
- 使用百度地图离线JavaScript API加载本地瓦片地图
- 主题中的皮肤和样式表
- 用 C# 绘制曲线图(Curve图,增加自动适应和多曲线绘制)