戚权20201027

知识点

jdbc

JDBC的作用

  1. 与数据库建立连接
  2. 将Java中拼写的SQL语句发送到数据库中执行
  3. 处理执行结果

JDBC在运行时的大致步骤

(1). 由 DriverManager 类驱动数据库。

(2). 由 Connection 接口负责将Java程序和数据库建立连接。

(3). 由 Statement/PreparedStatement 接口将SQL语句发送到数据库中。

(4). 由 ResultSet 接口处理数据库返回的结果集。

1DriverManager 驱动

Class.forName("com.mysql.jdbc.Driver");

2获取连接

DriverManager.getConnection("jdbc:mysql://localhost:3306/company_info","root" , "root");

  • 在MySQL中,只要不是查询就是修改。 executeUpdate:用于执行增删改 executeQuery:用于执行查询

3创建执行sql对象

Statement stat = conn.createStatement();

4定义SQL语句

String sql = "insert into users (username,password) values('lisi', '123456')";

5执行sql,返回影响行数

int rows = stat.executeUpdate(sql);

使用PreparedStatement

PreparedStatement 具有安全的优点: PreparedStatement 可以防止SQL注入。SQL注入是利用SQL语句的漏洞对数据库发送有潜在威胁的SQL语句。

高效性

事务

事务 (Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务可以是一条SQL语句,或者多条SQL语句。事务的执行是由高级编程语言编写的程序来执行的。在Java中使用JDBC操作事务。

手动提交事务

start transaction; #开启事务

commit; #提交事务

rollback; #回滚事务

如果事务中SQL语句没有问题,commit提交事务,会对数据库数据的数据进行改变。 如果事务中SQL语句有问题,rollback回滚事务,会回退到开启事务时的状态

自动提交事务

Mysql 中默认开启自动提交事务,通过修改 MySQL 全局变量"autocommit",取消自动提交事务

  • 使用SQL语句: show variables like '%commit%'; 查看MySQL是否开启自动提交事务–autocommit 值 0:OFF(关闭自动提交) 1:ON(开启自动提交)
  • 取消自动提交事务,设置自动提交的参数为OFF,执行SQL语句: set autocommit = 0;

同一个事务中所有的SQL语句执行时,必须使用同一个Connection对象。

事务原理

事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到 commit 命令才会同步到数据表中,其他任何情况都会清空事务日志( rollback ,断开连接)

回滚点

设置回滚点语法: savepoint 回滚点名字 ; 回到回滚点语法: rollback to 回滚点名字 ;

设置回滚点可以让我们在失败的时候回到回滚点,而不是回到事务开启的时候。

注意:最后不要忘了,要保存结果的话需要提交事务 Commit 。如果不想保存结果使用 rollback结束

事务的特性

事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性

原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的所有SQL语句,要么都执行,要么都不执行。原子性是事务最根本的特性。

一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态(事务前后数据的完整性必须保持一致)。一致性与原子性是密切相关的。

隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(Durability):持久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

事务隔离级别

image-20201027221826253

查询全局事务隔离级别

show variables like '%isolation%';

— 或

select @@tx_isolation;

设置事务隔离级别

set global transaction isolation level 级别字符串;

— 如:

set global transaction isolation level read uncommitted;

注意:设置完成后需要退出 MSQL 再进入 MYSQL 才能看到隔离级别的变化

脏读

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据

脏读非常危险的,比如A向B购买商品,A开启事务,向B账号转入1000块,然后打电话给B说钱已经转

了。B一查询钱到账了,发货给A。A收到货后回滚事务,B去银行取钱发现钱没了。

解决

解决脏读的方式是:将全局的隔离级别进行提升。

不可重复读

是指在一个事务内,多次读同一数据。数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)

两次查询输出的结果不同,到底哪次是对的?不知道以哪次为准。 当然是后面的为准。我们可以考虑这样一种情况,比如银行程序需要将查询结果分别输出到电脑屏幕和发短信给客户,结果在一个事务中针对不同的输出目的地进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。

解决

解决不可重复读的方式是:将全局的隔离级别进行提升为: repeatable read

总结

今天 学习了jdbc和时间,感觉挺复杂的,需要多花点时间。

标签

评论

this is is footer