什么是事务?

  • 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全部成功,要么全部失败.
  • 以转账为例: 张三给李四转账,张三扣1000,李四加1000; 加钱和扣钱两个操作组成了一个事务.

1. 事务的四大特性

  • 原子性(Atomicity): 事务中所有操作是不可再分割的原子单位. 事务中所有操作要么全部执行成功,

    要么全部执行失败.
  • 一致性(Consistency): 事务的其他特性都是为了这一特性服务的.即事务执行后,数据库状态和其他业

    务规则保持一致, 如转账业务,无论事务执行成功与否,参与转账的两个帐号余额之和应该是不变的.
  • 隔离性(Isolation): 指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰.
  • 持久性(Durability): 一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使事务

    提交后,数据库马上崩溃了,在数据库重启时,也必须能保证通过某种机制恢复数据.

2. MySql 中操作事务

在默认的情况下,MySql 每执行一条 SQL 语句,都是一个单独的事务.如果需要在一个事务中包含多条 SQL 语句,

那么需要开启事务和结束事务:

  • 开启事务: start transaction;
  • 结束事务: commit 或 rollback;
// 示例: 张三给李四转账 100

START TRANSACTION; // 开启事务
UPDATE account SET balance=balance-100 WHERE id=1;
UPDATE account SET balance=balance+100 WHERE id=2;
ROLLBACK; // 回滚, 表示转账失败 START TRANSACTION; // 开启事务
UPDATE account SET balance=balance-100 WHERE id=1;
UPDATE account SET balance=balance+100 WHERE id=2;
COMMIT; // 提交, 表示转账成功

3. JDBC 中操作事务

  1. 在 JDBC 中操作事务,都是通过 Connection 完成的! 同一个事务中所有的操作,必须使用同一个 Connection 对象.
  2. Connection 对象与操作事务相关的方法:
    • setAutoCommit(false): 表示开启事务;
    • commit(): 表示提交事务;
    • rollback(): 表示回滚事务.
// 代码格式:
try{
con.setAutoCommit(false); // 开启事务
....
..
con.commit(); // 提交事务
}catch(){
con.rollback(); // 回滚事务
} //

4. 事务隔离级别

1. 事务的并发读问题

  • 脏读(dirty read): 读到了另一事务的未提交更新数据, 即读到了脏数据;
  • 不可重复读(unrepeatable read): 对同一记录的两次读取不一致, 因为另一事务对该记录做了修改;
  • 幻读(虚读,phantom read): 对同一张表的两次查询不一致, 因为另一事务插入了一条记录.

2. 不可重复读和幻读的区别

  • 不可重复读是读取到了另一事务的更新;
  • 幻读是读取到了另一事务的插入.

3. 四大隔离级别

3.1 SERIALIZABLE (串行化)
  • 三种读问题都能处理;
  • 不会出现任何并发问题, 因为它对同一数据的访问是串行的, 非并发访问;
  • 性能最差;
3.2 REPEATABLE READ(可重复读)
  • 防止脏读和不可重复读,不能处理幻读;
  • 性能比 SERIALIZABLE 好;
  • MySQL 数据库默认;
3.3 READ COMMITED (读已提交数据)
  • 防止脏读, 没有处理不可重复读, 也没有处理幻读;
  • 性能比 REPEATABLE READ 好;
  • Oracle 数据库默认.
3.4 READ UNCOMMITED(读未提交数据)
  • 可能出现任何事务并发问题;
  • 性能最好;

5. MySQL 隔离级别

  • MySQL 的默认隔离级别为 REPEATABLE READ;
  • 查询隔离级别语句: select @@tx_isolation;

6. JDBC 设置隔离级别

  • con.setTransactionIsolation(int level);

参考资料:

最新文章

  1. 基础的jdbc连接数据库操作
  2. 浅谈我对 jQuery 的了解
  3. CentOS7 编译安装 Mongodb (实测 笔记 Centos 7.0 + Mongodb 2.6.6)
  4. CentOS 7下MySQL服务启动失败的解决思路
  5. POJ2965
  6. Javascript的对象封装和继承有哪些方法?优劣分别是什么?
  7. passport 自动取密码
  8. <转>Python3.x和Python2.x的区别介绍
  9. PHP获取当前url路径的函数及服务器变量
  10. Objective-C中的分类与协议
  11. java中的final, finally, finalize的区别
  12. leetcode:linked_list_cycle_II
  13. jQuery css,position,offset,scrollTop,scrollLeft用法
  14. xlwt 格式控制
  15. 04 Feasibility of Learning
  16. 理解WebKit和Chromium: Chromium WebView和Chrome浏览器渲染机制
  17. python之six用法
  18. 0412ooday01.txt=============对象和类(上)
  19. 2018-2019-2 网络对抗技术 20165317 Exp4 恶意代码分析
  20. transform:scale()妙用——当下拉列表,图片无缝拉升 动画效果

热门文章

  1. WebUI中 DataGrid多层表头 的终极解决办法
  2. 檢查php文件中是否含有bom的php文件
  3. 正确的使用字符串String
  4. rabbitmqctl 报错
  5. 采用CDN加速后,如何在程序里获取用户IP地址
  6. Atitit.一些公司的开源项目 重大知名开源项目attilax总结
  7. Strategy模式
  8. HDU 4925 Apple Tree (瞎搞)
  9. Python内置函数之bytes()
  10. 【原创】菜鸟版Android 笔记1- Android架构和Application