0%

事务

简介

什么是事务?

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

为什么要事务?

事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。ACID原则:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、 持久性(durability。(保证数据的安全)

更详细介绍访问这篇博客

Java事务类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。

  • JDBC事务,我们可以将多个SQL语句放到同一个事务中,保证其ACID特性。缺点:一个 JDBC 事务不能跨越多个数据库!

  • JTA事务,JTA(Java Transaction API)提供了跨数据库连接(或其他JTA资源)的事务管理能力。缺点:实现复杂。

  • 容器事务,Spring容器。案例见这里:传送门

案例-JDBC事务

1
2
3
4
5
6
7
8
9
10
11
12
要么都成功,要么都失败。
开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务

例子:银行转帐业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加放到同一个事务里,要么全部执行成功,要么全部撤销,这样就保证了数据的安全性。

A:1000
B:1000

A(900) --100--> B(1100)

setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,需要手动提交事务,可以将多个SQL语句放到同一个事务中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//connection为Connection对象。
try {
connection.setAutoCommit(false);//false,开启手动提交事务

...//执行多条sql语句

connection.commit();//提交事务

} catch (Exception e) {//如果出现异常

connection.rollback();//事务回滚

}finally {

connection.close();//关闭(释放)数据库连接

}

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.qsdbl.jspdemo;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Testdemo {
@Test
public void test01() throws SQLException {
//配置信息
String url ="数据库地址";
String username = "root";
String passwd = "12345";
Connection connection = null;
//1、加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库
connection = DriverManager.getConnection(url,username,passwd);
//3、通知数据库开启事务,false,手动提交事务
connection.setAutoCommit(false);

String sql1 = "update account set money = money -100 where name = 'A'";
connection.prepareStatement(sql1).executeUpdate();
//制作错误(模拟错误)
int i = 1/0;

String sql2 = "update account set money = money +100 where name = 'B'";
connection.prepareStatement(sql2).executeUpdate();

connection.commit();//提交事务
} catch (Exception e) {//如果出现异常
connection.rollback();//事务回滚
}finally {
connection.close();//关闭(释放)数据库连接
}
}
}

数据库操作案例(JDBC)笔记见:传送门

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道