事务

基本概念:

事务是指  一组 --(最小逻辑)操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。

事务ACID特性

原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。(是一个最小逻辑操作单元)

一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。(事务与实务之间是隔离的,比如有几个事务同时是访问数据库,第一个访问完了第二个才能访问)

持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响(事务一旦提交成功,对数据的更改反映到数据库中)

事务的特性:

原子性,是一组最小逻辑操作单元 !

一致性,事务过程中,数据处于一致状态。(转账之前和转账之后还是1000块块钱)

持久性, 事务一旦提交成功,对数据的更改会反映到数据库中。

隔离性, 事务与事务之间是隔离的。

案例

需求: 张三给李四转账

设计: 账户表

|-- Connection接口的一些方法

void setAutoCommit(boolean autoCommit) ;  设置事务是否自动提交

如果设置为false,表示手动提交事务。

void commit() ;        手动提交事务

void rollback() ;   回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)

-- 账户表

CREATE TABLE account(

id INT PRIMARY KEY AUTO_INCREMENT,

accountName VARCHAR(20),

money DOUBLE

);

-- 转账

UPDATE account SET money=money-1000 WHERE accountName='张三';

UPDATE account SET money=money+1000 WHERE accountName='李四';

// 全局参数

private Connection con;

private PreparedStatement pstmt;

// 1. 转账,没有使用事务

public void trans1() {

String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName='张三';";

String sql_ls = "UPDATE account SET money=money+1000 WHERE accountName='李四';";

try {

con = JdbcUtil.getConnection(); // 默认开启的隐士事务

con.setAutoCommit(true);

/*** 第一次执行SQL ***/

pstmt = con.prepareStatement(sql_zs);

pstmt.executeUpdate();

/*** 第二次执行SQL ***/

pstmt = con.prepareStatement(sql_ls);

pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

} finally {

JdbcUtil.closeAll(con, pstmt, null);

}

}

// 2. 转账,使用事务

public void trans2() {

String sql_zs = "UPDATE account SET money=money-1000 WHERE accountName='张三';";

String sql_ls = "UPDATE1 account SET money=money+1000 WHERE accountName='李四';";

try {

con = JdbcUtil.getConnection(); // 默认开启的隐士事务

// 一、设置事务为手动提交

con.setAutoCommit(false);

/*** 第一次执行SQL ***/

pstmt = con.prepareStatement(sql_zs);

pstmt.executeUpdate();

/*** 第二次执行SQL ***/

pstmt = con.prepareStatement(sql_ls);

pstmt.executeUpdate();

} catch (Exception e) {

try {

// 二、 出现异常,需要回滚事务

con.rollback();

} catch (SQLException e1) {

}

e.printStackTrace();

} finally {

// 三、所有的操作执行成功, 提交事务

con.commit();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 预编译sql处理(防止sql注入) Statement : 执行SQL命令CallableStatement : ...
    奋斗的老王阅读 1,166评论 2 52
  • 本文包括:1、事务概念2、MySQL管理事务3、JDBC控制事务进程4、事务的特性(ACID)5、事务的隔离级别6...
    廖少少阅读 869评论 0 3
  • 一、事务 事务就是一个事情,组成这个事情可能有多个单元,要求这些单元,要么全都成功,要么全都不成功。在开发中,有事...
    野狗子嗷嗷嗷阅读 2,816评论 0 6
  • 问题:事务是什么,有什么用? 事务就是一个事情,组成这个事情可能有多个单元,要求这些单元,要么全都成功,要么全都不...
    yeller阅读 758评论 0 0
  • 四十五岁 人生之秋 思过去 曾经的岁月,倒海翻江 千丘万壑,雨雪风霜 四十五岁 人生之秋 向前方 壮丽的秋色,一路...
    楚爸王阅读 284评论 0 2