社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
一组逻辑操作单元(一个或多个DML操作),使数据从一种状态变换到另一种状态。
1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态。
3.隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
数据操作过程中可能出现的问题:(针对隔离性)
保证所事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
1.数据一旦提交,就不可回滚
2.哪些操作会导致数据的自动提交?
Connection conn = JDBCUtils.getConnection();== //方式1:手动获取连接 方式2:数据库连接池==
conn.setAutoCommit(false); //体现事务
操作1:需要使用通用的增删改查操作
//通用的增删改查操作如何实现?//方式1:手动使用PreparedStatement实现;//方式2:使用dbutils.jar中QueryRunner类
操作2:需要使用通用的增删改查操作
操作3:需要使用通用的增删改查操作
conn.commit();
conn.rollback();
JDBCUtils.closeResource(…,…,…); //方式1:手动关闭资源 方式2:DbUtils类的关闭方法
@Test
public void testUpdateWithTx() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
System.out.println(conn.getAutoCommit());//true
//1.取消数据的自动提交
conn.setAutoCommit(false);
String sql1 = "update user_table set balance = balance - 100 where user = ?";
update(conn,sql1, "AA");
//模拟网络异常
System.out.println(10 / 0);
String sql2 = "update user_table set balance = balance + 100 where user = ?";
update(conn,sql2, "BB");
System.out.println("转账成功");
//2.提交数据
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//3.回滚数据
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
//修改其为自动提交数据
//主要针对于使用数据库连接池的使用
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
JDBCUtils.closeResource(conn, null);
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!