作者: 欢迎观看我的文章, 注定了我们今生有缘分! 我已从事Java开发教育十多年, 怀着教书育人的情怀, 正在让更多的同学们少走弯路, 改变千万IT人的命运!
期待同学动动你的小手给'霈哥'点赞、加关注、分享给更多的朋友共同学习交流, 每天持续更新离不开你的支持! 3Q
欢迎关注我的B站,可观看本文章配套视频~~~
欢迎关注我的公众号,获取更多资料~~~
学习目标
- 能够在MySQL中使用事务
- 能够在JDBC中使用事务
- 能够在DBUtils中使用事务
第一章 事务操作
- 事务: 指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
- 事务作用:保证在一个事务中多次SQL操作要么全都成功,要么全都失败.
1.1 mysql事务操作
sql语句 | 描述 |
---|---|
start transaction | 开启事务 |
commit | 提交事务 |
rollback | 回滚事务 |
- 准备数据
# 创建账号表
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
# 初始化数据
insert into account values (null,'jack',10000);
insert into account values (null,'rose',10000);
insert into account values (null,'tom',10000);
- 操作
- MYSQL中可以有两种方式进行事务的管理:
- 自动提交:MySql默认自动提交。即执行一条sql语句提交一次事务。
- 手动提交:先开启,再提交
- MYSQL中可以有两种方式进行事务的管理:
- 手动提交
start transaction;
update account set money=money-1000 where name='jack';
update account set money=money+1000 where name='rose';
commit;
#或者
rollback;
1.2 jdbc事务操作
Connection 对象的方法名 | 描述 |
---|---|
conn.setAutoCommit(false) | 开启事务 |
conn.commit() | 提交事务 |
conn.rollback() | 回滚事务 |
代码演示
/*
JDBC 的事务操作
*/
public class TransactionDemo {
/*
1.获得连接
2.开始事务
3. 具体的sql操作(加钱, 减钱)
4. 提交事务
5.如果出现异常, 回滚事务
6.释放资源
*/
@Test
public void test1() throws SQLException {
Connection conn = null;
try {
// 1.获得连接
conn = DruidUtils.getConnetion();
//2.开始事务
conn.setAutoCommit(false);
//3. 具体的sql操作(加钱, 减钱)
//减钱
String sql = "update account set money=money-? where name=?";
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.setDouble(1,1000);
pstat.setString(2,"jack");
pstat.executeUpdate();
//模拟错误
//int n = 1/0;
//加钱
sql = "update account set money=money+? where name=?";
PreparedStatement pstat2 = conn.prepareStatement(sql);
pstat2.setDouble(1,1000);
pstat2.setString(2,"rose");
pstat2.executeUpdate();
// 4. 提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//5.如果出现异常, 回滚事务
conn.rollback();
}
}
}
1.3 DBUtils事务操作
Connection对象的方法名 | 描述 |
---|---|
conn.setAutoCommit(false) | 开启事务 |
new QueryRunner() | 创建核心类,不设置数据源(手动管理连接) |
query(conn , sql , handler, params ) 或 update(conn, sql , params) | 手动传递连接, 执行SQL语句CRUD |
DbUtils.commitAndCloseQuietly(conn) | 提交并关闭连接,不抛异常 |
DbUtils.rollbackAndCloseQuietly(conn) | 回滚并关闭连接,不抛异常 |
代码演示
/*
DBUtils 的事务操作
*/
public class TransactionDemo2 {
/*
1.获得连接
2.开始事务
3.具体的sql操作(加钱, 减钱)
4.提交事务 ,释放资源
5.如果出现异常, 回滚事务释放资源
*/
@Test
public void test1() throws SQLException {
Connection conn = null;
try {
//1.获得连接
conn = DruidUtils.getConnetion();
// 2.开始事务
conn.setAutoCommit(false);
// 3.具体的sql操作(加钱, 减钱)
QueryRunner qr = new QueryRunner();
//减钱
String sql = "update account set money=money-? where name=?";
qr.update(conn, sql, 1000, "jack");
//模拟错误
int n =1/0;
//加钱
sql = "update account set money=money+? where name=?";
qr.update(conn, sql, 1000, "rose");
//4.提交事务 ,释放资源
DbUtils.commitAndCloseQuietly(conn);
} catch (Exception e) {
e.printStackTrace();
//5.如果出现异常, 回滚事务释放资源
DbUtils.rollbackAndCloseQuietly(conn);
}
}
}