Java, как генерировать серийный номер/номер заказа

задняя часть
Java, как генерировать серийный номер/номер заказа

«Это 28-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."

предисловие

Сегодня я представлю вам более практическую функцию.JavaгенерироватьСерийный номер/номер заказа, чтобы перечислить еще несколько распространенных случаев в нашей жизни:

  1. номер заказа
  2. Номер продукта
  3. номер транзакции
  4. номер отслеживания

хранилище данныхя используюmysql, позвольте мне поделиться с вами, как этого добиться ~

теоретические знания

Что такое транзакция?

база данныхдела(Сокращение: транзакция) — логическая единица в процессе выполнения системы управления базами данных, которая состоит из ограниченной последовательности операций с базой данных.

Грязные чтения, неповторяемые чтения, фантомные чтения

1,грязное чтение: транзакция A изменяет данные, но еще не отправила их в базу данных. В это время, когда транзакция B обращается к данным, транзакция B не обновляет данные. Это явление называется грязным чтением.

2,неповторяемое чтение: транзакция A считывает часть данных несколько раз. В это время транзакция B изменяет данные в середине, что приводит к несогласованным результатам, считанным несколько раз транзакцией A.

3.галлюцинации: когда транзакция A дважды запрашивает один и тот же диапазон до и после, последний запрос увидит строки, которые не были видны предыдущему запросу, потому что транзакция B добавляет новую часть данных перед последним запросом.

Четыре уровня изоляции mysql

По уровню изоляции от низкого к высокому,Чем выше изоляция, тем хуже эффективность,неповторяемое чтение, это MySQLУровень изоляции по умолчанию.

Уровень изоляции транзакции грязное чтение неповторяемое чтение галлюцинации
незафиксированное чтение да да да
неповторяемое чтение (чтение-фиксация) нет да да
повторяемое чтение нет нет да
сериализуемый нет нет нет

1,читать незафиксированные: Разрешить другим транзакциям читать данные до того, как эта транзакция будет зафиксирована. Недостатки: могут возникать грязные чтения, фантомные чтения и неповторяющиеся чтения.

2,неповторяемое чтение: Проблемы будут возникать при параллельных условиях, например: пользователь А читает данные, а затем пользователь Б читает данные и изменяет их.В это время, когда пользователь А снова читает данные, обнаруживается, что два значения до и после несовместимы Недостатки: Это может привести к фантомным чтениям и неповторяющимся чтениям.

3.повторяемое чтение: при использовании уровня изоляции Repeatable Read все строки, на которые каким-либо образом ссылается транзакция, блокируются во время выполнения транзакции. Минусы: Фантомное чтение

4.сериализовать: не будет использовать механизм mysql mvcc, получать блокировку чтения при каждом запросе на выборку и пытаться получить блокировку записи при каждой операции обновления. Недостаток: худшая эффективность

Два пессимистичных замка

Общий замок (блокировка S): если транзакция T добавляет общую блокировку к данным A, другие транзакции могут добавлять только общие блокировки к A, но не эксклюзивные блокировки. Транзакции, которым предоставлена ​​общая блокировка, могут только читать данные и не могут изменять данные.

Эксклюзивный замок (X замок): если транзакция T добавляет монопольную блокировку к данным A, другие транзакции не могут добавлять блокировку любого типа к A. Транзакции, которым предоставлены эксклюзивные блокировки, могут как читать, так и изменять данные.

Реализация кода Java

private  String createNewBidNumber() {
        //格式说明 CODE20201111xxx CODE+当前年月日+编号(具体长度看需求)
        String front="CODE";//前缀
        //当前时间编码
        Date date = new Date();
        String bidDate = new SimpleDateFormat("yyyyMMdd").format(date);
        Object bidService=null;//修改为自己的业务代码
        if (bidService != null){// 在数据表中查到了,说明现在这个订单不是今天的第一单
            String bid = bidService.getXXXX(); //取出ID,也就是业务号
            bid = bid.substring(10,13); // 取出后三位数,也就是自动生成的三位数 001
            int num = Integer.valueOf(bid);
            num ++;  // 加1
            if(num<10){
                String bidNum = String.format("%03d", num);//%03d 只是三位,不足补0
                String code = front+bidDate+bidNum;
                return code;
            }
            else if(num<100){
                String bidNum = String.format("%03d", num);//num<100,说明是两位数,前面要补一个0
                String code = front+bidDate+bidNum;
                return code;
            }
            else {
                String bidNum = String.valueOf(num);
                String code =front+bidDate+bidNum;
                return code;
            }
        }else {
            int number = 1;
            String bidNum = "00" + number;
            String code = front+bidDate+bidNum;
            return code;
        }
    }

Спасибо

  1. Грязное чтение, неповторяемое чтение, фантомное чтение базы данных mysql
  2. Разберитесь с четырьмя уровнями изоляции транзакций MySQL за десять минут
  3. Уровень транзакции, разница между неповторяемыми чтениями и фантомными чтениями
  4. Грязные чтения, неповторяемые чтения, общие блокировки, пессимистические блокировки и Пять уровней изоляции транзакций
  5. Понимание MySQL Repeatable Read
  6. mysql-serializable-serialization сценарий уровня изоляции сериализации экземпляра