существует ли способ вызвать транзакционный откат, не встречаясь с исключением?

Я пытался использовать фасет, но это не помогло. Я предоставляю код здесь, потому что он может вдохновить решение:

import altair as alt
import pandas as pd

df = pd.DataFrame({'label': ['A','A','B','B'],
               'variable': ['x', 'y', 'x', 'y'],
               'value':[2,4,3,1]})
bar = alt.Chart(df,title='My Plot').mark_bar().encode(
    alt.Y('label', axis=alt.Axis(title='Label'), 
          sort=alt.EncodingSortField(field="value", op="values", order='descending')),
    alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
    tooltip=[alt.Tooltip('label', title='Label'),
             alt.Tooltip('value:Q', format='d', title='Value'),]
).facet(
    row='variable:O'
)
bar

sort grouped bar chart

Тем не менее порядок строк ['B', 'A'] для переменных x и y. Я надеялся получить ['A', 'B] для переменной y столбчатой ​​диаграммы.

Дальнейшее развитие решения, предоставленного jakevdp, я получаю это:

selector = alt.selection_single(empty='all', fields=['label'])
base = alt.Chart(df, title='My Plot').mark_bar().encode(
    alt.Y('label', axis=alt.Axis(title='Label'), sort=alt.EncodingSortField(field="value", op="sum", order='descending')),
    alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
    color=alt.condition(selector, alt.value('orange'), alt.value('lightgray')),
    tooltip=[alt.Tooltip('label', title='Label'),
             alt.Tooltip('value:Q', format='d', title='Value'),]
).add_selection(selector)

bar = alt.vconcat(title='My Chart')
for v in df['variable'].unique():
    bar &= base.transform_filter(f"datum.variable == '{v}'").properties(title=f"'{v}'")

bar

grouped bar chart with selector and ordering per chart

38
задан Genia S. 7 May 2009 в 00:11
поделиться

4 ответа

В Spring транзакциях вы используете TransactionStatus.setRollbackOnly () .

Проблема в том, что вы используете @Transactional для разграничения транзакций. Преимущество этого заключается в том, что он не является инвазивным, но это также означает, что если вы хотите вручную взаимодействовать с контекстом транзакции, вы не можете.

Если вам нужен жесткий контроль над статусом транзакции, вы должны использовать программные транзакции а не декларативные аннотации. Это означает использование Spring TransactionTemplate или напрямую его PlatformTransactionManager. См. Раздел 9.6 справочного руководства Spring.

С помощью TransactionTemplate вы предоставляете объект обратного вызова, который реализует TransactionCallback , и код в этом обратном вызове имеет доступ к объектам TransactionStatus .

Это не так хорошо, как @Transactional , но вы получаете более точный контроль над своим статусом передачи.

24
ответ дан 27 November 2019 в 03:31
поделиться

Вызов setRollbackOnly () в SessionContext , если вы используете EJB.

Вы можете ввести SessionContext примерно так:

public MyClass {
    @Resource
    private SessionContext sessionContext;

    @Transactional(propagation = Propagation.REQUIRED, 
                   isolation = Isolation.DEFAULT, 
                   readOnly = false)
    public int saveAll(){
        //do stuff;
        if(oops == true) {
             sessionContext.setRollbackOnly();
             return;
        }
    }

setRollbackOnly () является членом EJBContext . SessionContext расширяет EJBContext : http://java.sun.com/j2ee/1.4/docs/api/javax/ejb/SessionContext.html Обратите внимание, что он доступен только в сессионных EJB-компонентах.

@Resource является стандартом Аннотация Java EE, поэтому вам, вероятно, следует проверить свою настройку в Eclipse. Вот пример того, как внедрить SessionContext, используя @Resource .

Я подозреваю, что это, вероятно, не ваше решение, поскольку кажется, что вы не работаете с EJB - - объяснение, почему Eclipse не находит @Resource .

В этом случае вам нужно будет взаимодействовать с транзакцией напрямую - см. шаблон транзакции.

15
ответ дан 27 November 2019 в 03:31
поделиться

У вас должен быть Spring для инъекции диспетчера транзакций. Затем вы можете просто вызвать для него метод отката.

3
ответ дан 27 November 2019 в 03:31
поделиться

Вызовите исключение и используйте структуру, как задумано, в противном случае не используйте декларативное управление транзакциями и следуйте советам skaffman выше. Будьте проще.

-3
ответ дан 27 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: