对于要把事务在实际中使用好,需要了解事务的特性。

事务的四大特性主要是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

一、事务的四大特性

1.1 原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。

begin transaction;

update account set money = money-100 where name = '张三';

update account set money = money+100 where name = '李四';

commit transaction;

1.2 一致性(Consistency)

官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。

举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性。

1.3 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

1.4 持久性(Durability)

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

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

二、数据库ACID的体现

2.1 原子性

原子性说的是数据要么一起成功,要么一起失败,那么就有两种情况:事务提交(commit)和事务回滚(rollback)。

我们先看下事务正常提交的情况,下面我们在数据库模拟张三给李四转账成功的场景:

我们手动提交(commit)数据库事务之后,张三给李四转账100元的这个业务操作算是真正成功了,张三账户中少了100,李四账户中多了100。

接下来看下事务不正常的情况下:

事务回滚之后,对于张三和李四的金额的操作都失败了,这就确保了事务的原子性。

2.2 一致性

一致性主要说明的是事务的前后,数据库中的数据的状态要确保一致。

事务提交成功,那么张三账户上的余额是900元,李四账户上的余额是100元。

事务提交失败,那么张三和李四的账户的金额不变。

这说明现在在数据库的事务的控制下,确保了数据的一致性。

2.3 隔离性

隔离性的体现,多个并发事务之间是隔离的。

张三给李四转账,如果事务没有提交的话,那么在另外一个session中并不能查看另外一个session未提交的数据。

2.4 持久性

持久性的体现就是数据一旦commit之后,那么对于数据的改变就是永久的。我们commit之后,张三的账户就永久减少了100元,李四的账户就永久增加了100元。

三、JDBC ACID的体现

我们使用JDBC连接MYSQL数据库的代码:

public class App {

public static void main(String[] args) throws ClassNotFoundException, SQLException {

/*

* 1/ 注册JDBC驱动;

* 2/ 获取连接;

* 3/ 开启事务

* 4/ 创建SQL语句;

* 5/ 执行SQL语句;

* 6/ 提交事务

* 7/ 关闭连接.

*

*/

// 1/ 注册JDBC驱动;

Class.forName("com.mysql.cj.jdbc.Driver");

String url = "jdbc:mysql://127.0.0.1:3306/tx_demo";

String user = "root";

String password = "root";

// 2/ 获取连接;

Connection conn = DriverManager.getConnection(url, user, password);

// 3/ 开启事务

conn.setAutoCommit(false);

// 4/ 创建SQL语句; 注意:实际使用account的主键,这里主要是为了方便理解。

String sql = "update account set money = money-100 where name = ?";

PreparedStatement ps = conn.prepareStatement(sql);

ps.setString(1,"张三");

// 5/ 执行SQL语句;

int rs = ps.executeUpdate();

if(rs>0) {

System.out.println("张三-扣减成功");

}

// 给李四增加金额

sql = "update account set money = money+100 where name = ?";

ps = conn.prepareStatement(sql);

ps.setString(1,"李四");

rs = ps.executeUpdate();

if(rs>0) {

System.out.println("李四-增加成功");

}

// 6/ 提交事务,更标准的写法应该拦截异常,有异常的情况下rollback();

conn.commit();

// 7/ 关闭连接.

ps.close();

conn.close();

}

}

说明:

如果代码正常运行的话,那么张三会扣减金额,李四会增加金额,这就确保的原子性;

一旦数据保存到数据库之后,数据就永久被改变了,这就是持久性;

事务前后,数据的状态也是我们所期望的状态,这就保证了数据的一致性;

如果在事务未commit的话,那么在另外一个线程发起查询请求的话,那么并不能查看到最近的数据(这里未进行编码),这就是隔离性。

java事务四大特性ACID相关推荐

  1. 不属于mysql事物的特性_mysql基础---事务 事务的四大特性(ACID) 四种隔离级别

    一.事务 mysql中,事务是一个最小的不可分割单元.事务能够保证一个业务的完整性. eg:银行转账 a -> -100 update user set money=money-100; b - ...

  2. 事务四大特性(ACID)

    事务四大特性(ACID) (1)原子性(Atomic) ​ 指事务是一个不可分割的工作单位(像原子一样),事务中的操作要么都发生,要么都不发生.实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚 ...

  3. ACID(事务四大特性)

    事务四大特性(ACID): 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某 ...

  4. 事务四大特性及隔离级别

    事务四大特性及隔离级别 咱们都知道事务有四大特性ACID,也就原子性(atomicity|ætəˈmɪsəti|). 一致性(consistency).隔离性(isolation|aɪsəˈleɪʃn ...

  5. 事务四大特性之——隔离性

    事务四大特性之--隔离性 四大特性 一.4种隔离级别 二.案例 2.1 模拟业务需求 2.2 解决方案 且夫孝始于事亲,中于事君,终于立身. 孝的初始境界是侍奉自己的双亲,中层境界是侍奉自己的国君,最 ...

  6. MySQL中事务四大特性的实现详解

    MySQL事务的四大特性的实现 基本概念 原子性实现 隔离性实现 已提交读 可重复读 持久性实现 日志文件刷新策略 基本概念 事务的四大特性ACID : 原子性Atomic : 事务的所有的SQL操作 ...

  7. mysql事务四个特性_关系型数据库mysql事务四大特性

    关系型数据库mysql 事务四大特性 一.首先我们先说一下什么是事务 在mysql中对数据进行增删改查中的任何一次操作的过程都可以被认为是一次事务,事务是一系列严密的操作,事务的结束有两种结果,当事务 ...

  8. 数据库事务 四大特性

    数据库事务四大特性(ACID) 敲黑板,这是重点,记下来!!会考到 转载连接:https://www.cnblogs.com/fjdingsd/p/5273008.html ⑴ 原子性(Atomici ...

  9. mysql事务特性的主要作用是_mysql事务四大特性

    本篇讲诉数据库中事务的四大特性(ACID)和简单操作 ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务 ...

最新文章

  1. 五年前的转正我没有留下,校招进不了大公司就是失败吗?
  2. golang goroutine协程概念及入门:轻量级线程(或用户态线程)
  3. BufferedReader_字符缓冲输入流
  4. js获取当前日期星期几
  5. 文件服务器有病毒,服务器共享文件会被病毒加密吗
  6. python中监控错误的语句_Python学习_07_错误、异常
  7. 如何用 Python 实现超级玛丽的界面和状态机?
  8. Redis 数据类型及应用场景
  9. 【html笔记】html介绍和语法入门
  10. C#:Md5和Sha1两种加密方式
  11. 统计素数并求和python_Python练习题4.2统计素数并求和
  12. VScode保存快捷键(ctrl+s)失效
  13. 会议一体机_多媒体会议系统方案
  14. IM云通信行业步入快车道,融云或将和Twilio一样实现资本上市
  15. 一个程序员购买保险之路-1(适用于所有人)
  16. 新鲜出炉2010笑话集锦,我竟然一个都没听过
  17. android外接手机模拟器,HBuilderX 连接网易mumu手机模拟器进行App开发
  18. Linux-ARM开发
  19. 如何去除BootStrap栅格系统默认的15px的padding
  20. docker 镜像启动并完成服务部署

热门文章

  1. jQuery中的Deferred详解和使用
  2. 华为鸿蒙nova,华为Nova5怎么升级鸿蒙系统 Nova5升级鸿蒙系统教程
  3. java http post上传文件_Java通过HTTP POST请求上传文件
  4. 其实,这就是「幸存者偏差」
  5. 国庆 深圳游玩 路线规划之龙华区
  6. Html中的 http-equiv=X-UA-Compatible 解释
  7. android系统手机限制cpu频率让手机省电
  8. PPT批量处理百宝箱,一颗不该被埋没的沧海遗珠
  9. 前端js调用相机实现拍照,下载照片功能
  10. Redis Client On Error: Error: write ECONNABORTED Config right