【DRP】【SQL】-悲观锁-防止多用户同时操作时出现脏数据

 1     /**
 2      * 根据表名生成该表的序列
 3      * @param tableName
 4      * @return 返回生成的序列
 5      */
 6     //全局方法 -加锁
 7     //public static synchronized int generate(String tableName) {
 8     //局部成员方法-加锁
 9     //public synchronized int generate(String tableName) {
10         //synchronized(this) {
11     public static int generate(String tableName) {
12         //使用数据库的悲观锁for update
13         String sql = "select value from t_table_id where table_name=? for update";
14         Connection conn = null;
15         PreparedStatement pstmt = null;
16         ResultSet rs = null;
17         int value = 0;
18         try {
19             conn = DbUtil.getConnection();
20             //开始事务
21             DbUtil.beginTransaction(conn);
22             pstmt = conn.prepareStatement(sql);
23             pstmt.setString(1, tableName);
24             rs = pstmt.executeQuery();
25             if (!rs.next()) {
26                 throw new RuntimeException();
27             }
28             value = rs.getInt("value");
29             value++; //自加
30             modifyValueField(conn, tableName, value);
31             //提交事务
32             DbUtil.commitTransaction(conn);
33         }catch(Exception e) {
34             e.printStackTrace();
35             //回滚事务
36             DbUtil.rollbackTransaction(conn);
37             throw new RuntimeException();
38         }finally {
39             DbUtil.close(rs);
40             DbUtil.close(pstmt);
41             DbUtil.resetConnection(conn); //重置Connection的状态
42             DbUtil.close(conn);
43         }
44         return value;
45     }

总结:不断提高自己编程效率!

时间: 2024-11-19 06:56:17

【DRP】【SQL】-悲观锁-防止多用户同时操作时出现脏数据的相关文章

Replicate_Do_DB 参数发现跨库操作时从库数据不更新

问题:使用复制是设置  Replicate_Do_DB 参数发现跨库操作时从库数据不更新 1 设置从库的 replicate_do_db = test 2 主库的sql语句是跨库的insert    在test7 上插入数据到test.a 的表上. use test7; 3 主库数据更新后查看从库信息发现数据并没有插入 4 原因是mysql 在执行sql前检查的当前默认库,所以跨库的sql语句不会被执行. 解决方案: 1 使用参数   replicate-wild-ignore-table =t

MyBatis进行insert操作时不能将数据插入到数据库

MyBatis进行数据库增删改查时,明明表里有数据却查不出结果,同样主键的数据可以多次插表成功但是其实并未真正插入到表里,经过几次尝试,发现问题在于MyBatis_config.xml文件的transactionManager属性配置不正确,将type从JDBC改到MANAGED则可正常操作.公司的电脑则需要将MANAGED改为JDBC才可以正常操作. 查看了下transactionManager属性的说明,MANAGED是不会自动提交和回滚的,原因还在进一步查明中,先记下来. <?xml ve

事务的乐观锁和悲观锁

Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍. 借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作.本篇我们就来介绍一下这个子句的用法和功能. 从for update子句的语法状态图中,我们可以看出该子句分为两个部分:加锁范围子句和加锁行为子句.下面我们分别针对两个方面的进行介绍. 加锁范围子

SSM(十五) 乐观锁与悲观锁的实际应用

SSM(十五) 乐观锁与悲观锁的实际应用 前言 随着互联网的兴起,现在三高(高可用.高性能.高并发)项目是越来越流行. 本次来谈谈高并发.首先假设一个业务场景:数据库中有一条数据,需要获取到当前的值,在当前值的基础上+10,然后再更新回去.如果此时有两个线程同时并发处理,第一个线程拿到数据是10,+10=20更新回去.第二个线程原本是要在第一个线程的基础上再+20=40,结果由于并发访问取到更新前的数据为10,+20=30. 这就是典型的存在中间状态,导致数据不正确.来看以下的例子: 并发所带来

乐观锁(optimistic locking)与悲观锁(pessimistic locking)

首先,乐观锁(optimistic locking)与悲观锁(pessimistic locking)基本是针对数据处理来说,也就是跟数据库有关的术语,目的是为了解决并发处理时所遇到的相关性能问题,以避免数据丢失更新. 悲观锁(pessimistic locking):指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态,以保证操作最大程度的独占性,当然也就给数据库增加了大量开销降低了性能.一般依靠数据库提供的锁

线程同步--悲观锁

在做数据库访问的时候,遇到了这样的问题:两个线程同时访问同一对象中的方法,那么就可能会引发数据不一致的问题,那么我们需要做的,就是加上锁. 第一种方案:Synchronized Java中用来给对象和方法或者代码加锁的,当他锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行该代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只有一个线程得到,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 用法:Synchronized 加入方法上和S

悲观锁和乐观锁使用场景

乐观锁是在应用层加锁,而悲观锁是在数据库层加锁(for update) 乐观锁顾名思义就是在操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚. 悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其先锁住,让别人用不了,我操作完成后再释放掉. 悲观锁需要数据库级别上的的实现,程序中是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大地降低. 一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁. 如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚

php使用数据库的并发问题(乐观锁与悲观锁)

在php与数据库的交互中,如果并发量大,并且都去进行数据库的修改的话,就有一个问题需要注意.数据的锁问题.就会牵扯数据库的事务跟隔离机制 数据库事务依照不同的事务隔离级别来保证事务的ACID特性,也就是说事务不是一开启就能解决所有并发问题.通常情况下,这里的并发操作可能带来四种问题: 更新丢失:一个事务的更新覆盖了另一个事务的更新,这里出现的就是丢失更新的问题. 脏读:一个事务读取了另一个事务未提交的数据. 不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致. 幻象读:一个事务两次读取

乐观锁和悲观锁的区别和使用场合

一:乐观锁(Optimistic Lock) 每次获取数据的时候,都不会担心数据会被修改,所以每次获取数据时都不会进行加锁. 但是在更新数据的时候,需要判断该数据是否被别人修改过,如果数据被其他线程修改过,则不进行数据更新. 如果数据没有被其他线程修改,则进行数据更新.由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作. 二:悲观锁(Pessimistic Lock) 每次获取数据的时候,都会担心数据会被修改,所以每次获取数据的时候都会进行加锁, 确保在自己使用的过程中数据不被别人修改,