数据库事务:
我们如果要探讨Spring事务原理,那我们首先得明白什么是数据库事务,数据库事务有什么特性;
数据库事务:是由一组sql语句组成的逻辑处理单元; (说白了- 多条语句作为一个整体 进行操作的功能;
也就是说 A表新增一条记录,B表就要插入一条日志, 这两个操作是一个整体,事务可以保证 这两个sql要么都执行成功也就是都插入数据,要么都不执行也就是都不插入数据)
事务可以保证该事务下的所有操作也就是sql执行 要么都成功,要么都不成功
事务特性:具有4个属性,通常简称为事务的ACID属性;
- A:Atomicity,原子性,将所有SQL作为原子工作单元执行,原子在化学中,是最小单位,不可以再分割了.事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行。(commit/rollback)
- C:Consistency,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
- I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;并发执行的各个事务之间不能互相干扰。
- D:Durability,持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响,该修改即使出现系统故障也将一直保持。
上面我们了解了数据库事务原理,我们下面就来了解在数据库里面怎么使用
事务声明
隐式事务:我们使用的数据库连接工具对于单条SQL语句会自动将其作为一个事务帮我们提交,这种事务被称为
显式事务:要手动把多条SQL语句作为一个事务执行,
使用BEGIN
开启一个事务,
使用COMMIT
提交一个事务,
使用ROLLBACK
回滚事务,整个事务会失败(不会对数据进行修改)
BEGIN
insert ....
update ....
COMMIT/ROLLBACK
上面我们了解了数据库事务,下面我们就来了解在spring中如何使用事务
spring中使用事务
要了解spring中使用事务,我们首先要知道jdbc怎么操作事务的
jdbc中使用事务:
注意:JDBC对事务的处理规则,必须是基于同一个Connection,也就是保证是同一个连接Connection,才可以做事务控制
JDBC提供了3个方法来进行事务管理
-
setAutoCommit() 设置自动提交,方法中需要传入一个boolean类型的参数,true为自动提交,false为手动提交
-
commit() 提交事务
-
rollback() 回滚事务
static Connection getConnect() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql?characterEncoding=utf-8","root", "root");
}
static void connect() throws SQLException {
Connection connection = null;
try {
connection = getConnect(); //获取一个连接Connection
/**
* 默认都是自动提交,包括我们的一些查询工具,都是默认帮我们提交的
*/
connection.setAutoCommit(false);//关闭自动提交
Statement statement = connection.createStatement();
//业务处理
statement.execute("insert into my_user values(4,'jack',28);");
statement.execute("insert into my_user values(5,'tonny',28);");
int i = 1/0; //这里抛异常,比如我们执行日志的时候可能报错,我们就要回滚数据。
//所以事务回滚,
connection.commit(); //事务提交,以上的操作都会执行
} catch (Exception e) {
e.printStackTrace();
try {
connection.rollback(); //事务回滚,就不会执行插入语句
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
会继续更新奥.........................................................................................................................🙂