一、事务的基本概念
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据的时候,在数据库中就会产生多个用户同时存取同一数据的情况。若对并发操作不加控制,就可能会产生读取和存储不正确的数据,破坏数据的一致性。
而事务是并发控制的基本单位。所谓事务,即一个操作序列。这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。比如银行转账工作:从一个账户扣款,并使用另一个账户收款,这两个操作要么都执行,要么都不执行,因此应该把它们看作是一个事务。
事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。
对于编程人员来说,可以把数据库事务看作是一组sql语句,这组sql语句是一个逻辑工作单元,它们是不可分割的,它们的执行结果应该作为一个整体永久修改一个数据库的内容或者作为一个整体取消对数据库的修改。
二、事务的四个基本特征
1.原子性
原子性是指事务中包含的操作都被看作是一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。这也意味着事务中的所有元素作为一个整体提交或回滚。事务的所有元素是不可分割的,是一个完整的操作。
2.一致性
一致性是指事务开始之前和事务结束以后数据库都处于一致性状态,数据库的完整性约束没有被破坏。
3.隔离性
隔离性是指对数据库进行修改的多个事务是彼此隔离的。这说明事务必须是独立的,不应该以任何形式影响其他事务
4.持久性
持久性是指事务完成之后对于数据库的影响是永久的,该修改真实地修改了数据库,即使数据库出现故障也会一直保留。
三、与SQL相关的事务语句
开始事务:BEGIN TRANSACTION
提交事务:COMMIT TRANSATION
回滚事务:ROLLBACK TRANSATION
package com.eduask.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*将要测试的逻辑
保存一个用户Tom的基本信息和Tom的地址信息
分别通过两个java方法插入到用户表和地址表中
在插入地址表的时候人为造成一个异常
观察结果
*/
public class TransactionTest {
//创建一个getConnection()用来获取数据库的连接
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdemo","root","root");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void insertUserData(Connection conn) throws SQLException{
String sql = "insert into tbl_user(id,name,password,email) "
+ "values(10,'Tom','123456','tom@gmail.com')";
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println("向用户插入了 "+ count + " 条记录");
}
public static void insertAddressData(Connection conn) throws SQLException{
String sql = "insert into tbl_address(id,city,country,user_id) "
+ "values(1,'ShangHai','China','10')";
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println("向地址表中插入了 "+ count + " 条记录");
}
public static void main(String[] args) {
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
insertUserData(conn);
insertAddressData(conn);
conn.commit();
} catch (SQLException e) {
System.out.println("=========捕获到SQL异常=========");
e.printStackTrace();
try {
conn.rollback();//回滚事务,保证数据库数据的一致性
System.out.println("=========事务回滚成功=========");
} catch (Exception e2) {
e2.printStackTrace();
}
}finally{
try {
if (conn != null) {
conn.close();
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
}
}
转载于:https://blog.51cto.com/11317783/1784316