-- 事务,一组连续的sql语句,要么全部成功,要么全部失败回滚
-- 开启事务
BEGIN;
-- 包裹的事务体
UPDATE account SET money=money-500 WHERE name='张三';
UPDATE account SET money=money+500 WHERE name='李四';
-- 提交事务,无异常时提交
COMMIT;
-- 单条sql语句自动提交,多条需要手动
-- 查看提交方式,1代表自动提交,0代表手动提交
-- SELECT @@AUTOCOMMIT;
-- 修改提交方式
-- SET @@AUTOCOMMIT=数字;
-- 回滚,出异常时回滚
ROLLBACK;
-- 事务四特性(ACID)
-- 原子性(atomicity),事务包含的所有操作要么全部成功,要么全部失败回滚
-- 一致性(consistency),一个事务执行之前和执行之后都必须处于一致性状态
-- 隔离性(isolcation),多个并发事务之间要相互隔离
-- 持久性(durability),一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的
-- 事务四隔离级别(默认是repeatable read)
-- read uncommitted(读未提交)、read committed(读已提交)、repeatable read(可重复读)、serializable(可串行化)
-- 查询隔离级别(mysql8.0)
-- SELECT @@transaction_isolation;
-- 修改隔离级别
-- SET GLOBAL TRANSACTION ISOLATION LEVEL 事务级别;
-- 事务三问题
-- 不可复读、幻读、脏读
-- 不可复读,同一事务两次查询读取同一数据,得到的结果不一致
-- 幻读,同一事务两次查询同一范围数据,得到的结果不一致
-- 脏读,一个用户读取一个还未提交的数据
-- 索引,是一种数据结构,目的是提高检索效率
-- 索引优点,查询快
-- 索引缺点,索引越多速度越慢,占空间,需要维护
-- 唯一索引、主键索引、普通索引、复合索引和全能索引和空间索引(MySQL不支持,更改配置)
package test;
import com.mysql.cj.x.protobuf.MysqlxDatatypes;
import po.User;
import java.sql.*;
public class Demo {
public static void main(String[] args) {
//JDBC(Java Database Connectivity),java语言中规范客户端访问数据库的应用程序接口
//1.向工程中导入数据库的驱动包
Connection conn = null;
PreparedStatement pr = null;
ResultSet re = null;
try {
//2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3.创建连接 地址 用户名 密码
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "root");
//7.?占位符
String sql = "SELECT * FROM user where name=? and pass=?";
//4.预执行sql
pr = conn.prepareStatement(sql);
//8.给问号赋值
pr.setString(1,"张三");
pr.setString(2,"123");
//5.执行sql,executeUpdate执行增删改,executeQuery执行查询
//int i = pr.executeUpdate();
re = pr.executeQuery();
//.next()判断数据是否存在,取什么类型值就get什么
while(re.next()) {
String name = re.getString("NAME");
String pass = re.getString("pass");
System.out.println(name+pass);
}
}catch (Exception e) {
System.out.println("出现异常");
}finally{
//6.关流
try {
if(re != null) {
re.close();
}
if(pr != null) {
pr.close();
}
if(conn != null) {
conn.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
}