学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
20【JDBC的事务处理】
1.1 JDBC的事务处理
之前我们是使用MySQL的命令来操作事务。接下来我们使用JDBC来操作银行转账的事务。
- 数据准备:
CREATE TABLE account (
id INT PRIMARY KEY AUTO\_INCREMENT,
name VARCHAR(10),
money double
);
-- 添加数据
INSERT INTO account (name, money) VALUES ('a', 1000), ('b', 1000);
select \* from account;
1.1.1 事务相关API
- Connection中事务相关方法如下:
方法名 | 描述 |
---|---|
boolean getAutoCommit() | 获取本次连接是否自动提交事务,默认true |
void setAutoCommit(boolean autoCommit) | 设置本次连接是否自动提交事务 |
void commit() | 提交事务 |
void rollback() | 回滚事务 |
int getTransactionIsolation() | 获取事务的隔离级别 |
void setTransactionIsolation(int level) | 设置事务的隔离级别 |
Savepoint setSavepoint() | 设置事务保存点 |
void rollback(Savepoint savepoint) | 回滚到保存点 |
1.1.2 案例测试
1)模拟转账业务
- 示例代码:
package com.dfbz.demo;
import com.dfbz.utils.JdbcUtils;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/\*\*
\* @author lscl
\* @version 1.0
\* @intro:
\*/
public class Demo15\_事务 {
/\*\*
\* 模拟事务
\* @throws Exception
\*/
@Test
public void test1() throws Exception{
//创建连接对象
Connection conn = null;
Statement stmt = null;
try {
conn = JdbcUtils.getConnection();
// 设置事务不要自动提交(手动提交,默认情况下,事务是自动提交的)
conn.setAutoCommit(false);
//创建语句对象
stmt = conn.createStatement();
//a扣钱
stmt.executeUpdate("update account set money=money-500 where name='a'");
// 模拟异常
// System.out.println(100 / 0);
// b加钱
stmt.executeUpdate("update account set money=money+500 where name='b'");
// 提交事务
conn.commit();
System.out.println("转账成功");
} catch (Exception e) {
try {
// 回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("转账失败");
} finally {
JdbcUtils.close(conn, stmt);
}
}
}
2)事务隔离级别
Connection中有如下静态常量来规定隔离级别:
- TRANSACTION_READ_UNCOMMITTED(1):读未提交
- TRANSACTION_READ_COMMITTED(2):读已提交
- TRANSACTION_REPEATABLE_READ(4):可重复读
- TRANSACTION_SERIALIZABLE(8):串行化
测试代码:
/\*\*
\* 测试隔离级别
\*
\* @throws Exception
\*/
@Test
public void test2() throws Exception {
Connection conn = JdbcUtils.getConnection();
//创建语句对象
Statement stmt = conn.createStatement();
/\*
TRANSACTION\_READ\_UNCOMMITTED(1): 读未提交
TRANSACTION\_READ\_COMMITTED(2): 读已提交
TRANSACTION\_REPEATABLE\_READ(4): 可重复读
TRANSACTION\_SERIALIZABLE(8): 串行化
\*/
// 将本次连接的隔离级别设置为读未提交
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
/\*
先在其他窗口创建一个事务修改数据但不提交,
然后再断点执行下面代码,
看下是否能查询到其他事务没提交的数据
\*/
ResultSet rs = stmt.executeQuery("select \* from account");
while (rs.next()) {
String name = rs.getString("name");
double money = rs.getDouble("money");
System.out.println("name: " + name);
System.out.println("money: " + money);
}
JdbcUtils.close(conn, stmt);
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!