1.什么是事务?
事务(Transaction),一般是指要做的或所做的事情。
在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
程序执行单元(unit)—数据库操作的一组SQL语句的执行。
1.由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写
2.由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
例如:我们要实现一个银行转账的操作,首先从A账户减掉指定的金额,然后B账户增加指定的金额,此时转账操作结束。上面的操作如果对应成数据库操作,那么就需要执行两条update语句。数据库把这两条update语句的执行就是一个事务。
指访问并可能更新数据库中各种数据项的一组SQL语句的执行单元(unit)。
2.数据库的事务有4大特征【ACID】
A–原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
C–一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
I–隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
D–持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
3.java中事务的隔离级别
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。
JDBC定义了五种事务隔离级别:
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。
TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。
TRANSACTION_NONE JDBC驱动不支持事务
4.JDBC的事务管理操作
JDBC的事务管理操作需要通过java.sql.Connection接口来设置的。
(1)事务的隔离级别
(2)设置事务隔离级别的方法
例如:
Connection接口对象.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Connection接口对象.setTransactionIsolation(8);
(3)设置是否自动提交事务方法【默认JDBC事务是自动提交的】
Connection接口对象.setAutoCommit(falset) ; 设置为手动提交事务。
(4)事务的提交方法
(5)事务的回滚方法【异常中执行】
5.转账实例
#创建数据库表
create table t_zhanghu(
zhuanghu_id int primary key auto_increment,
zhuanghu_name varchar(20),
zhuanghu_jine int
);
insert into t_zhanghu values(null,'zhangsan',10000);
insert into t_zhanghu values(null,'lisi',10000);
package com.wangxing.transactiondemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 数据库连接类
* @author Administrator
*
*/
public class DBConnection {
private static final String DRIVER_NAME="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://127.0.0.1:3306/test";
private static final String USERNAME="root";
private static final String PASSWORD="123456";
//加载数据库驱动
static {
try {
Class.forName(DRIVER_NAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 得到数据库连接对象
*/
public static Connection getConnection() {
Connection conn=null;
try {
conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
package com.wangxing.transactiondemo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 转账的业务类
* @author Administrator
*
*/
public class ZhuanZhangService {
public void zhuanzhuang() {
Connection conn=DBConnection.getConnection();
PreparedStatement ps=null;
try {
//设置为手动提交事务
conn.setAutoCommit(false);
//设置事务隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
String sql="update t_zhanghu set zhuanghu_jine=? where zhuanghu_name=?;";
ps=conn.prepareStatement(sql);
ps.setInt(1, 10000-1000);
ps.setString(2, "zhangsan");
ps.executeUpdate();
//int a=10/0;
ps.setInt(1, 10000+1000);
ps.setString(2, "lisi");
ps.executeUpdate();
//提交事务
conn.commit();
}catch(Exception e) {
//回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
6.总结:
1.SQL语句执行的connection与事务设置的connection对象要相同。
2.开始事务conn.setAutoCommit(false);
3.设置事务的隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
4.提交事务conn.commit();
5.设置事务回滚【异常中进行】conn.rollback();
上面我们所操作的事务管理是编码式事务管理,后面我们在学习Spring框架的时候会学习到声明式事务管理。