1. 事物
事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。
事务的特性:
原子性,是一个最小逻辑操作单元 !
一致性,事务过程中,数据处于一致状态。
持久性, 事务一旦提交成功,对数据的更改会反映到数据库中。
隔离性, 事务与事务之间是隔离的。
void setAutoCommit(boolean autoCommit) ; 设置事务是否自动提交如果设置为false,表示手动提交事务。
void commit(); 手动提交事务
void rollback() ; 回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)
Savepoint setSavepoint(String name) 回滚到指定位置
案例 张三给李四转账
- 首先创建一个数据表用于存储张三与李四的相关信息
create table account(
id int primary key auto_increment,
accountName varcahr(40),
money double);
- 存入张三与李四的数据
insert into account(accountName,money) values("张三",500);
insert into account(accountName,money) values("李四",510);
-
查看
- 代码部分
- 未使用事物回滚操作
package demo2;
import util.DBConn;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class AccountDemo {
private static Connection conn = null;
private static PreparedStatement stmt = null;
public static void main(String[] args) {
String sql_zs = "update account set money=money-500 where accountName='张三'";
String sql_ls = "update account set money=money+500 where accountName='李四'";
try {
conn = DBConn.getConn();
conn.setAutoCommit(true); //将事物设置为自动提交
stmt = conn.prepareStatement(sql_zs);
stmt.executeUpdate();
stmt = conn.prepareStatement(sql_ls);
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
问题:当张三这条sql语句执行成功,而李四这条sql语句却没执行成功时,在数据库中则会显示张三的钱变少了,而李四的钱却没有增加,这在现实中是一个很严重的问题.
- 使用事物回滚操作
其中只要有一条sql语句执行不成功,另一条也不会生效
package demo2;
import util.DBConn;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class AccountDemo2 {
private static Connection conn = null;
private static PreparedStatement stmt = null;
public static void main(String[] args) {
String sql_zs = "update account set money=money-500 where accountName='张三'";
String sql_ls = "update account set money=money+500 where accountName='李四'";
try {
conn = DBConn.getConn();
conn.setAutoCommit(false); //将事物设置为手动提交
stmt = conn.prepareStatement(sql_zs);
stmt.executeUpdate();
stmt = conn.prepareStatement(sql_ls);
stmt.executeUpdate();
} catch (Exception e) {
try {
//出现异常,需要回滚事物
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
//所有操作执行成功,提交事物
conn.commit();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}