事务(以MySQL为例)

事务指逻辑上对数据库的一组操作,事务有以下四大特性:

1.原子性:事务的一组操作捆绑在一起,要么全都执行,要么都不执行
2.一致性:事务的完成使数据库从一致性状态转到一致性状态,一致性也就是指数据的正确性或者稳定的一种状态,例如A给B转账的操作中,A的余额减少但B的余额还未增多的时刻,此时数据库就没有处于一致性的状态
3.隔离性:多个并发事务之间要相互隔离,不能产生干扰
4.持久性:事务一旦被提交,数据库就会同步更新,它带来的影响就是永久性的

事务命令

1.开启事务:start transaction
2.事务回滚:rollback
3.提交事务:commit
在start transaction和commit之间的操作属于一个事务,在提交之前,如果发生了异常,数据库会自动回滚,也可以手动rollback

JDBC使用事务

1.开启事务:Connection.setAutoCommit(false);
2.事务回滚:Connection.rollback();
3.提交事务:Connection.commit();
注意有时我们不需要回滚整个事务,而是回滚部分事务,所以要设置事务回滚点:

操作1...
Savepoint sp = conn.setSavepoint();
操作2...
Conn.rollback(sp);
Conn.commit(); // 回滚后必须通知数据库提交事务

其中操作2会被回滚掉,操作1会保存下来然后被提交

事务的隔离级别

首先如果不隔离,会出现以下三种情况:
1.脏读:你读取到了其他事务已经修改但还未提交的数据(注意虽然未提交但数据库中的记录也是会改变的,只是提交之后这种操作就被完全持久化,无法通过回滚来消除)
2.不可重复读:在一个事务中,你前后两次读到的同一个数据的值不同,因为有其他事务对其进行了修改
3.幻读:在一个事务中,你对某一批数据整体进行了操作,但由于在这批数据之外有其他事务修改了数据,也可能会造成操作结果的不合理,例如你在将所有数据的状态更新为1的同时,其他事务插入了一条状态为0的数据,最后你看到的结果并不是所有数据状态都为1

加锁策略:
1.避免脏读:修改数据时加排它锁,事务提交之后释放锁
2.避免不可重复读:读数据时加共享锁,事务提交之后释放锁,当所有共享锁都释放时才可进行数据的修改
3.避免幻读:加范围锁,它是共享锁,整张表都不允许修改数据

MySQL有四种隔离级别可设置:
1.Serializable(串行化):可避免脏读、不可重复读、幻读情况的发生
2.Repeatable Read(可重复读):可避免脏读、不可重复读情况的发生
3.Read Committed(读已提交):可避免脏读情况发生
4.Read Uncommitted(读未提交):最低级别,以上情况均无法保证
MySQL默认隔离级别为Repeatable Read

设置方法:
1.全局设置
修改my.ini文件

可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

[mysqld]
transaction-isolation = REPEATABLE-READ

2.登录mysql后对当前session进行修改

set session transaction isolation level read uncommitted; // 设置当前事务隔离级别
### RPA 技术将一维列表数据插入 MySQL 数据库的方法 RPA(Robotic Process Automation)工具可以通过自动化流程实现将一维列表中的数据录入到 MySQL 数据库的功能。以下是具体的技术实现方法和代码示。 --- #### 1. **准备工作** 在开始之前,确保安装了必要的 Python 库以支持数据库连接功能。常用的库包括 `mysql-connector-python` 或 `pymysql`。如果尚未安装这些库,可通过以下命令进行安装: ```bash pip install mysql-connector-python ``` --- #### 2. **建立数据库连接** 使用 `mysql.connector.connect()` 方法创建与 MySQL 数据库的连接。在此过程中,需要提供主机地址、用户名、密码以及目标数据库名称。 ```python import mysql.connector # 定义数据库连接参数 db_config = { 'host': 'localhost', # 数据库服务器地址 'user': 'root', # 用户名 'password': 'your_password', # 密码 'database': 'test_db' # 数据库名称 } try: conn = mysql.connector.connect(**db_config) except mysql.connector.Error as err: print(f"Database connection failed: {err}") else: cursor = conn.cursor() ``` 上述代码尝试连接指定的 MySQL 数据库,并捕获可能出现的连接错误[^4]。 --- #### 3. **创建目标表** 在插入数据前,需确认目标表是否存在。如果没有,则应提前创建该表。如,假设我们要存储的名字列表对应于名为 `users` 的表,其结构如下: | 字段名 | 类型 | |--------|--------------| | id | INT (自增) | | name | VARCHAR(255) | 创建表的 SQL 查询如下: ```sql CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL ); ``` 通过 Python 执行此查询: ```python create_table_query = """ CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL ); """ cursor.execute(create_table_query) conn.commit() ``` --- #### 4. **插入一维列表数据** 假定我们有一个包含名字的一维列表 `data_list`,下面展示如何将其逐条插入到 `users` 表中。 ```python data_list = ["Alice", "Bob", "Charlie"] # 待插入的数据 # 构造预编译的SQL语句以防止SQL注入攻击 insert_stmt = "INSERT INTO users(name) VALUES (%s)" for value in data_list: try: cursor.execute(insert_stmt, (value,)) conn.commit() # 提交每次插入操作 except mysql.connector.Error as err: print(f"Failed to insert record into database: {err}") conn.rollback() # 发生错误时回滚事务 ``` 此处采用了占位符 `%s` 来绑定实际值,有效避免了因直接拼接字符串而引发的安全隐患[^1]。 --- #### 5. **关闭资源** 完成所有数据插入后,务必关闭游标和数据库连接以释放占用的系统资源。 ```python if cursor is not None: cursor.close() if conn is not None and conn.is_connected(): conn.close() ``` --- #### 6. **完整代码示** 综合以上各部分,完整的代码实现如下: ```python import mysql.connector # 数据库配置 db_config = { 'host': 'localhost', 'user': 'root', 'password': 'your_password', 'database': 'test_db' } # 建立连接 try: conn = mysql.connector.connect(**db_config) except mysql.connector.Error as err: print(f"Database connection failed: {err}") else: cursor = conn.cursor() # 创建表 create_table_query = """ CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL ); """ cursor.execute(create_table_query) conn.commit() # 插入数据 data_list = ["Alice", "Bob", "Charlie"] insert_stmt = "INSERT INTO users(name) VALUES (%s)" for value in data_list: try: cursor.execute(insert_stmt, (value,)) conn.commit() except mysql.connector.Error as err: print(f"Failed to insert record into database: {err}") conn.rollback() # 清理资源 if cursor is not None: cursor.close() if conn is not None and conn.is_connected(): conn.close() ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值