搜索
您的当前位置:首页正文

一起学习事务

来源:二三娱乐

作为刚工作不久的小菜鸟,对于事务这个词还是理解的不深刻,不用的时候没关系,在现在出问题了了,才发现,还是得学习一下事务,根据自己的习惯,先列一下总体的大纲:

  • 事务概述
  • MySql的事务
  • JDBC的事务
  • 事务的隔离级别

什么是事务?

  • 我的理解
    我给马云支付宝转了100元,最简单的方式需要执行两条SQL:
    • 我的账号减去100元
    • 马云的账号加上100元
      如果在第一条SQL语句执行成功后,在执行第二条语句之前,程序被中断,或者是抛出异常,那么马云的账号没有加100元,但是我的账户确减去了100元,我得找支付宝客服!!!
      事务存在就会是这样的:
  • 我的账号减去了100元,马云的账号加上了100元
  • 我的账号没有减钱,马云的账号也没有增加100元,也就是要么一块支付成功,要么全部没有支付。

事务的特征

  • 原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
  • 一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
  • 隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
  • 持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

MySql的事务

默认情况下,MySql每次执行一条SQL,都是一个单独的事务,如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。

  • 开启事务 start transaction;
  • 结束事务 commit或者rollback

在执行SQL语句之前,先执行start transaction,就开启了一个事务,然后可以去执行多条SQL语句,最后要结束事务,commit是提交,即表示事务中的多条SQL语句所做的影响会持久化到数据库中,或者rollback,表示回滚,即回滚到事务的起点,之前做的所有的操作都会被撤销。

START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
UPDATE account SET balance=balance+10000 WHERE id=2;
ROLLBACK;

这表示事务回滚,事务执行失败。

START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
UPDATE account SET balance=balance+10000 WHERE id=2;
COMMIT;

表示事务提交结束,事务执行成功。

START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
UPDATE account SET balance=balance+10000 WHERE id=2;
quit;

退出,mysql就会自动回滚事务。

JDBC的事务

JDBC中Connection的三个方法和事务相关:

  • setAutoCommit(boolean):设置是否自动提交事务,如果true,也是默认的,是自动提交,也就是每条执行的SQL都是一个单独的事务,如果设置了false,就相当于开启了事务。
  • commit() 提交事务;
  • rollback() 回滚结束事务

JDBC处理事务的代码

try{
     con.setAutoCommit(false);//开始事务
     ...
     ...
     ....
    
}catch{
    con.rollback();回滚事务
}

事务的基本概念差不多就这些,自己也是才疏学浅,没有好的记录习惯,这也是自己简书的第一篇技术博客,再接再厉。

Top