一:什么是事务
银行转账,张三给李四转了1000,张三账户上减去1000,李四账户就要加上1000,事务中的多个操作,要么完全成功,要么完全失败,不可能事情之做了一半。
事务的四大特性(ACID)
- 原子性(Atomicity):事务中所有操作是不可分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
- 一致性(Consistency):事务执行后,数据库状态与其他业务中规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
- 隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰。
- 持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
二:MySQL中开启和关闭事务
开启事务:
start transaction;
回滚事务:
rollback;
提交事务:
commit;
三:JDBC中完成对事务的处理
小例子:完成银行转账案例
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
*
* @author lenovo 对数据库的操作
*/
public class AccountDao {
public void updateBalance(Connection con, String name, int balance) {
try {
// 2.给出sql模板,创建pstmt
String sql = "update account set balance=balance+? where name=?";
PreparedStatement pstmt = con.prepareStatement(sql);
// 3.对参数进行赋值
pstmt.setInt(1, balance);
pstmt.setString(2, name);
// 4.更新语句
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.sql.Connection;
import java.sql.SQLException;
/**
* 演示转账功能
* @author lenovo
*
*/
public class Demo1 {
//同一个事务所有的操作,都在使用同一个Connection对象
public static void transfer(String from,String to ,int money) {
Connection con=null;
//
try {
//开启事务
con=JdbcUtils.getConnection();
con.setAutoCommit(false);//设置false为开启事务
AccountDao ado=new AccountDao();
ado.updateBalance(con,from, -money);//给from减去相应金额
ado.updateBalance(con,to,money);//给to加上相应金额
//提交事务
con.commit();
con.close();
}catch(Exception e){
//回滚事务
try {
con.rollback();
con.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public static void main(String[] args) {
transfer("张三","李四",100);
}
}
四:查询MySQL的隔离级别
select @@transaction_isolation;