作为刚工作不久的小菜鸟,对于事务这个词还是理解的不深刻,不用的时候没关系,在现在出问题了了,才发现,还是得学习一下事务,根据自己的习惯,先列一下总体的大纲:
- 事务概述
- 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();回滚事务
}
事务的基本概念差不多就这些,自己也是才疏学浅,没有好的记录习惯,这也是自己简书的第一篇技术博客,再接再厉。