博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java事物处理
阅读量:4180 次
发布时间:2019-05-26

本文共 2341 字,大约阅读时间需要 7 分钟。

事物处理

什么是事物:个人认为事物,就是对数据库进行一组操作动作的集合,如果一组处理步骤要么全发生,要么一步也不执行,称这组处理步骤为一个事物。当所有的步骤完整地被执行,称该事物被提交,当一部分步骤导致执行失败,则事物必须回滚到以前的执行状态.

数据库的事务是保证数据完整性的一种机制,简而言之,就是怎样确保数据的执行过程要么都成功,要么都失败,举例子为假设你要给银行还款,需要从你的银行卡中扣除相关的金额也需要在你的信用卡上加钱,这个流程务必是一个完整的流程,不能拆分,如果从你的银行卡中扣除了钱,但是加钱的流程是失败的,这个时候用户是吃亏的,反之银行则会亏本,所以这就涉及到了事务的机制。


1.原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。

2.一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。
3.隔离性(isolcation):一个事务处理对另一个事务处理没有影响。
4.持续性(durability):事务处理的效果能够被永久保存下来 。
概括起来可以用ACID来表述


事务处理四步曲

1 connection.setAutoCommit(false); //把自动提交关闭
2 正常的DB操作 //若有一条SQL语句失败了,自动回滚
3 connection.commit() //主动提交 或 connection.rollback() //主动回滚
4 connection.setAutoCommit(true); //把自动提交打开



举例 :银行账户 第一个用户存了1000块钱 第二个没钱 第一个用户向第二个用户转账 (约束 存款不能小于0)






import java.sql.SQLException;

import com.yc.dao.DBHelper;

public class Test {

//使用隐式事务来完成转账的危害 => 银行破产
public static void main(String[] args) throws SQLException {

DBHelper db=new DBHelper();    //业务流程: 2号用户+10000,   1号用户-10000    //  2号用户+10000    String sql="update bankaccount set balance=balance+10000 where aid='2'";    db.doUpdate(sql, null);    //1号用户-10000    sql="update bankaccount set balance=balance-10000 where aid='1'";    db.doUpdate(sql, null);}

}

导致第一个用户钱没变 还是1000块 而第二个用户有了10000块
使用事物处理:
public class Test2 {
//使用了事务
public static void main(String[] args) throws SQLException {
String sql = “update bankaccount set balance=balance+? where aid=?”;
List params = new ArrayList();
params.add(“10000”);
params.add(“2”);

String sql2 = "update bankaccount set balance=balance-? where aid=?";    List
params2 = new ArrayList
(); params2.add("10000"); params2.add("1"); List
sqls = new ArrayList
(); sqls.add(sql); sqls.add(sql2); List
> paramsList = new ArrayList
>(); paramsList.add(params); paramsList.add(params2); DBHelper db = new DBHelper(); Connection con = db.getCon(); // 关闭隐式事务 con.setAutoCommit(false); try { for (int i = 0; i < sqls.size(); i++) { PreparedStatement pstmt = con.prepareStatement(sqls.get(i)); List
paramsl = paramsList.get(i); for (int j = 0; j < paramsl.size(); j++) { pstmt.setString(j + 1, paramsl.get(j)); } pstmt.executeUpdate(); } con.commit(); } catch (SQLException e) { e.printStackTrace(); con.rollback(); } finally { con.setAutoCommit(true); con.close(); }}

}

转载地址:http://tyhai.baihongyu.com/

你可能感兴趣的文章
AWS EC2如何从普通用户切换为root用户
查看>>
click方法不生效的
查看>>
mysql排行榜并列与不并列
查看>>
SpringBoot | Mybatis申明为Mapper文件
查看>>
JPA主键生成策略
查看>>
byte数组和InputStream的相互转换
查看>>
InputStream,InputStreamReader和Reader之间的区别与关系
查看>>
Java中System.arraycopy方法的使用
查看>>
tk.mybatis的使用记录
查看>>
遍历获取目录下的所有文件
查看>>
从指定服务器路径下载文件
查看>>
EasyExcel读取和写入java model数据
查看>>
《C编译原理》共享库的动态加载和静态加载
查看>>
《Android系统学习》第二章:如何制作OTA U盘升级包
查看>>
《Android系统学习》第五章:编译Android的JDK环境
查看>>
《C++特性》之引用类型
查看>>
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第八章:Android gtest
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>