• MYSQL 基本操作 (3)


    事务

    事务是用来保证执行过程中遇到问题的时候,会自动把前面SQL执行的效果进行还原,恢复如初。

    开启事务:

    1. start transaction;
    2. 开启事务
    3. (在执行多条SQL语句之后)
    4. rollback/commit;
    5. 回滚或者提交。

    事务的四特性

    原子性

    事务的根本所在(事务存在的意义)。能够把多个SQL打包成一个整体,要么全部执行完,要么一个都不执行(执行过程中遇到错误自动回滚)。

    一致性

    事务在执行的前后,数据可以对得上,是一致的状态。

    持久性

    事务进行的改动都是写到硬盘里的,不会随着程序重启或者主机重启而丢失。

    隔离性

    多个事务在并发执行的时候,事务之间可以保持距离间隔,互不干扰。

    日常公司中经常会遇到的问题:

    脏读问题:读脏数据,脏数据可以理解为一个临时的数据,不代表最终结果。

    例如同学B读到了同学A提交的不同的数据。

    解决方案:

    进行写操作加锁。

    在写操作前,和同学的读操作是完全并发的,此时并发性最高,隔离性最低。

    在写操作后,此时并发性最低,隔离性最高,因此提升了准确性。

    不可重复读问题:在一个事务中多次读取一个数据发现不一样,数据被人修改了。是同一个数据下。

    解决方案:

    读加锁。

    引入读加锁后并发程度进一步降低,隔离性又提高了。

    幻读问题:没有影响当前正在读的数据,但是更改了其他的数据,例如同学A读到了同学B的代码的时候,同学B此时修改了另外代码的内容。

    解决方案:

    串行化,此时并发程度最低,效率降最低,隔离性提高,数据的准确性提高。 

    对此,mysql提供了四个隔离级别的档位,来根据需求选择不同的档位:
     

    1. read uncommitted
    2. 只允许读未提交的数据,并发程度提高,隔离性降低,可能存在脏读,幻读,不可重复读等问题。
    3. read committed
    4. 只能读提交之后的数据,相当于写加锁,并发程度降低,隔离性提高,解决了脏读问题但没解决其他问题
    5. repeatable read
    6. 相当于读和写都加锁了,并发程度进一步降低,隔离性再提高。解决了除幻读以外的问题。
    7. serializable
    8. 严格执行串行化,并发程度降低,隔离性最高。解决了幻读,不可重复读,脏读等问题。

    连接idea和mysql的代码格式:

    1. /**
    2. * Created with IntelliJ IDEA.
    3. * Description:
    4. * User: admin
    5. * Date: 2022-11-28
    6. * Time: 11:05
    7. */
    8. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    9. import com.sun.xml.internal.bind.v2.model.core.ID;
    10. import javax.naming.Name;
    11. import javax.sql.DataSource;
    12. import java.sql.Connection;
    13. import java.sql.PreparedStatement;
    14. import java.sql.SQLException;
    15. import java.util.Scanner;
    16. public class JDBC {
    17. //使用JDBC来操作数据库
    18. //在java105的student表中插入数据
    19. public static void main(String[] args) throws SQLException {
    20. //创建数据源对象,这一步描述了要操作的对象是啥,在哪里,如果找不到MysqlDataSource()对象就说明包导入失败。
    21. DataSource dataSource = new MysqlDataSource();
    22. //其中前面的Datasource来源于JDBC里面的一个接口,而后面的则来源于Mysql的驱动包,也就是导入的jar包。
    23. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3307/java105?characterEncoding=utf8&useSSL=false");
    24. ((MysqlDataSource)dataSource).setUser("root");
    25. ((MysqlDataSource)dataSource).setPassword("123456");
    26. //jdbc是协议名称,然后是ip地址,端口号,要访问的数据库,客户端使用的字符集,是否加密。
    27. //接下来设置用户名和密码
    28. //setURL不是Datasource里面的,所以使用时要转成子类。
    29. //datasource是服务于各种数据库的,例如mysqldatasource服务于mysql,
    30. //mysql这个客户端服务器的程序使用url来描述服务器的位置。
    31. //写成dataSource.setURL();也是可以的,但是不结合多态和向下转型就会导致项目耦合度提高,从而增加未来更换数据库的工作量。
    32. //耦合性就是各部分之间的关联强度,耦合性高也就是关联度高。
    33. //内聚就是把有关联的代码写到一块去。
    34. //url是唯一资源指定符(uniform resource locotor)
    35. //建立连接
    36. Connection connection = dataSource.getConnection();
    37. //这里的connection需要使用java编译器的。
    38. //System.out.println(connection);
    39. //用于检查是否连接成功。
    40. //如果报错,可能是URL连接或者密码问题等诸多因素。
    41. //构造要执行的SQL语句
    42. String sql = "insert into student values(?,? )";
    43. //或者可以通过用户输入的数据来确定输入的值。
    44. Scanner scanner = new Scanner(System.in);
    45. System.out.println("请输入要插入的学号");
    46. int id = scanner.nextInt();
    47. System.out.println("请输入要插入的名字");
    48. String name = scanner.next();
    49. // String sql = "insert into student values(" + id + " ,' " + name + " ')";
    50. PreparedStatement statement = connection.prepareStatement(sql);
    51. statement.setInt(1,id);
    52. statement.setString(2, name);
    53. System.out.println(" statement " + statement);
    54. //执行语句之后,先通过预处理操作构成对象,变成一个预处理的语句
    55. /*在进行执行SQL语句
    56. executeUpate 对应插入删除修改语句
    57. executeQuery 对应查询语句
    58. */
    59. int n = statement.executeUpdate();
    60. //n表示这次sql操作影响的行数。executeupdate的返回值就是影响的函数,而executequery返回的是一个临时表。
    61. //ResultSet resultSet = statement.executeQuery();
    62. System.out.println(n);
    63. //以上之后,关闭释放相关资源。因为前面构建的语句对象和连接对象都是需要消耗资源。
    64. statement.close();
    65. connection.close();
    66. //注意,释放资源的顺序要和申请资源的顺序想法,先创建的后释放,后创建的先释放。
    67. }
    68. }

  • 相关阅读:
    DolphinScheduler 进阶(工作流传参)
    day 1 学习MySQL数据库
    java ssm超市库存管理系统
    一次redis主从切换导致的数据丢失与陷入只读状态故障
    SRP:单一职责原则
    使用pyinstaller打包Python程序
    Chrome跨域访问网络请求Cookies丢失的解决办法
    XTU OJ 1464 黑子的鸡脚(说人话)
    WebGPU 计算管线、计算着色器(通用计算)入门案例:2D 物理模拟
    Spring Boot——日志文件
  • 原文地址:https://blog.csdn.net/qq_64054032/article/details/128041163